comparison +rv/+diffops/constructDiffOps.m @ 1190:79618b58b0a0 feature/rv

Refactor constructDiffops and remove closures from some of the diffops used to compute the residual.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 08 Jul 2019 15:12:19 +0200
parents ecc605453733
children 881afc40a3d2
comparison
equal deleted inserted replaced
1189:6cb03209f0a7 1190:79618b58b0a0
13 end 13 end
14 end 14 end
15 15
16 function diffOpsStruct = diffOpsStandard(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs) 16 function diffOpsStruct = diffOpsStandard(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
17 % DiffOps for stabilized solution vector 17 % DiffOps for stabilized solution vector
18 [D_scheme, penalties_scheme, D_t] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs); 18 [D_scheme, penalties_scheme, D_t] = rv.diffops.constructSchemeDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
19 %% DiffOps for residual viscosity 19 %% DiffOps for residual viscosity
20 D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs); 20 D_flux = rv.diffops.constructFluxDiffOps(scheme, g, residualOrder, schemeParams, opSet, BCs);
21 D_flux = @(v) -D_flux(v); 21 D_flux = @(v) -D_flux(v);
22 diffOpsStruct = struct('D_scheme', D_scheme,... 22 diffOpsStruct = struct('D_scheme', D_scheme,...
23 'D_flux', D_flux,... 23 'D_flux', D_flux,...
24 'D_t', D_t,... 24 'D_t', D_t,...
25 'penalties_scheme', penalties_scheme); 25 'penalties_scheme', {penalties_scheme});
26 end 26 end
27 27
28 function diffOpsStruct = diffOpsBdf(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs) 28 function diffOpsStruct = diffOpsBdf(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
29 %% DiffOps for solution vector 29 %% DiffOps for solution vector
30 [D_scheme, penalties_scheme, ~] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs); 30 [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
31 %% DiffOps for residual viscosity 31 %% DiffOps for residual viscosity
32 [D_flux, ~] = rv.diffops.constructFluxDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs); 32 D_flux = rv.diffops.constructFluxDiffOps(scheme, g, residualOrder, schemeParams, opSet, BCs);
33 D_flux = @(v) -D_flux(v); 33 D_flux = @(v) -D_flux(v);
34 diffOpsStruct = struct('D_scheme', D_scheme,... 34 diffOpsStruct = struct('D_scheme', D_scheme,...
35 'D_flux', D_flux,... 35 'D_flux', D_flux,...
36 'penalties_scheme', penalties_scheme); 36 'penalties_scheme', {penalties_scheme});
37 end 37 end
38 38
39 % TODO: Remove?
39 function diffOpsStruct = diffOpsMultiStage(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs) 40 function diffOpsStruct = diffOpsMultiStage(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
40 % DiffOps for stabilized solution vector 41 % DiffOps for stabilized solution vector
41 [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs); 42 [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
42 % DiffOp for unstabilized solution vector 43 % DiffOp for unstabilized solution vector
43 D_unstable = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs); 44 [D_unstable, closures] = rv.diffops.constructFluxDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
45 D_unstable = rv.diffops.addClosuresToDiffOp(D_unstable, closures);
44 %% DiffOps for residual viscosity 46 %% DiffOps for residual viscosity
45 [D_t, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs); 47 D_t = rv.diffops.constructFluxDiffOps(scheme, g, residualOrder, schemeParams, opSet, BCs);
46 D_flux = @(v) -D_t(v); 48 D_flux = @(v) -D_t(v);
49 % TODO: Use residual penalties as well here?
47 diffOpsStruct = struct('D_scheme', D_scheme,... 50 diffOpsStruct = struct('D_scheme', D_scheme,...
48 'D_unstable', D_unstable,... 51 'D_unstable', D_unstable,...
49 'D_flux', D_flux,... 52 'D_flux', D_flux,...
50 'D_t', D_t,... 53 'D_t', D_t,...
51 'penalties_scheme', penalties_scheme,... 54 'penalties_scheme', {penalties_scheme});
52 'penalties_res', penalties_res);
53 end 55 end
54 56
55 function diffOpsStruct = diffOpsMultiGrid1(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs) 57 function diffOpsStruct = diffOpsMultiGrid1(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
56 % DiffOps for stabilized solution vector 58 % DiffOps for stabilized solution vector
57 [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs); 59 [D_scheme, penalties_scheme, D_f] = rv.diffops.constructSchemeDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
58 % DiffOp for unstabilized solution vector 60 % DiffOp for unstabilized solution vector
59 D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs); 61 D_coarse = coarserGridDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs);
60 %% DiffOps for residual viscosity 62 %% DiffOps for residual viscosity
61 [D_flux, penalties_res] = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, residualOrder, schemeParams, opSet, BCs); 63 D_flux = rv.diffops.constructFluxDiffOps(scheme, g, residualOrder, schemeParams, opSet, BCs);
62 D_flux = @(v) -D_flux(v); 64 D_flux = @(v) -D_flux(v);
63 D_t = @(v) D(v); 65 D_t = @(v) D_f(v);
66 % TODO: Use residual penalties as well here?
64 diffOpsStruct = struct('D_scheme', D_scheme,... 67 diffOpsStruct = struct('D_scheme', D_scheme,...
65 'D_coarse', D_coarse,... 68 'D_coarse', D_coarse,...
66 'D_flux', D_flux,... 69 'D_flux', D_flux,...
67 'D_t', D_t,... 70 'D_t', D_t,...
68 'penalties_scheme', penalties_scheme,... 71 'penalties_scheme', {penalties_scheme});
69 'penalties_res', penalties_res);
70 end 72 end
71 73
72 function diffOpsStruct = diffOpsMultiGrid2(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs) 74 function diffOpsStruct = diffOpsMultiGrid2(scheme, g, schemeOrder, residualOrder, schemeParams, opSet, BCs)
73 % DiffOps for stabilized solution vector 75 % DiffOps for stabilized solution vector
74 [D_scheme, penalties_scheme, D] = rv.diffops.constructSchemeDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs); 76 [D_scheme, penalties_scheme] = rv.diffops.constructSchemeDiffOps(scheme, g, schemeOrder, schemeParams, opSet, BCs);
75 % TODO: What orders to use here? 77 % TODO: What orders to use here?
76 D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs); 78 D_coarse = coarserGridDiffOp(scheme, g, residualOrder, schemeParams, opSet, BCs);
77 %% DiffOps for residual viscosity 79 %% DiffOps for residual viscosity
78 D_flux = rv.diffops.constructFluxDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs); 80 D_flux = rv.diffops.constructFluxDiffOps(scheme, g, schemeOrder , schemeParams, opSet, BCs);
79 D_flux = @(v) -D_flux(v); 81 D_flux = @(v) -D_flux(v);
80 D_t = @(v) D_coarse(v); 82 D_t = @(v) D_coarse(v);
81 diffOpsStruct = struct('D_scheme', D_scheme,... 83 diffOpsStruct = struct('D_scheme', D_scheme,...
82 'D_flux', D_flux,... 84 'D_flux', D_flux,...
83 'D_t', D_t,... 85 'D_t', D_t,...
84 'penalties_scheme', penalties_scheme); 86 'penalties_scheme', {penalties_scheme});
87 end
88 %% Multigrid functions:
89 % TODO: Implement properly.
90 function v_c = coarse_v(g, g_c, v)
91 V = grid.funcToMatrix(g,v);
92 v_c = reshape(V(1:2:end,1:2:end)',g_c.N(),1);
85 end 93 end
86 94
87 % TODO: Only works for equidistant grids 95 % Note: Only works for equidistant grids.
88 function D_coarse = coarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs) 96 % TODO: Change from using matlabs interp to using proper interpolation operators..
97 function D_c = coarserGridDiffOp(scheme, g, schemeOrder, schemeParams, opSet, BCs)
89 m = g.m(); 98 m = g.m();
90 lim = g.lim(); 99 lim = g.lim();
91 m_coarse = (m-1)/2 + 1; 100 m_c = (m-1)/2 + 1;
92 g_coarse = grid.equidistant(m_coarse, lim{1}); 101 switch g.D()
93 D_coarse = rv.diffops.constructFluxDiffOpWithClosures(scheme, g_coarse, schemeOrder, schemeParams, opSet, BCs); 102 case 1
94 x = g.x{1}; 103 g_c = grid.equidistant(m_c, lim{1});
95 x_coarse = x(1:2:end); 104 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
96 % TODO: Fix interpolation 105 x = g.x{1};
97 D_coarse = @(v) interp1(x_coarse,D_coarse(v(1:2:end)),x,'spline'); 106 x_c = x(1:2:end);
107 D_c = @(v) interp1(x_c,D_c(v(1:2:end)),x,'spline');
108 case 2
109 g_c = grid.equidistant(m_c, lim{1}, lim{2});
110 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
111 D_c = @(v) reshape(interp2(grid.funcToMatrix(g_c,D_c(coarse_v(g,g_c,v))),'spline')',g.N(),1);
112 end
98 end 113 end
114
115 function D_c = coarserGridDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs)
116 m = g.m();
117 lim = g.lim();
118 m_c = (m-1)/2 + 1;
119 switch g.D()
120 case 1
121 g_c = grid.equidistant(m_c, lim{1});
122 [D_c, closures] = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
123 D_c = rv.diffops.addClosuresToDiffOp(D_c, closures);
124 x = g.x{1};
125 x_c = x(1:2:end);
126 D_c = @(v) interp1(x_c,D_c(v(1:2:end)),x,'spline');
127 case 2
128 g_c = grid.equidistant(m_c, lim{1}, lim{2});
129 [D_c, closures] = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
130 D_c = rv.diffops.addClosuresToDiffOp(D_c, closures);
131 D_c = @(v) reshape(interp2(grid.funcToMatrix(g_c,D_c(coarse_v(g,g_c,v))),'spline')',g.N(),1);
132 end
133 end
134