Mercurial > repos > public > sbplib
comparison +scheme/Staggered1DAcousticsVariable.m @ 761:8ed102db8e9c feature/d1_staggered
Add discont interface in 1D acoustics staggered, using the hat variable interface coupling.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Mon, 18 Jun 2018 16:36:24 -0700 |
parents | ec0ac76006e2 |
children | 18e10217dca9 |
comparison
equal
deleted
inserted
replaced
760:408fb46f7266 | 761:8ed102db8e9c |
---|---|
216 | 216 |
217 penalty = -obj.Hi*tau; | 217 penalty = -obj.Hi*tau; |
218 | 218 |
219 end | 219 end |
220 | 220 |
221 % Uses the hat variable method for the interface coupling, | |
222 % see hypsyst_varcoeff.pdf in the hypsyst repository. | |
223 % Notation: u for left side of interface, v for right side. | |
221 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) | 224 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) |
222 | 225 |
223 error('Staggered1DAcoustics, interface not implemented'); | 226 % Get boundary matrices |
227 switch boundary | |
228 case 'l' | |
229 A_v = obj.A_l; | |
230 B_v = obj.B_l; | |
231 Hi_v = obj.Hi; | |
232 e_v = obj.e_l; | |
233 | |
234 A_u = neighbour_scheme.A_r; | |
235 B_u = neighbour_scheme.B_r; | |
236 Hi_u = neighbour_scheme.Hi; | |
237 e_u = neighbour_scheme.e_r; | |
238 case 'r' | |
239 A_u = obj.A_r; | |
240 B_u = obj.B_r; | |
241 Hi_u = obj.Hi; | |
242 e_u = obj.e_r; | |
243 | |
244 A_v = neighbour_scheme.A_l; | |
245 B_v = neighbour_scheme.B_l; | |
246 Hi_v = neighbour_scheme.Hi; | |
247 e_v = neighbour_scheme.e_l; | |
248 end | |
249 C_u = inv(A_u)*B_u; | |
250 C_v = inv(A_v)*B_v; | |
251 | |
252 % Diagonalize C | |
253 [T_u, ~] = eig(C_u); | |
254 Lambda_u = inv(T_u)*C_u*T_u; | |
255 lambda_u = diag(Lambda_u); | |
256 S_u = inv(T_u); | |
257 | |
258 [T_v, ~] = eig(C_v); | |
259 Lambda_v = inv(T_v)*C_v*T_v; | |
260 lambda_v = diag(Lambda_v); | |
261 S_v = inv(T_v); | |
262 | |
263 % Identify in- and outgoing characteristic variables | |
264 Im_u = lambda_u < 0; | |
265 Ip_u = lambda_u > 0; | |
266 Im_v = lambda_v < 0; | |
267 Ip_v = lambda_v > 0; | |
268 | |
269 Tp_u = T_u(:,Ip_u); | |
270 Tm_u = T_u(:,Im_u); | |
271 Sp_u = S_u(Ip_u,:); | |
272 Sm_u = S_u(Im_u,:); | |
273 | |
274 Tp_v = T_v(:,Ip_v); | |
275 Tm_v = T_v(:,Im_v); | |
276 Sp_v = S_v(Ip_v,:); | |
277 Sm_v = S_v(Im_v,:); | |
278 | |
279 % Create S_tilde and T_tilde | |
280 Stilde = [Sp_u; Sm_v]; | |
281 Ttilde = inv(Stilde); | |
282 Ttilde_p = Ttilde(:,1); | |
283 Ttilde_m = Ttilde(:,2); | |
284 | |
285 % Solve for penalty parameters theta_1,2 | |
286 LHS = Ttilde_m*Sm_v*Tm_u; | |
287 RHS = B_u*Tm_u; | |
288 th_u = RHS./LHS; | |
289 TH_u = diag(th_u); | |
290 | |
291 LHS = Ttilde_p*Sp_u*Tp_v; | |
292 RHS = -B_v*Tp_v; | |
293 th_v = RHS./LHS; | |
294 TH_v = diag(th_v); | |
295 | |
296 % Construct penalty matrices | |
297 Z_u = TH_u*Ttilde_m*Sm_v; | |
298 Z_u = sparse(Z_u); | |
299 | |
300 Z_v = TH_v*Ttilde_p*Sp_u; | |
301 Z_v = sparse(Z_v); | |
302 | |
303 closure_u = Hi_u*e_u*Z_u*e_u'; | |
304 penalty_u = -Hi_u*e_u*Z_u*e_v'; | |
305 closure_v = Hi_v*e_v*Z_v*e_v'; | |
306 penalty_v = -Hi_v*e_v*Z_v*e_u'; | |
224 | 307 |
225 switch boundary | 308 switch boundary |
226 % Upwind coupling | 309 case 'l' |
227 case {'l','left'} | 310 closure = closure_v; |
228 tau = -1*obj.e_l; | 311 penalty = penalty_v; |
229 closure = obj.Hi*tau*obj.e_l'; | 312 case 'r' |
230 penalty = -obj.Hi*tau*neighbour_scheme.e_r'; | 313 closure = closure_u; |
231 case {'r','right'} | 314 penalty = penalty_u; |
232 tau = 0*obj.e_r; | |
233 closure = obj.Hi*tau*obj.e_r'; | |
234 penalty = -obj.Hi*tau*neighbour_scheme.e_l'; | |
235 end | 315 end |
236 | 316 |
237 end | 317 end |
238 | 318 |
239 function N = size(obj) | 319 function N = size(obj) |
240 N = obj.m; | 320 N = 2*obj.m+1; |
241 end | 321 end |
242 | 322 |
243 end | 323 end |
244 | 324 |
245 methods(Static) | 325 methods(Static) |