Mercurial > repos > public > sbplib
comparison +scheme/Euler1d.m @ 61:183d9349b4c1
Refactored euler1d to have real methods.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 14 Nov 2015 19:26:30 -0800 |
parents | e707cd9e6d0a |
children | 00344139cd7d |
comparison
equal
deleted
inserted
replaced
60:e707cd9e6d0a | 61:183d9349b4c1 |
---|---|
9 | 9 |
10 D % non-stabalized scheme operator | 10 D % non-stabalized scheme operator |
11 M % Derivative norm | 11 M % Derivative norm |
12 gamma | 12 gamma |
13 | 13 |
14 T | |
15 p | |
16 c | |
17 Lambda | |
18 | |
19 | |
20 H % Discrete norm | 14 H % Discrete norm |
21 Hi | 15 Hi |
22 e_l, e_r, e_L, e_R; | 16 e_l, e_r, e_L, e_R; |
23 | 17 |
24 end | 18 end |
74 % Man har Q_t+F_x=0 i 1D Euler, där | 68 % Man har Q_t+F_x=0 i 1D Euler, där |
75 % q=[rho, rho*u, e]^T | 69 % q=[rho, rho*u, e]^T |
76 % F=[rho*u, rho*u^2+p, (e+p)*u] ^T | 70 % F=[rho*u, rho*u^2+p, (e+p)*u] ^T |
77 % p=(gamma-1)*(e-rho*u^2/2); | 71 % p=(gamma-1)*(e-rho*u^2/2); |
78 | 72 |
73 | |
79 %Solving on form q_t + F_x = 0 | 74 %Solving on form q_t + F_x = 0 |
80 function o = F(Q) | |
81 % Flux: f = [q2; q2.^2/q1 + p(q); (q3+p(q))*q2/q1]; | |
82 o = [Q(2,:); Q(2,:).^2./Q(1,:) + p(Q); (Q(3,:)+p(Q)).*Q(2,:)./Q(1,:)]; | |
83 end | |
84 | |
85 % Equation of state | |
86 function o = p(Q) | |
87 % Pressure p = (gamma-1)*(q3-q2.^2/q1/2) | |
88 o = (gamma-1)*( Q(3,:)-1/2*Q(2,:).^2./Q(1,:) ); | |
89 end | |
90 obj.p = @p; | |
91 | |
92 function o = c(Q) | |
93 % Speed of light c = sqrt(obj.gamma*p/rho); | |
94 o = sqrt(gamma*p(Q)./Q(1,:)); | |
95 end | |
96 obj.c = @c; | |
97 | |
98 function o = Lambda(q) | |
99 u = q(2)/q(1); | |
100 c = obj.c(q); | |
101 L = [u, u+c, u-c]; | |
102 o = diag(L); | |
103 end | |
104 obj.Lambda = @Lambda; | |
105 | |
106 function o = T(q) | |
107 % T is the transformation such that A = T*Lambda*inv(T) | |
108 % where Lambda=diag(u, u+c, u-c) | |
109 rho = q(1); | |
110 u = q(2)/q(1); | |
111 e = q(3); | |
112 | |
113 c = sqrt(gamma*p(q)/rho); | |
114 | |
115 sqrt2gamm = sqrt(2*(gamma-1)); | |
116 | |
117 o = [ | |
118 sqrt2gamm*rho , rho , rho ; | |
119 sqrt2gamm*rho*u , rho*(u+c) , rho*(u-c) ; | |
120 sqrt2gamm*rho*u^2/2, e+(gamma-1)*(e-rho*u^2/2)+rho*u*c , e+(gamma-1)*(e-rho*u^2/2)-rho*u*c ; | |
121 ]; | |
122 % Devide columns by stuff to get rid of extra comp? | |
123 end | |
124 obj.T = @T; | |
125 | 75 |
126 function o = Fx(q) | 76 function o = Fx(q) |
127 Q = reshape(q,3,m); | 77 Q = reshape(q,3,m); |
128 o = reshape(F(Q),3*m,1); | 78 o = reshape(obj.F(Q),3*m,1); |
129 o = D1*o; | 79 o = D1*o; |
130 end | 80 end |
131 | 81 |
132 function o = Fx_disp(q) | 82 function o = Fx_disp(q) |
133 Q = reshape(q,3,m); | 83 Q = reshape(q,3,m); |
134 f = reshape(F(Q),3*m,1); | 84 f = reshape(obj.F(Q),3*m,1); |
135 | 85 |
136 c = c(Q); | 86 c = obj.c(Q); |
137 lambda_max = c+abs(Q(2,:)./Q(1,:)); | 87 lambda_max = c+abs(Q(2,:)./Q(1,:)); |
138 % lambda_max = max(lambda_max); | 88 % lambda_max = max(lambda_max); |
139 | 89 |
140 lamb_Q(1,:) = lambda_max.*Q(1,:); | 90 lamb_Q(1,:) = lambda_max.*Q(1,:); |
141 lamb_Q(2,:) = lambda_max.*Q(2,:); | 91 lamb_Q(2,:) = lambda_max.*Q(2,:); |
155 obj.u = x; | 105 obj.u = x; |
156 obj.x = kr(x,ones(3,1)); | 106 obj.x = kr(x,ones(3,1)); |
157 obj.gamma = gamma; | 107 obj.gamma = gamma; |
158 end | 108 end |
159 | 109 |
110 % Flux function | |
111 function o = F(obj, Q) | |
112 % Flux: f = [q2; q2.^2/q1 + p(q); (q3+p(q))*q2/q1]; | |
113 p = obj.p(Q); | |
114 o = [Q(2,:); Q(2,:).^2./Q(1,:) + p; (Q(3,:)+p).*Q(2,:)./Q(1,:)]; | |
115 end | |
116 | |
117 % Equation of state | |
118 function o = p(obj, Q) | |
119 % Pressure p = (gamma-1)*(q3-q2.^2/q1/2) | |
120 o = (obj.gamma-1)*( Q(3,:)-1/2*Q(2,:).^2./Q(1,:) ); | |
121 end | |
122 | |
123 % Speed of sound | |
124 function o = c(obj, Q) | |
125 % Speed of light c = sqrt(obj.gamma*p/rho); | |
126 o = sqrt(obj.gamma*obj.p(Q)./Q(1,:)); | |
127 end | |
128 | |
129 % Eigen value matrix | |
130 function o = Lambda(q) | |
131 u = q(2)/q(1); | |
132 c = obj.c(q); | |
133 L = [u, u+c, u-c]; | |
134 o = diag(L); | |
135 end | |
136 | |
137 % Diagonalization transformation | |
138 function o = T(obj, q) | |
139 % T is the transformation such that A = T*Lambda*inv(T) | |
140 % where Lambda=diag(u, u+c, u-c) | |
141 rho = q(1); | |
142 u = q(2)/q(1); | |
143 e = q(3); | |
144 gamma = obj.gamma; | |
145 | |
146 c = sqrt(gamma*obj.p(q)/rho); | |
147 | |
148 sqrt2gamm = sqrt(2*(gamma-1)); | |
149 | |
150 o = [ | |
151 sqrt2gamm*rho , rho , rho ; | |
152 sqrt2gamm*rho*u , rho*(u+c) , rho*(u-c) ; | |
153 sqrt2gamm*rho*u^2/2, e+(gamma-1)*(e-rho*u^2/2)+rho*u*c , e+(gamma-1)*(e-rho*u^2/2)-rho*u*c ; | |
154 ]; | |
155 % Devide columns by stuff to get rid of extra comp? | |
156 end | |
160 | 157 |
161 % Enforces the boundary conditions | 158 % Enforces the boundary conditions |
162 % w+ = R*w- + g(t) | 159 % w+ = R*w- + g(t) |
163 function closure = boundary_condition(obj,boundary, type, varargin) | 160 function closure = boundary_condition(obj,boundary, type, varargin) |
164 [e_s,e_S,s] = obj.get_boundary_ops(boundary); | 161 [e_s,e_S,s] = obj.get_boundary_ops(boundary); |