comparison +rv/+diffops/constructDiffOps.m @ 1224:5271c4670733 feature/rv

Use fine-to-coarse interpolation operators in coarse grid flux discretization
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 06 Nov 2019 14:51:33 +0100
parents 881afc40a3d2
children
comparison
equal deleted inserted replaced
1197:433c89bf19e0 1224:5271c4670733
92 lim = g.lim(); 92 lim = g.lim();
93 m_c = (m-1)/2 + 1; 93 m_c = (m-1)/2 + 1;
94 switch g.D() 94 switch g.D()
95 case 1 95 case 1
96 interpOps = sbp.InterpOpsOP(m_c, m, schemeOrder, schemeOrder); 96 interpOps = sbp.InterpOpsOP(m_c, m, schemeOrder, schemeOrder);
97 I = interpOps.Iu2v.good; 97 IC2F = interpOps.Iu2v.good;
98 IF2C = interpOps.Iv2u.good;
98 g_c = grid.equidistant(m_c, lim{1}); 99 g_c = grid.equidistant(m_c, lim{1});
99 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs); 100 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
100 D_c = @(v) I*D_c(v(1:2:end)); 101 D_c = @(v) IC2F*D_c(IF2C*v);
101 case 2 102 case 2
102 interpOps_x = sbp.InterpOpsOP(m_c(1), m(1), schemeOrder, schemeOrder); 103 interpOps_x = sbp.InterpOpsOP(m_c(1), m(1), schemeOrder, schemeOrder);
103 I_x = interpOps_x.Iu2v.good; 104 I_xC2F = interpOps_x.Iu2v.good;
105 I_xF2C = interpOps_x.Iv2u.good;
104 interpOps_y = sbp.InterpOpsOP(m_c(2), m(2), schemeOrder, schemeOrder); 106 interpOps_y = sbp.InterpOpsOP(m_c(2), m(2), schemeOrder, schemeOrder);
105 I_y = interpOps_y.Iu2v.good; 107 I_yC2F = interpOps_y.Iu2v.good;
106 I = kron(I_x,I_y); 108 I_yF2C = interpOps_y.Iv2u.good;
109 IC2F = kron(I_xC2F,I_yC2F);
110 IF2C = kron(I_xF2C,I_yF2C);
107 g_c = grid.equidistant(m_c, lim{1}, lim{2}); 111 g_c = grid.equidistant(m_c, lim{1}, lim{2});
108 ind = grid.funcToMatrix(g, 1:g.N()); 112 ind = grid.funcToMatrix(g, 1:g.N());
109 ind_c = reshape(ind(1:2:end,1:2:end)',g_c.N(),1); 113 ind_c = reshape(ind(1:2:end,1:2:end)',g_c.N(),1);
110 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs); 114 D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
111 D_c = @(v) I*D_c(v(ind_c)); 115 D_c = @(v) IC2F*D_c(IF2C*v);
112 end 116 end
113 end 117 end
114 118
115 function D_c = coarserGridDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs) 119 function D_c = coarserGridDiffOpWithClosures(scheme, g, schemeOrder, schemeParams, opSet, BCs)
116 m = g.m(); 120 m = g.m();