annotate +scheme/Burgers1d.m @ 1153:635386c073b9 feature/rv

Fix bug in Burgers schemes resulting in incorrect wave speed.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Tue, 05 Mar 2019 10:57:26 +0100
parents 0a5503a08a36
children f6c571d8f22f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1034
2676ad79f994 Rename Burgers1D to Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 853
diff changeset
1 classdef Burgers1d < scheme.Scheme
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 properties
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
3 m % Number of points in each direction, possibly a vector
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
4 h % Grid spacing
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
5 grid % Grid
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 order % Order accuracy for the approximation
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
7
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
8 H % Discrete norm
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
9 D
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
10
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
11 D1
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
12 Hi
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 e_l
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 e_r
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 methods
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
18 function obj = Burgers1d(g, order, pde_form, fluxSplitting, opSet)
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
19 default_arg('opSet',@sbp.D2Standard);
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
20 default_arg('fluxSplitting',@(v)max(abs(v)));
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
21 assertType(g, 'grid.Cartesian');
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
22
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
23 m = g.size();
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
24 xl = g.getBoundary('l');
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
25 xr = g.getBoundary('r');
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
26 xlim = {xl, xr};
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
27
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
28 ops = opSet(m, xlim, order);
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
29
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
30 if (isequal(opSet, @sbp.D1Upwind))
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
31 obj.D1 = (ops.Dp + ops.Dm)/2;
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
32 DissOp = (ops.Dm - ops.Dp)/2;
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
33 switch pde_form
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
34 case 'skew-symmetric'
1153
635386c073b9 Fix bug in Burgers schemes resulting in incorrect wave speed.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1148
diff changeset
35 obj.D = @(v) -(1/3*obj.D1*(v.*v) + (1/3*spdiag(v)*obj.D1 + fluxSplitting(v)*DissOp)*v);
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
36 case 'conservative'
1153
635386c073b9 Fix bug in Burgers schemes resulting in incorrect wave speed.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1148
diff changeset
37 obj.D = @(v) -(1/2*obj.D1*(v.*v) + fluxSplitting(v)*DissOp*v);
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
38 end
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
39 else
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
40 obj.D1 = ops.D1;
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
41 switch pde_form
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
42 case 'skew-symmetric'
1153
635386c073b9 Fix bug in Burgers schemes resulting in incorrect wave speed.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1148
diff changeset
43 obj.D = @(v) -(1/3*obj.D1*(v.*v) + 1/3*spdiag(v)*obj.D1*v);
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
44 case 'conservative'
1153
635386c073b9 Fix bug in Burgers schemes resulting in incorrect wave speed.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1148
diff changeset
45 obj.D = @(v) -1/2*obj.D1*(v.*v);
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
46 end
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
47 end
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
48 obj.grid = g;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 obj.H = ops.H;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 obj.Hi = ops.HI;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
52
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 obj.e_l = ops.e_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 obj.e_r = ops.e_r;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
55
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
56 obj.m = m;
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
57 obj.h = ops.h;
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
58 obj.order = order;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
61 % Closure functions return the operators applied to the own doamin to close the boundary
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
62 % Penalty functions return the operators to force the solution. In the case of an interface it returns the operator applied to the other domain.
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 % type is a string specifying the type of boundary condition if there are several.
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
65 function [closure, penalty] = boundary_condition(obj, boundary, type)
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
66 default_arg('type','dirichlet');
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
67 [e, index, s] = obj.get_boundary_ops(boundary);
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 switch type
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
69 % Stable dirchlet-like boundary conditions (u+-abs(u))*u/3
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
70 % with +- at left/right boundaries
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
71 case {'D', 'd', 'dirichlet', 'Dirichlet'}
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
72 % tau = s*e;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
73 % closure = @(v) obj.Hi*tau*(((v(index)-s*abs(v(index)))/3)*v(index));
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
74 % penalty = -obj.Hi*tau;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
75
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
76 magnitude = 2/3;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
77 tau = @(v) s*magnitude*obj.Hi*e*(v(index)-s*abs(v(index)))/2;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
78 closure = @(v) tau(v)*v(index);
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
79 penalty = @(v) -tau(v);
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
81 error('No such boundary condition: type = %s',type);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
85 % Returns the boundary ops, boundary index and sign for the boundary specified by the string boundary.
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
86 % The right boundary is considered the positive boundary
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
87 function [e, index, s] = get_boundary_ops(obj,boundary)
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 switch boundary
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
89 case {'l','L','left','Left'}
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90 e = obj.e_l;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
91 index = 1;
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
92 s = -1;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
93 case {'r','R','right','Right'}
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 e = obj.e_r;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
95 index = length(e);
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
96 s = 1;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
97 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
98 error('No such boundary: boundary = %s',boundary);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
99 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
100 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
101
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
102 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
103 error('An interface function does not exist yet');
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
104 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
105
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
106 function N = size(obj)
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
107 N = obj.grid.m;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
108 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
109 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
110 end