changeset 1184:ecc605453733 feature/rv

Move specialized constructDiffOps* into constructDiffOps.m. Add multigrid RV using the standard RungekuttaRV time stepper
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Fri, 05 Jul 2019 17:51:11 +0200
parents 27f3b173dcfa
children abb1b3ab8c23
files +rv/+diffops/constructDiffOps.m +rv/+diffops/constructDiffOpsBdf.m +rv/+diffops/constructDiffOpsMultiGrid.m +rv/+diffops/constructDiffOpsMultiStage.m
diffstat 4 files changed, 96 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
diff -r 27f3b173dcfa -r ecc605453733 +rv/+diffops/constructDiffOps.m
--- a/+rv/+diffops/constructDiffOps.m	Fri Jul 05 17:48:54 2019 +0200
+++ b/+rv/+diffops/constructDiffOps.m	Fri Jul 05 17:51:11 2019 +0200
@@ -1,9 +1,98 @@
 function diffOpsStruct = constructDiffOps(method, varargin)
-	switch method
-	case {'bdf','backwards-difference-formula'}
-		diffOpsStruct = rv.diffops.constructDiffOpsBdf(varargin{:});
-	case {'ms','multi-stage'}
-		diffOpsStruct = rv.diffops.constructDiffOpsMultiStage(varargin{:});
-	case {'mg','multi-grid'}
-		diffOpsStruct = rv.diffops.constructDiffOpsMultiGrid(varargin{:});
+    switch method
+        case {'standard'}
+            diffOpsStruct = diffOpsStandard(varargin{:});
+        case {'bdf','backwards-difference-formula'}
+            diffOpsStruct = diffOpsBdf(varargin{:});
+        case {'ms','multi-stage'}
+            diffOpsStruct = diffOpsMultiStage(varargin{:});
+        case {'mg1','multi-grid1'}
+            diffOpsStruct = diffOpsMultiGrid1(varargin{:});
+        case {'mg2','multi-grid2'}
+            diffOpsStruct = diffOpsMultiGrid2(varargin{:});
+    end
+end
+
+function diffOpsStruct = diffOpsStandard(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
+    % DiffOps for stabilized solution vector
+    [D_scheme, penalties_scheme, D_t] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    %% DiffOps for residual viscosity
+    D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    D_flux = @(v) -D_flux(v);
+    diffOpsStruct = struct('D_scheme', D_scheme,...
+                     'D_flux', D_flux,...
+                     'D_t', D_t,...
+                     'penalties_scheme', penalties_scheme);
+end
+
+function diffOpsStruct = diffOpsBdf(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
+    %% DiffOps for solution vector
+    [D_scheme, penalties_scheme, ~] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    %% DiffOps for residual viscosity
+    [D_flux, ~] = rv.diffops.constructFluxDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    D_flux = @(v) -D_flux(v);
+    diffOpsStruct = struct('D_scheme', D_scheme,...
+                 'D_flux', D_flux,...
+                 'penalties_scheme', penalties_scheme);
+end
+
+function diffOpsStruct = diffOpsMultiStage(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
+    % DiffOps for stabilized solution vector
+    [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    % DiffOp for unstabilized solution vector
+    D_unstable = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    %% DiffOps for residual viscosity
+    [D_t, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    D_flux = @(v) -D_t(v);
+    diffOpsStruct = struct('D_scheme', D_scheme,...
+                     'D_unstable', D_unstable,...
+                     'D_flux', D_flux,...
+                     'D_t', D_t,...
+                     'penalties_scheme', penalties_scheme,...
+                     'penalties_res', penalties_res);
+end
+
+function diffOpsStruct = diffOpsMultiGrid1(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
+    % DiffOps for stabilized solution vector
+    [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    % DiffOp for unstabilized solution vector
+    D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    %% DiffOps for residual viscosity
+    [D_flux, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    D_flux = @(v) -D_flux(v);
+    D_t = @(v) D(v);
+    diffOpsStruct = struct('D_scheme', D_scheme,...
+                     'D_coarse', D_coarse,...
+                     'D_flux', D_flux,...
+                     'D_t', D_t,...
+                     'penalties_scheme', penalties_scheme,...
+                     'penalties_res', penalties_res);
+end
+
+function diffOpsStruct = diffOpsMultiGrid2(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
+    % DiffOps for stabilized solution vector
+    [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    % TODO: What orders to use here?
+    D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
+    %% DiffOps for residual viscosity
+    D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs);
+    D_flux = @(v) -D_flux(v);
+    D_t = @(v) D_coarse(v);
+    diffOpsStruct = struct('D_scheme', D_scheme,...
+                     'D_flux', D_flux,...
+                     'D_t', D_t,...
+                     'penalties_scheme', penalties_scheme);
+end
+
+% TODO: Only works for equidistant grids
+function D_coarse = coarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs)
+    m = g.m();
+    lim = g.lim();
+    m_coarse = (m-1)/2 + 1;
+    g_coarse = grid.equidistant(m_coarse, lim{1});
+    D_coarse = rv.diffops.constructFluxDiffOpWithClosures(scheme, g_coarse, schemeOrder, schemeParams, opSet, BCs);
+    x = g.x{1};
+    x_coarse = x(1:2:end);
+    % TODO: Fix interpolation
+    D_coarse = @(v) interp1(x_coarse,D_coarse(v(1:2:end)),x,'spline');
 end
\ No newline at end of file
diff -r 27f3b173dcfa -r ecc605453733 +rv/+diffops/constructDiffOpsBdf.m
--- a/+rv/+diffops/constructDiffOpsBdf.m	Fri Jul 05 17:48:54 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-function diffOpsStruct = constructDiffOpsBdf(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
-    %% DiffOps for solution vector
-    [D_scheme, penalties_scheme, ~] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
-    %% DiffOps for residual viscosity
-    [D_flux, ~] = rv.diffops.constructFluxDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
-    D_flux = @(v) -D_flux(v);
-    diffOpsStruct = struct('D_scheme', D_scheme,...
-                 'D_flux', D_flux,...
-                 'penalties_scheme', penalties_scheme);
-end
\ No newline at end of file
diff -r 27f3b173dcfa -r ecc605453733 +rv/+diffops/constructDiffOpsMultiGrid.m
--- a/+rv/+diffops/constructDiffOpsMultiGrid.m	Fri Jul 05 17:48:54 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-function diffOpsStruct = constructDiffOpsMultiGrid(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
-    % DiffOps for stabilized solution vector
-    [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
-    % DiffOp for unstabilized solution vector
-    D_coarse = constructCoarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
-    %% DiffOps for residual viscosity
-    [D_t, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
-    D_flux = @(v) -D_t(v);
-    diffOpsStruct = struct('D_scheme', D_scheme,...
-                     'D_coarse', D_coarse,...
-                     'D_flux', D_flux,...
-                     'D_t', D_t,...
-                     'penalties_scheme', penalties_scheme,...
-                     'penalties_res', penalties_res);
-end
-
-% TODO: Only works for equidistant grids
-function D_coarse = constructCoarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs)
-    m = g.m();
-    lim = g.lim();
-    m_coarse = (m-1)/2 + 1;
-    g_coarse = grid.equidistant(m_coarse, lim{1});
-    D_coarse = rv.diffops.constructFluxDiffOpWithClosures(scheme, g_coarse, schemeOrder, schemeParams, opSet, BCs);
-    x = g.x{1};
-    x_coarse = x(1:2:end);
-    % TODO: Fix interpolation
-    D_coarse = @(v) interp1(x_coarse,D_coarse(v(1:2:end)),x,'spline');
-end
\ No newline at end of file
diff -r 27f3b173dcfa -r ecc605453733 +rv/+diffops/constructDiffOpsMultiStage.m
--- a/+rv/+diffops/constructDiffOpsMultiStage.m	Fri Jul 05 17:48:54 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-function diffOpsStruct = constructDiffOpsMultiStage(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
-    % DiffOps for stabilized solution vector
-    [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
-    % DiffOp for unstabilized solution vector
-    D_unstable = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs);
-    %% DiffOps for residual viscosity
-    [D_t, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
-    D_flux = @(v) -D_t(v);
-    diffOpsStruct = struct('D_scheme', D_scheme,...
-                     'D_unstable', D_unstable,...
-                     'D_flux', D_flux,...
-                     'D_t', D_t,...
-                     'penalties_scheme', penalties_scheme,...
-                     'penalties_res', penalties_res);
-end
\ No newline at end of file