Mercurial > repos > public > sbplib
annotate +scheme/Wave2dCurve.m @ 577:e45c9b56d50d feature/grids
Add an Empty grid class
The need turned up for the flexural code when we may or may not have a grid for the open water and want to plot that solution.
In case there is no open water we need an empty grid to plot the empty gridfunction against to avoid errors.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 07 Sep 2017 09:16:12 +0200 |
parents | 4e266dfe9edc |
children | 459eeb99130f |
rev | line source |
---|---|
0 | 1 classdef Wave2dCurve < scheme.Scheme |
2 properties | |
3 m % Number of points in each direction, possibly a vector | |
4 h % Grid spacing | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
5 |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
6 grid |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
7 |
0 | 8 order % Order accuracy for the approximation |
9 | |
10 D % non-stabalized scheme operator | |
11 M % Derivative norm | |
12 c | |
13 J, Ji | |
14 a11, a12, a22 | |
15 | |
16 H % Discrete norm | |
17 Hi | |
18 H_u, H_v % Norms in the x and y directions | |
19 Hu,Hv % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. | |
20 Hi_u, Hi_v | |
21 Hiu, Hiv | |
22 e_w, e_e, e_s, e_n | |
23 du_w, dv_w | |
24 du_e, dv_e | |
25 du_s, dv_s | |
26 du_n, dv_n | |
27 gamm_u, gamm_v | |
27
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
28 lambda |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
29 |
449
0707a7192bc3
Add first derivative operators to Wave2DCurve
Jonatan Werpers <jonatan@werpers.com>
parents:
395
diff
changeset
|
30 Dx, Dy % Physical derivatives |
0707a7192bc3
Add first derivative operators to Wave2DCurve
Jonatan Werpers <jonatan@werpers.com>
parents:
395
diff
changeset
|
31 |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
32 x_u |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
33 x_v |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
34 y_u |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
35 y_v |
0 | 36 end |
37 | |
38 methods | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
39 function obj = Wave2dCurve(g ,order, c, opSet) |
303
f18142c1530b
Fixed Wave2dCurve for new operators. Some cleanup in d2_variable_4.
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
40 default_arg('opSet',@sbp.D2Variable); |
27
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
41 default_arg('c', 1); |
0 | 42 |
450
8d455e49364f
Copy Wave2dCurve to new scheme LaplaceCurvilinear
Jonatan Werpers <jonatan@werpers.com>
parents:
449
diff
changeset
|
43 warning('Use LaplaceCruveilinear instead') |
8d455e49364f
Copy Wave2dCurve to new scheme LaplaceCurvilinear
Jonatan Werpers <jonatan@werpers.com>
parents:
449
diff
changeset
|
44 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
45 assert(isa(g, 'grid.Curvilinear')) |
0 | 46 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
47 m = g.size(); |
0 | 48 m_u = m(1); |
49 m_v = m(2); | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
50 m_tot = g.N(); |
0 | 51 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
52 h = g.scaling(); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
53 h_u = h(1); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
54 h_v = h(2); |
0 | 55 |
56 % Operators | |
303
f18142c1530b
Fixed Wave2dCurve for new operators. Some cleanup in d2_variable_4.
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
57 ops_u = opSet(m_u, {0, 1}, order); |
f18142c1530b
Fixed Wave2dCurve for new operators. Some cleanup in d2_variable_4.
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
58 ops_v = opSet(m_v, {0, 1}, order); |
0 | 59 |
60 I_u = speye(m_u); | |
61 I_v = speye(m_v); | |
62 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
63 D1_u = ops_u.D1; |
303
f18142c1530b
Fixed Wave2dCurve for new operators. Some cleanup in d2_variable_4.
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
64 D2_u = ops_u.D2; |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
65 H_u = ops_u.H; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
66 Hi_u = ops_u.HI; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
67 e_l_u = ops_u.e_l; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
68 e_r_u = ops_u.e_r; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
69 d1_l_u = ops_u.d1_l; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
70 d1_r_u = ops_u.d1_r; |
0 | 71 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
72 D1_v = ops_v.D1; |
303
f18142c1530b
Fixed Wave2dCurve for new operators. Some cleanup in d2_variable_4.
Jonatan Werpers <jonatan@werpers.com>
parents:
96
diff
changeset
|
73 D2_v = ops_v.D2; |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
74 H_v = ops_v.H; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
75 Hi_v = ops_v.HI; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
76 e_l_v = ops_v.e_l; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
77 e_r_v = ops_v.e_r; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
78 d1_l_v = ops_v.d1_l; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
79 d1_r_v = ops_v.d1_r; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
80 |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
81 Du = kr(D1_u,I_v); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
82 Dv = kr(I_u,D1_v); |
0 | 83 |
84 % Metric derivatives | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
85 coords = g.points(); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
86 x = coords(:,1); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
87 y = coords(:,2); |
0 | 88 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
89 x_u = Du*x; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
90 x_v = Dv*x; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
91 y_u = Du*y; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
92 y_v = Dv*y; |
0 | 93 |
94 J = x_u.*y_v - x_v.*y_u; | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
95 a11 = 1./J .* (x_v.^2 + y_v.^2); |
0 | 96 a12 = -1./J .* (x_u.*x_v + y_u.*y_v); |
97 a22 = 1./J .* (x_u.^2 + y_u.^2); | |
98 lambda = 1/2 * (a11 + a22 - sqrt((a11-a22).^2 + 4*a12.^2)); | |
99 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
100 % Assemble full operators |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
101 L_12 = spdiags(a12, 0, m_tot, m_tot); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
102 Duv = Du*L_12*Dv; |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
103 Dvu = Dv*L_12*Du; |
0 | 104 |
105 Duu = sparse(m_tot); | |
106 Dvv = sparse(m_tot); | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
107 ind = grid.funcToMatrix(g, 1:m_tot); |
0 | 108 |
109 for i = 1:m_v | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
110 D = D2_u(a11(ind(:,i))); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
111 p = ind(:,i); |
0 | 112 Duu(p,p) = D; |
113 end | |
114 | |
115 for i = 1:m_u | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
116 D = D2_v(a22(ind(i,:))); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
117 p = ind(i,:); |
0 | 118 Dvv(p,p) = D; |
119 end | |
120 | |
121 obj.H = kr(H_u,H_v); | |
122 obj.Hi = kr(Hi_u,Hi_v); | |
123 obj.Hu = kr(H_u,I_v); | |
124 obj.Hv = kr(I_u,H_v); | |
125 obj.Hiu = kr(Hi_u,I_v); | |
126 obj.Hiv = kr(I_u,Hi_v); | |
127 | |
128 obj.e_w = kr(e_l_u,I_v); | |
129 obj.e_e = kr(e_r_u,I_v); | |
130 obj.e_s = kr(I_u,e_l_v); | |
131 obj.e_n = kr(I_u,e_r_v); | |
132 obj.du_w = kr(d1_l_u,I_v); | |
133 obj.dv_w = (obj.e_w'*Dv)'; | |
134 obj.du_e = kr(d1_r_u,I_v); | |
135 obj.dv_e = (obj.e_e'*Dv)'; | |
136 obj.du_s = (obj.e_s'*Du)'; | |
137 obj.dv_s = kr(I_u,d1_l_v); | |
138 obj.du_n = (obj.e_n'*Du)'; | |
370 | 139 obj.dv_n = kr(I_u,d1_r_v); |
376 | 140 |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
141 obj.x_u = x_u; |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
142 obj.x_v = x_v; |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
143 obj.y_u = y_u; |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
144 obj.y_v = y_v; |
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
145 |
0 | 146 obj.m = m; |
147 obj.h = [h_u h_v]; | |
148 obj.order = order; | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
149 obj.grid = g; |
0 | 150 |
151 obj.c = c; | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
152 obj.J = spdiags(J, 0, m_tot, m_tot); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
153 obj.Ji = spdiags(1./J, 0, m_tot, m_tot); |
0 | 154 obj.a11 = a11; |
155 obj.a12 = a12; | |
156 obj.a22 = a22; | |
157 obj.D = obj.Ji*c^2*(Duu + Duv + Dvu + Dvv); | |
27
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
158 obj.lambda = lambda; |
0 | 159 |
449
0707a7192bc3
Add first derivative operators to Wave2DCurve
Jonatan Werpers <jonatan@werpers.com>
parents:
395
diff
changeset
|
160 obj.Dx = spdiag( y_v./J)*Du + spdiag(-y_u./J)*Dv; |
0707a7192bc3
Add first derivative operators to Wave2DCurve
Jonatan Werpers <jonatan@werpers.com>
parents:
395
diff
changeset
|
161 obj.Dy = spdiag(-x_v./J)*Du + spdiag( x_u./J)*Dv; |
0707a7192bc3
Add first derivative operators to Wave2DCurve
Jonatan Werpers <jonatan@werpers.com>
parents:
395
diff
changeset
|
162 |
389
42c89b5eedc0
Add borrowing constants for D2 operators in D4Variable
Jonatan Werpers <jonatan@werpers.com>
parents:
384
diff
changeset
|
163 obj.gamm_u = h_u*ops_u.borrowing.M.d1; |
42c89b5eedc0
Add borrowing constants for D2 operators in D4Variable
Jonatan Werpers <jonatan@werpers.com>
parents:
384
diff
changeset
|
164 obj.gamm_v = h_v*ops_v.borrowing.M.d1; |
0 | 165 end |
166 | |
167 | |
168 % Closure functions return the opertors applied to the own doamin to close the boundary | |
169 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. | |
170 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. | |
171 % type is a string specifying the type of boundary condition if there are several. | |
172 % data is a function returning the data that should be applied at the boundary. | |
173 % neighbour_scheme is an instance of Scheme that should be interfaced to. | |
174 % neighbour_boundary is a string specifying which boundary to interface to. | |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
175 function [closure, penalty] = boundary_condition(obj, boundary, type, parameter) |
0 | 176 default_arg('type','neumann'); |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
177 default_arg('parameter', []); |
0 | 178 |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
179 [e, d_n, d_t, coeff_n, coeff_t, s, gamm, halfnorm_inv , ~, ~, ~, scale_factor] = obj.get_boundary_ops(boundary); |
0 | 180 switch type |
181 % Dirichlet boundary condition | |
182 case {'D','d','dirichlet'} | |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
183 % v denotes the solution in the neighbour domain |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
184 tuning = 1.2; |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
185 % tuning = 20.2; |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
186 [e, d_n, d_t, coeff_n, coeff_t, s, gamm, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t] = obj.get_boundary_ops(boundary); |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
187 |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
188 a_n = spdiag(coeff_n); |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
189 a_t = spdiag(coeff_t); |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
190 |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
191 F = (s * a_n * d_n' + s * a_t*d_t')'; |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
192 |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
193 u = obj; |
0 | 194 |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
195 b1 = gamm*u.lambda./u.a11.^2; |
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
196 b2 = gamm*u.lambda./u.a22.^2; |
0 | 197 |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
198 tau = -1./b1 - 1./b2; |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
199 tau = tuning * spdiag(tau); |
360
447ceb41fb65
Fixed penalty parameter in Wave2Dcurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
347
diff
changeset
|
200 sig1 = 1; |
0 | 201 |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
202 penalty_parameter_1 = halfnorm_inv_n*(tau + sig1*halfnorm_inv_t*F*e'*halfnorm_t)*e; |
0 | 203 |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
204 closure = obj.Ji*obj.c^2 * penalty_parameter_1*e'; |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
205 penalty = -obj.Ji*obj.c^2 * penalty_parameter_1; |
0 | 206 |
207 | |
208 % Neumann boundary condition | |
209 case {'N','n','neumann'} | |
210 c = obj.c; | |
211 | |
212 a_n = spdiags(coeff_n,0,length(coeff_n),length(coeff_n)); | |
213 a_t = spdiags(coeff_t,0,length(coeff_t),length(coeff_t)); | |
214 d = (a_n * d_n' + a_t*d_t')'; | |
215 | |
216 tau1 = -s; | |
217 tau2 = 0; | |
218 tau = c.^2 * obj.Ji*(tau1*e + tau2*d); | |
219 | |
220 closure = halfnorm_inv*tau*d'; | |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
221 penalty = -halfnorm_inv*tau; |
0 | 222 |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
223 % Characteristic boundary condition |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
224 case {'characteristic', 'char', 'c'} |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
225 default_arg('parameter', 1); |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
226 beta = parameter; |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
227 c = obj.c; |
0 | 228 |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
229 a_n = spdiags(coeff_n,0,length(coeff_n),length(coeff_n)); |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
230 a_t = spdiags(coeff_t,0,length(coeff_t),length(coeff_t)); |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
231 d = s*(a_n * d_n' + a_t*d_t')'; % outward facing normal derivative |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
232 |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
233 tau = -c.^2 * 1/beta*obj.Ji*e; |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
234 |
451
4e266dfe9edc
Add warning for possible bug
Jonatan Werpers <jonatan@werpers.com>
parents:
450
diff
changeset
|
235 warning('is this right?! /c?') |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
236 closure{1} = halfnorm_inv*tau/c*spdiag(scale_factor)*e'; |
347
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
237 closure{2} = halfnorm_inv*tau*beta*d'; |
85c2fe06d551
Implemented characteristic form BC in Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
337
diff
changeset
|
238 penalty = -halfnorm_inv*tau; |
0 | 239 |
240 % Unknown, boundary condition | |
241 otherwise | |
242 error('No such boundary condition: type = %s',type); | |
243 end | |
244 end | |
245 | |
246 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) | |
247 % u denotes the solution in the own domain | |
248 % v denotes the solution in the neighbour domain | |
5
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
249 tuning = 1.2; |
27
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
250 % tuning = 20.2; |
85
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
251 [e_u, d_n_u, d_t_u, coeff_n_u, coeff_t_u, s_u, gamm_u, halfnorm_inv_u_n, halfnorm_inv_u_t, halfnorm_u_t, I_u] = obj.get_boundary_ops(boundary); |
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
252 [e_v, d_n_v, d_t_v, coeff_n_v, coeff_t_v, s_v, gamm_v, halfnorm_inv_v_n, halfnorm_inv_v_t, halfnorm_v_t, I_v] = neighbour_scheme.get_boundary_ops(neighbour_boundary); |
0 | 253 |
27
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
254 a_n_u = spdiag(coeff_n_u); |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
255 a_t_u = spdiag(coeff_t_u); |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
256 a_n_v = spdiag(coeff_n_v); |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
257 a_t_v = spdiag(coeff_t_v); |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
258 |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
259 F_u = (s_u * a_n_u * d_n_u' + s_u * a_t_u*d_t_u')'; |
97a638f91fb8
Added function spdiag(). Fixed a bunch of bugs in the Wave2dCurve scheme.
Jonatan Werpers <jonatan@werpers.com>
parents:
5
diff
changeset
|
260 F_v = (s_v * a_n_v * d_n_v' + s_v * a_t_v*d_t_v')'; |
0 | 261 |
5
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
262 u = obj; |
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
263 v = neighbour_scheme; |
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
264 |
85
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
265 b1_u = gamm_u*u.lambda(I_u)./u.a11(I_u).^2; |
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
266 b2_u = gamm_u*u.lambda(I_u)./u.a22(I_u).^2; |
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
267 b1_v = gamm_v*v.lambda(I_v)./v.a11(I_v).^2; |
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
268 b2_v = gamm_v*v.lambda(I_v)./v.a22(I_v).^2; |
5
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
269 |
82
df642750e8f7
Added Dirichelt BC to Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
55
diff
changeset
|
270 tau = -1./(4*b1_u) -1./(4*b1_v) -1./(4*b2_u) -1./(4*b2_v); |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
271 tau = tuning * spdiag(tau); |
0 | 272 sig1 = 1/2; |
83 | 273 sig2 = -1/2; |
0 | 274 |
96
19d0c9325a3e
Wave2dCurve: Removed some comments.
Jonatan Werpers <jonatan@werpers.com>
parents:
89
diff
changeset
|
275 penalty_parameter_1 = halfnorm_inv_u_n*(e_u*tau + sig1*halfnorm_inv_u_t*F_u*e_u'*halfnorm_u_t*e_u); |
0 | 276 penalty_parameter_2 = halfnorm_inv_u_n * sig2 * e_u; |
277 | |
278 | |
5
5f6b0b6a012b
First try at interface implementation in WaveCurve2s
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
279 closure = obj.Ji*obj.c^2 * ( penalty_parameter_1*e_u' + penalty_parameter_2*F_u'); |
83 | 280 penalty = obj.Ji*obj.c^2 * (-penalty_parameter_1*e_v' + penalty_parameter_2*F_v'); |
0 | 281 end |
282 | |
283 % Ruturns the boundary ops and sign for the boundary specified by the string boundary. | |
284 % The right boundary is considered the positive boundary | |
85
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
285 % |
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
286 % I -- the indecies of the boundary points in the grid matrix |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
287 function [e, d_n, d_t, coeff_n, coeff_t, s, gamm, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t, I, scale_factor] = get_boundary_ops(obj, boundary) |
85
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
288 |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
289 % gridMatrix = zeros(obj.m(2),obj.m(1)); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
290 % gridMatrix(:) = 1:numel(gridMatrix); |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
291 |
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
292 ind = grid.funcToMatrix(obj.grid, 1:prod(obj.m)); |
85
643bc513b8b8
Wave2DCurve: Fixed error in tau. Also made random guess at fixing theory from paper.
Jonatan Werpers <jonatan@werpers.com>
parents:
83
diff
changeset
|
293 |
0 | 294 switch boundary |
295 case 'w' | |
296 e = obj.e_w; | |
297 d_n = obj.du_w; | |
298 d_t = obj.dv_w; | |
299 s = -1; | |
300 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
301 I = ind(1,:); |
89
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
302 coeff_n = obj.a11(I); |
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
303 coeff_t = obj.a12(I); |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
304 scale_factor = sqrt(obj.x_v(I).^2 + obj.y_v(I).^2); |
0 | 305 case 'e' |
306 e = obj.e_e; | |
307 d_n = obj.du_e; | |
308 d_t = obj.dv_e; | |
309 s = 1; | |
310 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
311 I = ind(end,:); |
89
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
312 coeff_n = obj.a11(I); |
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
313 coeff_t = obj.a12(I); |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
314 scale_factor = sqrt(obj.x_v(I).^2 + obj.y_v(I).^2); |
0 | 315 case 's' |
316 e = obj.e_s; | |
317 d_n = obj.dv_s; | |
318 d_t = obj.du_s; | |
319 s = -1; | |
320 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
321 I = ind(:,1)'; |
89
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
322 coeff_n = obj.a22(I); |
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
323 coeff_t = obj.a12(I); |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
324 scale_factor = sqrt(obj.x_u(I).^2 + obj.y_u(I).^2); |
0 | 325 case 'n' |
326 e = obj.e_n; | |
327 d_n = obj.dv_n; | |
328 d_t = obj.du_n; | |
329 s = 1; | |
330 | |
337
e070ebd94d9d
Updated Wave2dCurve to use the new grid classes.
Jonatan Werpers <jonatan@werpers.com>
parents:
303
diff
changeset
|
331 I = ind(:,end)'; |
89
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
332 coeff_n = obj.a22(I); |
53fe4b64f65e
Minor cleaning of Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
333 coeff_t = obj.a12(I); |
384
32df00102268
Fix bug in Characteristic BC for Wave2dCurve.
Jonatan Werpers <jonatan@werpers.com>
parents:
360
diff
changeset
|
334 scale_factor = sqrt(obj.x_u(I).^2 + obj.y_u(I).^2); |
0 | 335 otherwise |
336 error('No such boundary: boundary = %s',boundary); | |
337 end | |
338 | |
339 switch boundary | |
340 case {'w','e'} | |
341 halfnorm_inv_n = obj.Hiu; | |
342 halfnorm_inv_t = obj.Hiv; | |
343 halfnorm_t = obj.Hv; | |
344 gamm = obj.gamm_u; | |
345 case {'s','n'} | |
346 halfnorm_inv_n = obj.Hiv; | |
347 halfnorm_inv_t = obj.Hiu; | |
348 halfnorm_t = obj.Hu; | |
349 gamm = obj.gamm_v; | |
350 end | |
351 end | |
352 | |
353 function N = size(obj) | |
354 N = prod(obj.m); | |
355 end | |
356 | |
357 | |
358 end | |
359 end |