Mercurial > repos > public > sbplib
diff +rv/+diffops/constructSymmetricD2.m @ 1163:65a577db5ca0 feature/rv
Move all functions in constructDiffOps to subpackage and refactor
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Thu, 27 Jun 2019 11:04:34 +0200 |
parents | +rv/constructDiffOps.m@856bd6291d17 |
children | 433c89bf19e0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/+rv/+diffops/constructSymmetricD2.m Thu Jun 27 11:04:34 2019 +0200 @@ -0,0 +1,54 @@ +function D2 = constructSymmetricD2(g, order, opSet) + m = g.size(); + ops = cell(g.D(),1); + I = cell(g.D(),1); + for i = 1:g.D() + lim = {g.x{i}(1), g.x{i}(end)}; + ops{i} = opSet(m(i), lim, order); + I{i} = speye(m(i)); + end + + switch g.D() + case 1 + e_r = ops{1}.e_r; + e_l = ops{1}.e_l; + Hi = ops{1}.HI; + B = e_r*e_r' - e_l*e_l'; + if isequal(opSet,@sbp.D1Upwind) + Dm = ops{1}.Dm; + Dp = ops{1}.Dp; + M = Dm - Hi*B; + D2 = @(Viscosity) M*Viscosity*Dp; + else + % TODO: Fix closure for D2Variable + % TODO: Fix Viscosity not being vector + D2 = @(Viscosity)ops{1}.D2(diag(Viscosity)); + end + case 2 + % TODO: + % Currently only implemented for upwind operators. + % Remove this part once the time-dependent D2 operator is implemented for other opSets + % or if it is decided that it should only be supported for upwind operators. + assert(isequal(opSet,@sbp.D1Upwind)) + e_e = kron(ops{1}.e_r,I{2}); + e_w = kron(ops{1}.e_l,I{2}); + Dm_x = kron(ops{1}.Dm,I{2}); + Dp_x = kron(ops{1}.Dp,I{2}); + H_x = kron(ops{1}.HI,I{2}); + B_x = e_e*e_e' - e_w*e_w'; + M_x = Dm_x-H_x*B_x; + D2_x = @(Viscosity) M_x*Viscosity*Dp_x; + + e_n = kron(I{1},ops{2}.e_r); + e_s = kron(I{1},ops{2}.e_l); + Dm_y = kron(I{1},ops{2}.Dm); + Dp_y = kron(I{1},ops{2}.Dp); + H_y = kron(I{1},ops{2}.HI); + B_y = e_n*e_n' - e_s*e_s'; + M_y = Dm_y-H_y*B_y; + D2_y = @(Viscosity) M_y*Viscosity*Dp_y; + D2 = @(Viscosity) D2_x(Viscosity) + D2_y(Viscosity); + otherwise + error('3D not yet implemented') + end +end \ No newline at end of file