Mercurial > repos > public > sbplib
diff +scheme/Burgers2d.m @ 1154:3108963cc42c feature/rv
Improve efficiency of diffOps in Burgers2d, the artificial diffusion operator in rv.constructDiffOps and the RungekuttaExteriorRv time-steppers
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Wed, 06 Mar 2019 09:45:52 +0100 |
parents | 1fe48cbd379a |
children | 336ee37a0617 |
line wrap: on
line diff
--- a/+scheme/Burgers2d.m Tue Mar 05 10:57:26 2019 +0100 +++ b/+scheme/Burgers2d.m Wed Mar 06 09:45:52 2019 +0100 @@ -47,25 +47,28 @@ if (isequal(opSet,@sbp.D1Upwind)) Dx = kron((ops_x.Dp + ops_x.Dm)/2,Iy); Dy = kron(Ix,(ops_y.Dp + ops_y.Dm)/2); - DissOpx = kron((ops_x.Dm - ops_x.Dp)/2,Iy); - DissOpy = kron(Ix,(ops_y.Dm - ops_y.Dp)/2); + DissOpx = kron((ops_x.Dp - ops_x.Dm)/2,Iy); + DissOpy = kron(Ix,(ops_y.Dp - ops_y.Dm)/2); D1 = Dx + Dy; switch pde_form case 'skew-symmetric' + D = -1/3*D1 switch length(fluxSplitting) case 1 DissOp = DissOpx + DissOpy; - obj.D = @(v) -(1/3*D1*v.*v + (1/3*spdiag(v)*D1 + fluxSplitting{1}(v)*DissOp)*v); + obj.D = @(v) D*(v.*v) + (spdiags(v,0,m_tot,m_tot)*D + fluxSplitting{1}(v)*DissOp)*v; case 2 - obj.D = @(v) -(1/3*D1*v.*v + (1/3*spdiag(v)*D1 + fluxSplitting{1}(v)*DissOpx + fluxSplitting{2}(v)*DissOpy)*v); + obj.D = @(v) D*(v.*v) + (spdiags(v,0,m_tot,m_tot)*D + fluxSplitting{1}(v)*DissOpx + fluxSplitting{2}(v)*DissOpy)*v; end case 'conservative' + D = -1/2*D1; switch length(fluxSplitting) case 1 DissOp = DissOpx + DissOpy; - obj.D = @(v) -(1/2*D1*v.*v + fluxSplitting{1}(v)*DissOp*v); + % TODO: Check if we can use fluxSplitting{1} here instead + obj.D = @(v) D*(v.*v) + max(abs(v))*DissOp*v; case 2 - obj.D = @(v) -(1/2*D1*v.*v + (fluxSplitting{1}(v)*DissOpx + fluxSplitting{2}(v)*DissOpy)*v); + obj.D = @(v) D*(v.*v) + (fluxSplitting{1}(v)*DissOpx + fluxSplitting{2}(v)*DissOpy)*v; end end @@ -75,9 +78,11 @@ D1 = Dx + Dy; switch pde_form case 'skew-symmetric' - obj.D = @(v) -(1/3*D1*v.*v + 1/3*spdiag(v)*D1*v); + D = -1/3*D1 + obj.D = @(v) D*(v.*v) + spdiags(v,0,m_tot,m_tot)*D*v; case 'conservative' - obj.D = @(v) -1/2*D1*v.*v; + D = -1/2*D1; + obj.D = @(v) D*(v.*v); end end @@ -103,14 +108,11 @@ case {'D', 'd', 'dirichlet', 'Dirichlet'} magnitude = 2/3; - tau = @(v) s*magnitude*obj.Hi*e*H_b*spdiag((v(index)-s*abs(v(index)))/2); - closure = @(v) tau(v)*v(index); + Tau = s*magnitude*obj.Hi*e*H_b/2; + m = length(index); + tau = @(v) Tau*spdiags((v(index)-s*abs(v(index))),0,m,m); + closure = @(v) Tau*((v(index)-s*abs(v(index))).*v(index)); penalty = @(v) -tau(v); - - - % tau = s*e*H_b; - % closure = @(v) (obj.Hi*tau)*(((v(index)-s*abs(v(index)))/3).*v(index)); - % penalty = -obj.Hi*tau; otherwise error('No such boundary condition: type = %s',type); end