annotate +scheme/Burgers1D.m @ 833:9f4c45a2d271 feature/burgers1d

Support narrow stencil operators of order 6
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Tue, 11 Sep 2018 16:29:00 +0200
parents 5573913a0949
children f1f0bf087e1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 classdef Burgers1D < scheme.Scheme
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 properties
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
3 grid % Physical grid
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 order % Order accuracy for the approximation
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
5
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
6 params
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 D % Non-stabalized scheme operator
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9 M % Derivative norm
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 H % Discrete norm
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 Hi % Norm inverse
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 e_l
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 e_r
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 d_l
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 d_r
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 methods
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
19 function obj = Burgers1D(grid, pde_form, operator_type, order, params)
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
20 assert(grid.D == 1);
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
21 assert(grid.size() == length(params.eps));
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
22 m = grid.size();
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
23 h = grid.scaling();
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
24 lim = grid.lim{1}; % Ugly, and only applicable for cartesian grids.
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
25 default_arg('pde_form','skew-symmetric');
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
26 default_arg('operator_type','narrow');
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
27
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
28 switch operator_type
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
29 case 'narrow'
833
9f4c45a2d271 Support narrow stencil operators of order 6
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 832
diff changeset
30 ops = sbp.D4Variable(m, lim, order);
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
31 D1 = ops.D1;
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
32 D2 = ops.D2;
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
33 otherwise
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
34 error('Other operator types not yet supported', operator_type);
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
35 end
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
36
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
37 switch pde_form
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
38 case 'skew-symmetric'
831
d0934d1143b7 Fix bug in initialization of differential operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 815
diff changeset
39 D = @(v, viscosity) -1/3*v.*D1*v - 1/3*D1*v.^2 + D2(params.eps + viscosity)*v;
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
40 case 'conservative'
831
d0934d1143b7 Fix bug in initialization of differential operators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 815
diff changeset
41 D = @(v, viscosity) -1/2*D1*v.^2 + D2(params.eps + viscosity)*v;
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
42 end
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43
832
5573913a0949 Merged with default, and updated +scheme/Burgers1D accordingly
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 831
diff changeset
44 obj.grid = grid;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 obj.order = order;
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
46 obj.params = params;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
48 %% TODO: Figure out how to evaluate viscosity as viscosity(v,t) here instead of parametrizing D on the viscosity.
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
49 obj.D = D;
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 obj.M = ops.M;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 obj.H = ops.H;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 obj.Hi = ops.HI;
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;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 obj.d_l = ops.d1_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 obj.d_r = ops.d1_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 end
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 % Closure functions return the opertors applied to the own doamin to close the boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other domain.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 % 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
62 % type is a string specifying the type of boundary condition if there are several.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 % data is a function returning the data that should be applied at the boundary.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 % neighbour_scheme is an instance of Scheme that should be interfaced to.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 % neighbour_boundary is a string specifying which boundary to interface to.
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 function [closure, penalty] = boundary_condition(obj,boundary,type,data)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
67 default_arg('type','robin');
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 default_arg('data',0);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
69 [e, s, d] = obj.get_boundary_ops(boundary);
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70 switch type
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 % Stable robin-like boundary conditions ((u+-abs(u))*u/3 - eps*u_x)) with +- at left/right boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 case {'R','robin'}
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73 p = s*obj.Hi*e;
815
fae41958af4f Add support for artificial viscosity to the 1d burgers scheme.
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents: 814
diff changeset
74 closure = @(v, viscosity) p*(e'*((v-s*abs(v))/3)*(e'*v) - e'*(obj.params.eps + viscosity)*d'*v);
814
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 switch class(data)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76 case 'double'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
77 penalty = s*p*data;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 case 'function_handle'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 penalty = @(t) s*p*data(t);
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('Wierd data argument!')
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 % Unknown, boundary condition
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
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 % Ruturns the boundary ops and sign for the boundary specified by the string boundary.
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
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91 function [e, s, d] = get_boundary_ops(obj,boundary)
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
92 switch boundary
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
93 case 'l'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 e = obj.e_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
95 s = -1;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
96 d = obj.d_l;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
97 case 'r'
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
98 e = obj.e_r;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
99 s = 1;
3a5e635a93fd Add scheme for 1D Burgers equation
Vidar Stiernstrom <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
100 d = obj.d_r;
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