Solve Riemann problem for the adiabatic MHD equations using the four-state HLLD Riemann solver of Miyoshi & Kusano (2005).
Solve Riemann problem for the isothermal MHD equations using the three-state HLLD Riemann solver of Mignone (2007).
62 double vsL, wsL, scrhL, S1L, sqrL, duL;
63 double vsR, wsR, scrhR, S1R, sqrR, duR;
64 double Bx, Bx1, SM, sBx, pts;
66 double *vL, *vR, *uL, *uR, *SL, *SR;
67 static double *ptL, *ptR;
68 static double **fL, **fR;
69 static double **VL, **VR, **UL, **UR;
70 static double *a2L, *a2R;
71 #if BACKGROUND_FIELD == YES
93 #if BACKGROUND_FIELD == YES
97 #if DIVB_CONTROL == EIGHT_WAVES
98 print (
"! hlld Riemann solver does not work with Powell's 8-wave\n");
126 GLM_Solve (state, VL, VR, beg, end, grid);
131 VL = state->
vL; UL = state->
uL;
132 VR = state->
vR; UR = state->
uR;
142 Flux (UL, VL, a2L, bgf, fL, ptL, beg, end);
143 Flux (UR, VR, a2R, bgf, fR, ptR, beg, end);
149 SL = state->
SL; SR = state->
SR;
150 HLL_Speed (VL, VR, a2L, a2R, bgf, SL, SR, beg, end);
152 for (i = beg; i <= end; i++) {
154 #if BACKGROUND_FIELD == YES
155 EXPAND (B0n = bgf[i][
BXn]; ,
164 scrh =
MAX(fabs(SL[i]), fabs(SR[i]));
167 vL = VL[
i]; uL = UL[
i];
168 vR = VR[
i]; uR = UR[
i];
176 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fL[i][nv];
177 state->
press[i] = ptL[i];
179 }
else if (SR[i] <= 0.0) {
181 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fR[i][nv];
182 state->
press[i] = ptR[i];
186 #if SHOCK_FLATTENING == MULTID
188 scrh = 1.0/(SR[
i] - SL[
i]);
189 for (nv =
NFLX; nv--; ){
190 state->
flux[
i][nv] = SR[
i]*SL[
i]*(uR[nv] - uL[nv])
191 + SR[i]*fL[i][nv] - SL[i]*fR[i][nv];
194 state->
press[
i] = (SR[
i]*ptL[
i] - SL[
i]*ptR[
i])*scrh;
203 scrh = 1.0/(SR[
i] - SL[
i]);
204 Bx1 = Bx = (SR[
i]*vR[
BXn] - SL[
i]*vL[
BXn])*scrh;
205 #if BACKGROUND_FIELD == YES
208 sBx = (Bx > 0.0 ? 1.0 : -1.0);
210 duL = SL[
i] - vL[
VXn];
211 duR = SR[
i] - vR[
VXn];
213 scrh = 1.0/(duR*uR[
RHO] - duL*uL[
RHO]);
214 SM = (duR*uR[
MXn] - duL*uL[
MXn] - ptR[
i] + ptL[
i])*scrh;
216 pts = duR*uR[
RHO]*ptL[
i] - duL*uL[
RHO]*ptR[
i] +
220 usL[
RHO] = uL[
RHO]*duL/(SL[
i] - SM);
221 usR[
RHO] = uR[
RHO]*duR/(SR[
i] - SM);
223 sqrL = sqrt(usL[
RHO]);
224 sqrR = sqrt(usR[
RHO]);
226 S1L = SM - fabs(Bx)/sqrL;
227 S1R = SM + fabs(Bx)/sqrR;
244 if ( (S1L - SL[i]) < 1.e-4*(SM - SL[i]) ) revert_to_hllc = 1;
245 if ( (S1R - SR[i]) > -1.e-4*(SR[i] - SM) ) revert_to_hllc = 1;
249 scrh = 1.0/(SR[
i] - SL[
i]);
250 for (nv =
NFLX; nv--; ){
251 Uhll[nv] = SR[
i]*uR[nv] - SL[
i]*uL[nv] + fL[
i][nv] - fR[
i][nv];
255 EXPAND(usL[
BXn] = usR[
BXn] = Uhll[
BXn]; ,
264 scrhL = (uL[
RHO]*duL*duL - Bx*
Bx)/(uL[
RHO]*duL*(SL[i] - SM) - Bx*
Bx);
265 scrhR = (uR[
RHO]*duR*duR - Bx*
Bx)/(uR[
RHO]*duR*(SR[i] - SM) - Bx*
Bx);
267 EXPAND(usL[
BXn] = Bx1; ,
268 usL[
BXt] = uL[
BXt]*scrhL; ,
269 usL[
BXb] = uL[
BXb]*scrhL;)
273 usL[
BXt] += B0t*(scrhL - 1.0); ,
274 usL[
BXb] += B0b*(scrhL - 1.0);)
277 EXPAND(usR[
BXn] = Bx1; ,
278 usR[
BXt] = uR[
BXt]*scrhR; ,
279 usR[
BXb] = uR[
BXb]*scrhR;)
283 usR[
BXt] += B0t*(scrhR - 1.0); ,
284 usR[
BXb] += B0b*(scrhR - 1.0);)
289 scrhL = Bx/(uL[
RHO]*duL);
290 scrhR = Bx/(uR[
RHO]*duR);
293 vsL = vL[
VXt] - scrhL*(usL[
BXt] - uL[
BXt]);
294 vsR = vR[
VXt] - scrhR*(usR[
BXt] - uR[
BXt]); ,
296 wsL = vL[
VXb] - scrhL*(usL[
BXb] - uL[
BXb]);
297 wsR = vR[
VXb] - scrhR*(usR[
BXb] - uR[
BXb]); )
299 EXPAND(usL[
MXn] = usL[
RHO]*SM;
303 usR[
MXt] = usR[
RHO]*vsR; ,
309 scrhL -= EXPAND( SM*Bx1, + vsL*usL[
BXt], + wsL*usL[
BXb]);
311 usL[ENG] = duL*uL[ENG] - ptL[
i]*vL[
VXn] + pts*SM + Bx*scrhL;
312 usL[ENG] /= SL[
i] - SM;
315 scrhR -= EXPAND( SM*Bx1, + vsR*usR[
BXt], + wsR*usR[
BXb]);
317 usR[ENG] = duR*uR[ENG] - ptR[
i]*vR[
VXn] + pts*SM + Bx*scrhR;
318 usR[ENG] /= SR[
i] - SM;
330 for (nv =
NFLX; nv--; ){
331 state->
flux[
i][nv] = fL[
i][nv] + SL[
i]*(usL[nv] - uL[nv]);
335 }
else if (S1R <= 0.0) {
337 for (nv =
NFLX; nv--; ){
338 state->
flux[
i][nv] = fR[
i][nv] + SR[
i]*(usR[nv] - uR[nv]);
353 vss = sqrL*vsL + sqrR*vsR + (usR[
BXt] - usL[
BXt])*sBx;
354 vss /= sqrL + sqrR; ,
356 wss = sqrL*wsL + sqrR*wsR + (usR[
BXb] - usL[
BXb])*sBx;
359 EXPAND(ussl[
MXn] = ussl[
RHO]*SM;
360 ussr[
MXn] = ussr[
RHO]*SM; ,
362 ussl[
MXt] = ussl[
RHO]*vss;
363 ussr[
MXt] = ussr[
RHO]*vss; ,
365 ussl[
MXb] = ussl[
RHO]*wss;
366 ussr[
MXb] = ussr[
RHO]*wss;)
368 EXPAND(ussl[
BXn] = ussr[
BXn] = Bx1; ,
370 ussl[
BXt] = sqrL*usR[
BXt] + sqrR*usL[
BXt] + sqrL*sqrR*(vsR - vsL)*sBx;
371 ussl[
BXt] /= sqrL + sqrR;
374 ussl[
BXb] = sqrL*usR[
BXb] + sqrR*usL[
BXb] + sqrL*sqrR*(wsR - wsL)*sBx;
375 ussl[
BXb] /= sqrL + sqrR;
378 scrhL = EXPAND(SM*Bx1, + vsL*usL [BXt], + wsL*usL [
BXb]);
379 scrhL -= EXPAND(SM*Bx1, + vss*ussl[BXt], + wss*ussl[
BXb]);
381 scrhR = EXPAND(SM*Bx1, + vsR*usR [BXt], + wsR*usR [
BXb]);
382 scrhR -= EXPAND(SM*Bx1, + vss*ussr[BXt], + wss*ussr[
BXb]);
384 ussl[ENG] = usL[ENG] - sqrL*scrhL*sBx;
385 ussr[ENG] = usR[ENG] + sqrR*scrhR*sBx;
415 for (nv =
NFLX; nv--; ){
416 state->
flux[
i][nv] = fL[
i][nv] + S1L*(ussl[nv] - usL[nv])
417 + SL[i]*(usL[nv] - uL[nv]);
422 for (nv =
NFLX; nv--; ){
423 state->
flux[
i][nv] = fR[
i][nv] + S1R*(ussr[nv] - usR[nv])
424 + SR[i]*(usR[nv] - uR[nv]);
void GLM_Solve(const State_1D *state, double **VL, double **VR, int beg, int end, Grid *grid)
double ** flux
upwind flux computed with the Riemann solver
void Flux(double **u, double **w, double *a2, double **fx, double *p, int beg, int end)
double * SR
Rightmost velocity in the Riemann fan at i+1/2.
double ** vR
Primitive variables to the right of the interface, .
double ** GetBackgroundField(int beg, int end, int where, Grid *grid)
void SoundSpeed2(double **v, double *cs2, double *h, int beg, int end, int pos, Grid *grid)
double * SL
Leftmost velocity in the Riemann fan at i+1/2.
void print(const char *fmt,...)
double ** uR
same as vR, in conservative vars
#define ARRAY_1D(nx, type)
long int NMAX_POINT
Maximum number of points among the three directions, boundaries excluded.
void PrimToCons(double **uprim, double **ucons, int ibeg, int iend)
void BACKGROUND_FIELD(real x1, real x2, real x3, real *B0)
void HLL_Speed(double **vL, double **vR, double *a2L, double *a2R, double *SL, double *SR, int beg, int end)
double ** vL
Primitive variables to the left of the interface, .
double * press
Upwind pressure term computed with the Riemann solver.
#define FLAG_HLL
Use HLL Riemann solver.
#define ARRAY_2D(nx, ny, type)
#define QUIT_PLUTO(e_code)
double ** uL
same as vL, in conservative vars