comparison +rv/+diffops/constructDiffOps.m @ 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 e3d8f24b2c1c
children 79618b58b0a0
comparison
equal deleted inserted replaced
1183:27f3b173dcfa 1184:ecc605453733
1 function diffOpsStruct = constructDiffOps(method, varargin) 1 function diffOpsStruct = constructDiffOps(method, varargin)
2 switch method 2 switch method
3 case {'bdf','backwards-difference-formula'} 3 case {'standard'}
4 diffOpsStruct = rv.diffops.constructDiffOpsBdf(varargin{:}); 4 diffOpsStruct = diffOpsStandard(varargin{:});
5 case {'ms','multi-stage'} 5 case {'bdf','backwards-difference-formula'}
6 diffOpsStruct = rv.diffops.constructDiffOpsMultiStage(varargin{:}); 6 diffOpsStruct = diffOpsBdf(varargin{:});
7 case {'mg','multi-grid'} 7 case {'ms','multi-stage'}
8 diffOpsStruct = rv.diffops.constructDiffOpsMultiGrid(varargin{:}); 8 diffOpsStruct = diffOpsMultiStage(varargin{:});
9 case {'mg1','multi-grid1'}
10 diffOpsStruct = diffOpsMultiGrid1(varargin{:});
11 case {'mg2','multi-grid2'}
12 diffOpsStruct = diffOpsMultiGrid2(varargin{:});
13 end
9 end 14 end
15
16 function diffOpsStruct = diffOpsStandard(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
17 % DiffOps for stabilized solution vector
18 [D_scheme, penalties_scheme, D_t] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
19 %% DiffOps for residual viscosity
20 D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
21 D_flux = @(v) -D_flux(v);
22 diffOpsStruct = struct('D_scheme', D_scheme,...
23 'D_flux', D_flux,...
24 'D_t', D_t,...
25 'penalties_scheme', penalties_scheme);
26 end
27
28 function diffOpsStruct = diffOpsBdf(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
29 %% DiffOps for solution vector
30 [D_scheme, penalties_scheme, ~] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
31 %% DiffOps for residual viscosity
32 [D_flux, ~] = rv.diffops.constructFluxDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
33 D_flux = @(v) -D_flux(v);
34 diffOpsStruct = struct('D_scheme', D_scheme,...
35 'D_flux', D_flux,...
36 'penalties_scheme', penalties_scheme);
37 end
38
39 function diffOpsStruct = diffOpsMultiStage(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
40 % DiffOps for stabilized solution vector
41 [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
42 % DiffOp for unstabilized solution vector
43 D_unstable = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs);
44 %% DiffOps for residual viscosity
45 [D_t, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
46 D_flux = @(v) -D_t(v);
47 diffOpsStruct = struct('D_scheme', D_scheme,...
48 'D_unstable', D_unstable,...
49 'D_flux', D_flux,...
50 'D_t', D_t,...
51 'penalties_scheme', penalties_scheme,...
52 'penalties_res', penalties_res);
53 end
54
55 function diffOpsStruct = diffOpsMultiGrid1(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
56 % DiffOps for stabilized solution vector
57 [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
58 % DiffOp for unstabilized solution vector
59 D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
60 %% DiffOps for residual viscosity
61 [D_flux, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
62 D_flux = @(v) -D_flux(v);
63 D_t = @(v) D(v);
64 diffOpsStruct = struct('D_scheme', D_scheme,...
65 'D_coarse', D_coarse,...
66 'D_flux', D_flux,...
67 'D_t', D_t,...
68 'penalties_scheme', penalties_scheme,...
69 'penalties_res', penalties_res);
70 end
71
72 function diffOpsStruct = diffOpsMultiGrid2(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
73 % DiffOps for stabilized solution vector
74 [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs);
75 % TODO: What orders to use here?
76 D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
77 %% DiffOps for residual viscosity
78 D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs);
79 D_flux = @(v) -D_flux(v);
80 D_t = @(v) D_coarse(v);
81 diffOpsStruct = struct('D_scheme', D_scheme,...
82 'D_flux', D_flux,...
83 'D_t', D_t,...
84 'penalties_scheme', penalties_scheme);
85 end
86
87 % TODO: Only works for equidistant grids
88 function D_coarse = coarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs)
89 m = g.m();
90 lim = g.lim();
91 m_coarse = (m-1)/2 + 1;
92 g_coarse = grid.equidistant(m_coarse, lim{1});
93 D_coarse = rv.diffops.constructFluxDiffOpWithClosures(scheme, g_coarse, schemeOrder, schemeParams, opSet, BCs);
94 x = g.x{1};
95 x_coarse = x(1:2:end);
96 % TODO: Fix interpolation
97 D_coarse = @(v) interp1(x_coarse,D_coarse(v(1:2:end)),x,'spline');
98 end