comparison +scheme/Euler1d.m @ 54:2194cd385419

Euler1d: Fixed russian dissipation. Cleaned up. Added non-working BC.
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 11 Nov 2015 19:21:38 -0800
parents 75ebf5d3cfe5
children 9a647dcccbdd
comparison
equal deleted inserted replaced
53:cca09cc5121d 54:2194cd385419
31 gamma = gama; 31 gamma = gama;
32 32
33 [x, h] = util.get_grid(xlim{:},m); 33 [x, h] = util.get_grid(xlim{:},m);
34 34
35 if do_upwind 35 if do_upwind
36 ops = spb.Upwind(m,h,order); 36 ops = sbp.Upwind(m,h,order);
37 Dp = ops.derivatives.Dp; 37 Dp = ops.derivatives.Dp;
38 Dm = ops.derivatives.Dm; 38 Dm = ops.derivatives.Dm;
39 39
40 printExpr('issparse(Dp)');
41 printExpr('issparse(Dm)');
42
43 D1 = (Dp + Dm)/2; 40 D1 = (Dp + Dm)/2;
41 Ddisp = (Dp - Dm)/2;
44 else 42 else
45 ops = opsGen(m,h,order); 43 ops = opsGen(m,h,order);
46 D1 = sparse(ops.derivatives.D1); 44 D1 = sparse(ops.derivatives.D1);
47 end 45 end
48 46
51 e_l = sparse(ops.boundary.e_1); 49 e_l = sparse(ops.boundary.e_1);
52 e_r = sparse(ops.boundary.e_m); 50 e_r = sparse(ops.boundary.e_m);
53 51
54 I_x = speye(m); 52 I_x = speye(m);
55 I_3 = speye(3); 53 I_3 = speye(3);
56
57 54
58 D1 = kr(D1, I_3); 55 D1 = kr(D1, I_3);
59 if do_upwind 56 if do_upwind
60 Ddisp = kr(Ddisp,I_3); 57 Ddisp = kr(Ddisp,I_3);
61 end 58 end
94 function o = c(Q) 91 function o = c(Q)
95 % Speed of light c = sqrt(obj.gamma*p/rho); 92 % Speed of light c = sqrt(obj.gamma*p/rho);
96 o = sqrt(gamma*p(Q)./Q(1,:)); 93 o = sqrt(gamma*p(Q)./Q(1,:));
97 end 94 end
98 95
99
100 % R =
101 % [sqrt(2*(gamma-1))*rho , rho , rho ;
102 % sqrt(2*(gamma-1))*rho*u , rho*(u+c) , rho*(u-c) ;
103 % sqrt(2*(gamma-1))*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]);
104 function o = T(q) 96 function o = T(q)
97 % T is the transformation such that A = T*Lambda*inv(T)
98 % where Lambda=diag(u, u+c, u-c)
105 rho = q(1); 99 rho = q(1);
106 u = q(2)/q(1); 100 u = q(2)/q(1);
107 e = q(3); 101 e = q(3);
108 102
109 c = sqrt(gamma*p(q)/rho); 103 c = sqrt(gamma*p(q)/rho);
111 sqrt2gamm = sqrt(2*(gamma-1)); 105 sqrt2gamm = sqrt(2*(gamma-1));
112 106
113 o = [ 107 o = [
114 sqrt2gamm*rho , rho , rho ; 108 sqrt2gamm*rho , rho , rho ;
115 sqrt2gamm*rho*u , rho*(u+c) , rho*(u-c) ; 109 sqrt2gamm*rho*u , rho*(u+c) , rho*(u-c) ;
116 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 110 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 ;
117 ]; 111 ];
118 % Devide columns by stuff to get rid of extra comp? 112 % Devide columns by stuff to get rid of extra comp?
119 end 113 end
120 114
121 function o = Fx(q) 115 function o = Fx(q)
122 Q = reshape(q,3,m); 116 Q = reshape(q,3,m);
123 o = reshape(F(Q),3*m,1); 117 o = reshape(F(Q),3*m,1);
124 o = D1*o; 118 o = D1*o;
125 end 119 end
126 120
127 121 function o = Fx_disp(q)
128 % A=R*Lambda*inv(R), där Lambda=diag(u, u+c, u-c) (c är ljudhastigheten) 122 Q = reshape(q,3,m);
129 % c^2=gamma*p/rho 123 f = reshape(F(Q),3*m,1);
130 % function o = A(rho,u,e) 124
131 % end 125 c = c(Q);
126 lambda_max = c+abs(Q(2,:)./Q(1,:));
127 % lambda_max = max(lambda_max);
128
129 lamb_Q(1,:) = lambda_max.*Q(1,:);
130 lamb_Q(2,:) = lambda_max.*Q(2,:);
131 lamb_Q(3,:) = lambda_max.*Q(3,:);
132
133 lamb_q = reshape(lamb_Q,3*m, 1);
134
135 o = -D1*f + Ddisp*lamb_q;
136 end
137
132 if do_upwind 138 if do_upwind
133 obj.D = @(q)-Fx(q) + Ddisp*(1)*u; 139 obj.D = @Fx_disp;
134 else 140 else
135 obj.D = @(q)-Fx(q); 141 obj.D = @(q)-Fx(q);
136 end 142 end
137 143
138 obj.Fx = @Fx; 144 obj.Fx = @Fx;
151 [e_s,e_S,s] = obj.get_boundary_ops(boundary); 157 [e_s,e_S,s] = obj.get_boundary_ops(boundary);
152 158
153 % Boundary condition on form 159 % Boundary condition on form
154 % w_in = R*w_out + g, where g is data 160 % w_in = R*w_out + g, where g is data
155 161
156 % How to handle when the number of BC we want to set changes
157 % How to handel u = 0 as an example
158
159 % Måste sätta in s och fixa tecken som de ska vara
160
161 % Kanske ska man tala om vilka karakteristikor som är in och ut i anropet
162 % Man kan sen kolla om det stämmer (men hur blir det med u=0?)
163 % Och antingen tillåta att man skickar in flera alternativ och väljer automatiskt
164 % eller låta koden utanför bestämma vilken penalty som ska appliceras.
165
166 switch type 162 switch type
167 case 'wall' 163 case 'wall'
168 closure = obj.boundary_condition_wall(boundary); 164 closure = obj.boundary_condition_wall(boundary);
165 case 'inflow'
166 closure = obj.boundary_condition_inflow(boundary,varargin{:});
167 case 'outflow'
168 closure = obj.boundary_condition_outflow(boundary,varargin{:});
169 otherwise 169 otherwise
170 error('Unsupported bc type: %s', type); 170 error('Unsupported bc type: %s', type);
171 end 171 end
172 172
173 % T = obj.T(e_S*v); 173 end
174 174
175 % c = sqrt(gamma*p/rho); 175 function closure = boundary_condition_inflow(obj, boundary, p_data, v_data)
176 % l = [u, u+c, u-c]; 176 [e_s,e_S,s] = obj.get_boundary_ops(boundary);
177 177
178 % p_in = find(s*l <= 0); 178 switch s
179 % p_ot = find(s*l > 0); 179 case -1
180 180 p_in = [1 2];
181 % p = [p_in, p_ot] % Permutation to sort 181 p_ot = [3];
182 % pt(p) = 1:length(p); % Inverse permutation 182 case 1
183 183 p_in = [1 3];
184 % L_in = diag(abs(l(p_in))); 184 p_ot = [2];
185 % L_ot = diag(abs(l(p_ot))); 185 otherwise
186 186 error();
187 % Lambda = diag(u, u+c, u-c); 187 end
188 188
189 % tau = -e_S*sparse(T*[L_in; R'*L_in]); % Något med pt 189 p = [p_in, p_ot]; % Permutation to sort
190 190 pt(p) = 1:length(p); % Inverse permutation
191 191
192 % w_s = T'*(e_S*v); 192 gamma = obj.gamma;
193 % w_in = w_s(p_in); 193
194 % w_ot = w_s(p_ot); 194 function o = closure_fun(q,t)
195 195 q_s = e_S'*q;
196 196 rho = q_s(1);
197 % function closure_fun(q,t) 197 u = q_s(2)/rho;
198 % obj.Hi * tau * (w_in - R*w_ot - g(t)); 198 e = q_s(3);
199 % end 199
200 200 c = obj.c(q_s);
201 % function closure_fun_indep(q,t) 201
202 % obj.Hi * tau * (w_in - R*w_ot - g; 202 T = obj.T(q_s);
203 % end 203
204 204 % L = [
205 205 % 0 1 0;
206 % switch class(g) 206 % 0 -1/2*u 1;
207 % case 'double' 207 % ];
208 % closure = @closure_fun; 208 LTpi = [
209 % case 'function_handle' 209 2^(1/2)/(2*rho*u*(gamma - 1)^(1/2)), -(2^(1/2)*(u - c*s))/(u*(2*e*gamma - rho*(gamma*u^2 - c*s*u + 2*c*s))*(gamma - 1)^(1/2));
210 % closure = @closure_fun_indep; 210 0, 2/(2*e*gamma - gamma*rho*u^2 + c*rho*s*(u - 2));
211 % otherwise 211 ];
212 % error('Wierd data argument!'); 212 R = [
213 % end 213 (2^(1/2)*c*s*(rho*(gamma - 1)*u^2 + 2*rho*u - 2*e*gamma))/(u*(gamma - 1)^(1/2)*(- gamma*rho*u^2 + c*rho*s*u + 2*e*gamma - 2*c*rho*s));
214 (2*c*rho*s*(u - 2))/(2*e*gamma - gamma*rho*u^2 + c*rho*s*(u - 2)) - 1;
215 ];
216
217 tau1 = -2*[
218 u, 0;
219 0, c + abs(u);
220 ];
221 tau2 = [0 0]; % Penalty only on ingoing char.
222
223
224 tauHat = [tau1; tau2];
225 tau = -s*e_S*sparse(T*tauHat(pt,:));
226
227 w_s = inv(T)*q_s;
228 % w_s = T\q_s;
229 % w_s = Tinv * q_s; % Med analytisk matris
230 w_in = w_s(p_in);
231 w_ot = w_s(p_ot);
232
233
234 o = obj.Hi * tau * (w_in - R*w_ot - LTpi*[v_data(t); p_data(t)]);
235 end
236
237 closure = @closure_fun;
238 end
239
240
241 function closure = boundary_condition_outflow(obj, boundary, p_data)
242 [e_s,e_S,s] = obj.get_boundary_ops(boundary);
243
244 switch s
245 case -1
246 p_in = 2;
247 p_ot = [1 3];
248 case 1
249 p_in = 3;
250 p_ot = [1 2];
251 otherwise
252 error();
253 end
254
255 p = [p_in, p_ot]; % Permutation to sort
256 pt(p) = 1:length(p); % Inverse permutation
257
258 gamma = obj.gamma;
259
260 function o = closure_fun(q,t)
261 q_s = e_S'*q;
262 rho = q_s(1);
263 u = q_s(2)/rho;
264 e = q_s(3);
265
266 c = obj.c(q_s);
267
268
269 T = obj.T(q_s);
270
271 L = (gamma -1)*[0 -1/2*u 1];
272 LTpi = 1/(L*T(:,p_in));
273 R = -[0 (gamma*(e - rho*u^2/2) - rho*u*c)/(gamma*(e - rho*u^2/2) + rho*u*c)];
274
275 tau1 = [-2*(c - abs(u))];
276 tau2 = [0; 0]; % Penalty only on ingoing char.
277
278
279 tauHat = [tau1; tau2];
280 tau = -s*e_S*sparse(T*tauHat(pt));
281
282 w_s = inv(T)*q_s;
283 % w_s = T\q_s;
284 % w_s = Tinv * q_s; % Med analytisk matris
285 w_in = w_s(p_in);
286 w_ot = w_s(p_ot);
287
288 o = obj.Hi * tau * (w_in - R*w_ot - LTpi*p_data(t));
289 end
290
291 closure = @closure_fun;
214 292
215 end 293 end
216 294
217 % Set wall boundary condition v = 0. 295 % Set wall boundary condition v = 0.
218 function closure = boundary_condition_wall(obj,boundary) 296 function closure = boundary_condition_wall(obj,boundary)
277 355
278 356
279 tau1 = -2*c; 357 tau1 = -2*c;
280 tau2 = [0; 0]; % Penalty only on ingoing char. 358 tau2 = [0; 0]; % Penalty only on ingoing char.
281 359
282 % L_in = diag(abs(l(p_in))); 360 % Lambda_in = diag(abs(l(p_in)));
283 % L_ot = diag(abs(l(p_ot))); 361 % Lambda_ot = diag(abs(l(p_ot)));
284 362
285 tauHat = [tau1; tau2]; 363 tauHat = [tau1; tau2];
286 tau = -s*e_S*sparse(T*tauHat(pt)); 364 tau = -s*e_S*sparse(T*tauHat(pt));
287 365
288 w_s = inv(T)*q_s; 366 w_s = inv(T)*q_s;