annotate +scheme/Laplace1d.m @ 1037:2d7ba44340d0 feature/burgers1d

Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Fri, 18 Jan 2019 09:02:02 +0100
parents cab047de7f5d
children 2b1b944deae1 c12b84fe9b00
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
950
cab047de7f5d Rename *2D schemes to *2d
Jonatan Werpers <jonatan@werpers.com>
parents: 946
diff changeset
1 classdef Laplace1d < scheme.Scheme
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 properties
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
3 grid
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 order % Order accuracy for the approximation
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 D % non-stabalized scheme operator
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 H % Discrete norm
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 M % Derivative norm
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
9 a
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 D2
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 Hi
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13 e_l
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 e_r
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
15 d_l
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
16 d_r
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 gamm
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20 methods
950
cab047de7f5d Rename *2D schemes to *2d
Jonatan Werpers <jonatan@werpers.com>
parents: 946
diff changeset
21 function obj = Laplace1d(grid, order, a)
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
22 default_arg('a', 1);
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
23
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
24 assertType(grid, 'grid.Cartesian');
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
25
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
26 ops = sbp.D2Standard(grid.size(), grid.lim{1}, order);
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
28 obj.D2 = sparse(ops.D2);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
29 obj.H = sparse(ops.H);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
30 obj.Hi = sparse(ops.HI);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
31 obj.M = sparse(ops.M);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
32 obj.e_l = sparse(ops.e_l);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
33 obj.e_r = sparse(ops.e_r);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
34 obj.d_l = -sparse(ops.d1_l);
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
35 obj.d_r = sparse(ops.d1_r);
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
38 obj.grid = grid;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 obj.order = order;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
41 obj.a = a;
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
42 obj.D = a*obj.D2;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
44 obj.gamm = grid.h*ops.borrowing.M.S;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 % Closure functions return the opertors applied to the own doamin to close the boundary
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 % type is a string specifying the type of boundary condition if there are several.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 % data is a function returning the data that should be applied at the boundary.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 % neighbour_scheme is an instance of Scheme that should be interfaced to.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54 % neighbour_boundary is a string specifying which boundary to interface to.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 function [closure, penalty] = boundary_condition(obj,boundary,type,data)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 default_arg('type','neumann');
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 default_arg('data',0);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 [e,d,s] = obj.get_boundary_ops(boundary);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
61 switch type
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
62 % Dirichlet boundary condition
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63 case {'D','dirichlet'}
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 tuning = 1.1;
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
65 tau1 = -tuning/obj.gamm;
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
66 tau2 = 1;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
67
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
68 tau = tau1*e + tau2*d;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
70 closure = obj.a*obj.Hi*tau*e';
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
71 penalty = obj.a*obj.Hi*tau;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 % Neumann boundary condition
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
74 case {'N','neumann'}
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
75 tau = -e;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
76
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
77 closure = obj.a*obj.Hi*tau*d';
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
78 penalty = -obj.a*obj.Hi*tau;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
79
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
80 % Unknown, boundary condition
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
81 otherwise
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
82 error('No such boundary condition: type = %s',type);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
83 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
84 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
85
946
706d1c2b4199 Raname opts to type in a bunch of interface methods
Jonatan Werpers <jonatan@werpers.com>
parents: 943
diff changeset
86 function [closure, penalty] = interface(obj, boundary, neighbour_scheme, neighbour_boundary, type)
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
87 % u denotes the solution in the own domain
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
88 % v denotes the solution in the neighbour domain
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
89
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
90 [e_u,d_u,s_u] = obj.get_boundary_ops(boundary);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
91 [e_v,d_v,s_v] = neighbour_scheme.get_boundary_ops(neighbour_boundary);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
92
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
93
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
94 a_u = obj.a;
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
95 a_v = neighbour_scheme.a;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
96
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
97 gamm_u = obj.gamm;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
98 gamm_v = neighbour_scheme.gamm;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
99
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
100 tuning = 1.1;
946
706d1c2b4199 Raname opts to type in a bunch of interface methods
Jonatan Werpers <jonatan@werpers.com>
parents: 943
diff changeset
101
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
102 tau1 = -(a_u/gamm_u + a_v/gamm_v) * tuning;
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
103 tau2 = 1/2*a_u;
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
104 sig1 = -1/2;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
105 sig2 = 0;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
106
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
107 tau = tau1*e_u + tau2*d_u;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
108 sig = sig1*e_u + sig2*d_u;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
109
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
110 closure = obj.Hi*( tau*e_u' + sig*a_u*d_u');
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
111 penalty = obj.Hi*(-tau*e_v' + sig*a_v*d_v');
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
112 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
113
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
114 % Ruturns the boundary ops and sign for the boundary specified by the string boundary.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
115 % The right boundary is considered the positive boundary
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
116 function [e,d,s] = get_boundary_ops(obj,boundary)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
117 switch boundary
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
118 case 'l'
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
119 e = obj.e_l;
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
120 d = obj.d_l;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
121 s = -1;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
122 case 'r'
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
123 e = obj.e_r;
896
09c5fbc783d3 Rename and mordernize scheme.Wave to scheme.Laplace1d. Not fully converted
Jonatan Werpers <jonatan@werpers.com>
parents: 141
diff changeset
124 d = obj.d_r;
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
125 s = 1;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
126 otherwise
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
127 error('No such boundary: boundary = %s',boundary);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
128 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
129 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
130
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
131 function N = size(obj)
898
bd79326ebcd0 Mordernize Laplace1d
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
132 N = obj.grid.size();
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
133 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
134
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
135 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
136
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
137 methods(Static)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
138 % Calculates the matrcis need for the inteface coupling between boundary bound_u of scheme schm_u
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
139 % and bound_v of scheme schm_v.
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
140 % [uu, uv, vv, vu] = inteface_couplong(A,'r',B,'l')
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
141 function [uu, uv, vv, vu] = interface_coupling(schm_u,bound_u,schm_v,bound_v)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
142 [uu,uv] = schm_u.interface(bound_u,schm_v,bound_v);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
143 [vv,vu] = schm_v.interface(bound_v,schm_u,bound_u);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
144 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
145 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
146 end