Mercurial > repos > public > sbplib
changeset 682:ec0ac76006e2 feature/d1_staggered
Modify BC in Staggered 1D acoustics to ensure that only physically meaningful changes of variables are used. See hypsyst varcoeff sec 3.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Wed, 07 Feb 2018 20:07:34 -0800 |
parents | 82024d32e333 |
children | 9c3c180c7ed3 |
files | +scheme/Staggered1DAcoustics.m +scheme/Staggered1DAcousticsVariable.m |
diffstat | 2 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/+scheme/Staggered1DAcoustics.m Wed Dec 27 21:16:06 2017 +0100 +++ b/+scheme/Staggered1DAcoustics.m Wed Feb 07 20:07:34 2018 -0800 @@ -118,14 +118,20 @@ % BC on the form Lu - g = 0; + % Need a transformation T such that w = T^{−1}*u is a + % meaningful change of variables and T^T*B*T is block-diagonal, + % For linear acoustics, T = T_C meets these criteria. + A = obj.A; B = obj.B; C = inv(A)*B; - % Diagonalize B - [T, Lambda] = eig(B); + % Diagonalize C and use T_C to diagonalize B + [T, ~] = eig(C); + Lambda = T'*B*T; lambda = diag(Lambda); + % Identify in- and outgoing variables Iplus = lambda > 0; Iminus = lambda < 0; @@ -176,11 +182,11 @@ switch boundary case 'l' - tau = -1*obj.e_l * inv(A) * T * sigma * inv(L*Tin); + tau = -1*obj.e_l * inv(A) * inv(T)' * sigma * inv(L*Tin); closure = obj.Hi*tau*L*obj.e_l'; case 'r' - tau = 1*obj.e_r * inv(A) * T * sigma * inv(L*Tin); + tau = 1*obj.e_r * inv(A) * inv(T)' * sigma * inv(L*Tin); closure = obj.Hi*tau*L*obj.e_r'; end
--- a/+scheme/Staggered1DAcousticsVariable.m Wed Dec 27 21:16:06 2017 +0100 +++ b/+scheme/Staggered1DAcousticsVariable.m Wed Feb 07 20:07:34 2018 -0800 @@ -135,6 +135,10 @@ % BC on the form Lu - g = 0; + % Need a transformation T such that w = T^{−1}*u is a + % meaningful change of variables and T^T*B*T is block-diagonal, + % For linear acoustics, T = T_C meets these criteria. + % Get boundary matrices switch boundary case 'l' @@ -146,8 +150,9 @@ end C = inv(A)*B; - % Diagonalize B - [T, Lambda] = eig(B); + % Diagonalize C and use T_C to diagonalize B + [T, ~] = eig(C); + Lambda = T'*B*T; lambda = diag(Lambda); % Identify in- and outgoing characteristic variables @@ -200,11 +205,11 @@ switch boundary case 'l' - tau = -1*obj.e_l * inv(A) * T * sigma * inv(L*Tin); + tau = -1*obj.e_l * inv(A) * inv(T)' * sigma * inv(L*Tin); closure = obj.Hi*tau*L*obj.e_l'; case 'r' - tau = 1*obj.e_r * inv(A) * T * sigma * inv(L*Tin); + tau = 1*obj.e_r * inv(A) * inv(T)' * sigma * inv(L*Tin); closure = obj.Hi*tau*L*obj.e_r'; end