diff +scheme/Burgers1d.m @ 1148:0a5503a08a36 feature/rv

Implement the correct Dirichlet conditions for Burgers1d
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 24 Jan 2019 09:01:10 +0100
parents 8537fdd6830a
children 635386c073b9
line wrap: on
line diff
--- a/+scheme/Burgers1d.m	Sat Jan 19 17:22:09 2019 +0100
+++ b/+scheme/Burgers1d.m	Thu Jan 24 09:01:10 2019 +0100
@@ -30,30 +30,23 @@
             if (isequal(opSet, @sbp.D1Upwind))
                 obj.D1 = (ops.Dp + ops.Dm)/2;
                 DissOp = (ops.Dm - ops.Dp)/2;
+                switch pde_form
+                    case 'skew-symmetric'
+                        obj.D = @(v) -(1/3*obj.D1*v.*v + (1/3*spdiag(v)*obj.D1  + fluxSplitting(v)*DissOp)*v);
+                    case 'conservative'
+                        obj.D = @(v) -(1/2*obj.D1*v.*v + fluxSplitting(v)*DissOp*v);
+                end
             else 
                 obj.D1 = ops.D1;
+                switch pde_form
+                    case 'skew-symmetric'
+                        obj.D = @(v) -(1/3*obj.D1*v.*v + 1/3*spdiag(v)*obj.D1*v);
+                    case 'conservative'
+                        obj.D = @(v) -1/2*obj.D1*v.*v;
+                end
             end
-            
-            switch pde_form
-                case 'skew-symmetric'
-                    if (isequal(opSet, @sbp.D1Upwind))
-                        D = @(v) -(1/3*obj.D1*v.*v + (1/3*spdiag(v)*obj.D1  + fluxSplitting(v)*DissOp)*v);
-                    else
-                        D = @(v) -(1/3*obj.D1*v.*v + 1/3*spdiag(v)*obj.D1*v);
-                    end
-                case 'conservative'
-                    if (isequal(opSet, @sbp.D1Upwind))
-                        D = @(v) -(1/2*obj.D1*v.*v + fluxSplitting(v)*DissOp*v);
-                    else
-                        D = @(v) -(1/2*obj.D1*v.*v);
-                    end
-                otherwise
-                    error('Not supported', pde_form);
-            end
-
             obj.grid = g;
 
-            obj.D = D;
             obj.H =  ops.H;
             obj.Hi = ops.HI;
 
@@ -70,14 +63,20 @@
         %       boundary            is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
         %       type                is a string specifying the type of boundary condition if there are several.
         function [closure, penalty] = boundary_condition(obj, boundary, type)
-            default_arg('type','robin');
+            default_arg('type','dirichlet');
             [e, index, s] = obj.get_boundary_ops(boundary);
             switch type
-                % Stable dirhclet-like boundary conditions ((u+-abs(u))*u/3)) with +- at left/right boundary
+                % Stable dirchlet-like boundary conditions (u+-abs(u))*u/3
+                % with +- at left/right boundaries
                 case {'D', 'd', 'dirichlet', 'Dirichlet'}
-                    tau = s*e;
-                    closure = @(v) obj.Hi*tau*(((v(index)-s*abs(v(index)))/3)*v(index));
-                    penalty = -obj.Hi*tau;
+                    % tau = s*e;
+                    % closure = @(v) obj.Hi*tau*(((v(index)-s*abs(v(index)))/3)*v(index));
+                    % penalty = -obj.Hi*tau;
+
+                    magnitude = 2/3;
+                    tau = @(v) s*magnitude*obj.Hi*e*(v(index)-s*abs(v(index)))/2;
+                    closure = @(v) tau(v)*v(index);
+                    penalty = @(v) -tau(v);
                 otherwise
                     error('No such boundary condition: type = %s',type);
             end