changeset 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 433c89bf19e0
children 68ee061639a1
files +rv/+diffops/constructDiffOps.m
diffstat 1 files changed, 10 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/+rv/+diffops/constructDiffOps.m	Wed Aug 07 15:23:42 2019 +0200
+++ b/+rv/+diffops/constructDiffOps.m	Wed Nov 06 14:51:33 2019 +0100
@@ -94,21 +94,25 @@
     switch g.D()
         case 1
             interpOps = sbp.InterpOpsOP(m_c, m, schemeOrder, schemeOrder);
-            I = interpOps.Iu2v.good;
+            IC2F = interpOps.Iu2v.good;
+            IF2C = interpOps.Iv2u.good;
             g_c = grid.equidistant(m_c, lim{1});
             D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
-            D_c = @(v) I*D_c(v(1:2:end));
+            D_c = @(v) IC2F*D_c(IF2C*v);
         case 2
             interpOps_x = sbp.InterpOpsOP(m_c(1), m(1), schemeOrder, schemeOrder);
-            I_x = interpOps_x.Iu2v.good;
+            I_xC2F = interpOps_x.Iu2v.good;
+            I_xF2C = interpOps_x.Iv2u.good;
             interpOps_y = sbp.InterpOpsOP(m_c(2), m(2), schemeOrder, schemeOrder);
-            I_y = interpOps_y.Iu2v.good;
-            I = kron(I_x,I_y);
+            I_yC2F = interpOps_y.Iu2v.good;
+            I_yF2C = interpOps_y.Iv2u.good;
+            IC2F = kron(I_xC2F,I_yC2F);
+            IF2C = kron(I_xF2C,I_yF2C);
             g_c = grid.equidistant(m_c, lim{1}, lim{2});
             ind = grid.funcToMatrix(g, 1:g.N());
             ind_c = reshape(ind(1:2:end,1:2:end)',g_c.N(),1);
             D_c = rv.diffops.constructFluxDiffOps(scheme, g_c, schemeOrder, schemeParams, opSet, BCs);
-            D_c = @(v) I*D_c(v(ind_c));
+            D_c = @(v) IC2F*D_c(IF2C*v);
     end
 end