annotate +scheme/Burgers1d.m @ 1196:f6c571d8f22f feature/rv

Add option to discretize Burgers1d using quasi-linear form
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 07 Aug 2019 13:28:21 +0200
parents 635386c073b9
children 433c89bf19e0
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
1196
f6c571d8f22f Add option to discretize Burgers1d using quasi-linear form
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1153
diff changeset
34 case 'quasi-linear'
f6c571d8f22f Add option to discretize Burgers1d using quasi-linear form
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1153
diff changeset
35 obj.D = @(v) -((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 '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
37 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
38 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
39 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
40 end
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
41 else
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
42 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
43 switch pde_form
1196
f6c571d8f22f Add option to discretize Burgers1d using quasi-linear form
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1153
diff changeset
44 case 'quasi-linear'
f6c571d8f22f Add option to discretize Burgers1d using quasi-linear form
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1153
diff changeset
45 obj.D = @(v) -(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
46 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
47 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
48 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
49 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
50 end
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
51 end
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
52 obj.grid = g;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 obj.H = ops.H;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 obj.Hi = ops.HI;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
56
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 obj.e_l = ops.e_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 obj.e_r = ops.e_r;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
59
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
60 obj.m = m;
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
61 obj.h = ops.h;
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
62 obj.order = order;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
65 % 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
66 % 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
67 % 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
68 % 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
69 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
70 default_arg('type','dirichlet');
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
71 [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
72 switch type
1148
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
73 % 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
74 % with +- at left/right boundaries
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
75 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
76 % tau = s*e;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
77 % 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
78 % penalty = -obj.Hi*tau;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
79
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
80 magnitude = 2/3;
0a5503a08a36 Implement the correct Dirichlet conditions for Burgers1d
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1038
diff changeset
81 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
82 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
83 penalty = @(v) -tau(v);
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
84 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
85 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
86 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
87 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
89 % 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
90 % 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
91 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
92 switch boundary
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
93 case {'l','L','left','Left'}
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 e = obj.e_l;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
95 index = 1;
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
96 s = -1;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
97 case {'r','R','right','Right'}
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
98 e = obj.e_r;
1038
8537fdd6830a Use opSets in Burgers1d.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1035
diff changeset
99 index = length(e);
853
cda996e64925 Minor renaming and clean up
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 852
diff changeset
100 s = 1;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
101 otherwise
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
102 error('No such boundary: boundary = %s',boundary);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
103 end
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 [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
107 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
108 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
109
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
110 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
111 N = obj.grid.m;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
112 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
113 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
114 end