37 #define VERIFY_CONSISTENCY_CONDITION NO
39 #if EOS == IDEAL || EOS == PVTE_LAW
42 double *cmax,
Grid *grid)
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;
314 scrhR = EXPAND(vR[
VXn]*Bx1, + vR[
VXt]*uR[BXt], + vR[
VXb]*uR[BXb]);
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]);
434 #if EOS == ISOTHERMAL
437 double *cmax,
Grid *grid)
453 double usL[
NFLX], *SL;
454 double usR[
NFLX], *SR;
457 double scrhL, S1L, duL;
458 double scrhR, S1R, duR;
459 double Bx, Bx1, SM, sBx, rho, sqrho;
461 double *vL, *vR, *uL, *uR;
462 static double *ptL, *ptR, *a2L, *a2R;
463 static double **fL, **fR;
464 static double **VL, **VR, **UL, **UR;
465 #if BACKGROUND_FIELD == YES
466 double B0n, B0t, B0b;
488 #if BACKGROUND_FIELD == YES
492 #if DIVB_CONTROL == EIGHT_WAVES
493 print (
"! hlld Riemann solver does not work with Powell\n");
498 GLM_Solve (state, VL, VR, beg, end, grid);
502 VL = state->
vL; UL = state->
uL;
503 VR = state->
vR; UR = state->
uR;
513 Flux (UL, VL, a2L, bgf, fL, ptL, beg, end);
514 Flux (UR, VR, a2R, bgf, fR, ptR, beg, end);
520 SL = state->
SL; SR = state->
SR;
521 HLL_Speed (VL, VR, a2L, a2R, bgf, SL, SR, beg, end);
523 for (i = beg; i <= end; i++) {
525 #if BACKGROUND_FIELD == YES
526 EXPAND (B0n = bgf[i][
BXn]; ,
535 scrh =
MAX(fabs(SL[i]), fabs(SR[i]));
538 vL = VL[
i]; uL = UL[
i];
539 vR = VR[
i]; uR = UR[
i];
547 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fL[i][nv];
548 state->
press[i] = ptL[i];
550 }
else if (SR[i] <= 0.0) {
552 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fR[i][nv];
553 state->
press[i] = ptR[i];
557 scrh = 1.0/(SR[
i] - SL[
i]);
558 duL = SL[
i] - vL[
VXn];
559 duR = SR[
i] - vR[
VXn];
561 Bx1 = Bx = (SR[
i]*vR[
BXn] - SL[
i]*vL[
BXn])*scrh;
562 #if BACKGROUND_FIELD == YES
566 rho = (uR[
RHO]*duR - uL[
RHO]*duL)*scrh;
576 S1L = SM - fabs(Bx)/sqrho;
577 S1R = SM + fabs(Bx)/sqrho;
586 if ( (S1L - SL[i]) < 1.e-4*(SR[i] - SL[i]) ) revert_to_hll = 1;
587 if ( (S1R - SR[i]) > -1.e-4*(SR[i] - SL[i]) ) revert_to_hll = 1;
590 scrh = 1.0/(SR[
i] - SL[
i]);
591 for (nv =
NFLX; nv--; ){
592 state->
flux[
i][nv] = SL[
i]*SR[
i]*(uR[nv] - uL[nv]) +
593 SR[i]*fL[i][nv] - SL[i]*fR[i][nv];
596 state->
press[
i] = (SR[
i]*ptL[
i] - SL[
i]*ptR[
i])*scrh;
603 state->
press[
i] = (SR[
i]*ptL[
i] - SL[
i]*ptR[
i])*scrh;
615 scrhL = 1.0/((SL[
i] - S1L)*(SL[i] - S1R));
616 scrhR = 1.0/((SR[
i] - S1L)*(SR[i] - S1R));
618 #if BACKGROUND_FIELD == YES
620 usL[
MXt] = rho*vL[
VXt] - Bx*(uL[
BXt]+B0t)*(SM - vL[
VXn])*scrhL;
621 usR[
MXt] = rho*vR[
VXt] - Bx*(uR[
BXt]+B0t)*(SM - vR[VXn])*scrhR; ,
623 usL[
MXb] = rho*vL[
VXb] - Bx*(uL[
BXb]+B0b)*(SM - vL[VXn])*scrhL;
624 usR[
MXb] = rho*vR[
VXb] - Bx*(uR[
BXb]+B0b)*(SM - vR[VXn])*scrhR;)
627 usL[
MXt] = rho*vL[
VXt] - Bx*uL[
BXt]*(SM - vL[
VXn])*scrhL;
628 usR[
MXt] = rho*vR[
VXt] - Bx*uR[
BXt]*(SM - vR[
VXn])*scrhR; ,
630 usL[
MXb] = rho*vL[
VXb] - Bx*uL[
BXb]*(SM - vL[
VXn])*scrhL;
631 usR[
MXb] = rho*vR[
VXb] - Bx*uR[
BXb]*(SM - vR[
VXn])*scrhR;)
636 usL[
BXt] = (uL[
BXt]+B0t)/rho*(uL[
RHO]*duL*duL - Bx*Bx)*scrhL-B0t;
637 usR[
BXt] = (uR[
BXt]+B0t)/rho*(uR[
RHO]*duR*duR - Bx*Bx)*scrhR-B0t; ,
639 usL[
BXb] = (uL[
BXb]+B0b)/rho*(uL[
RHO]*duL*duL - Bx*Bx)*scrhL-B0b;
640 usR[
BXb] = (uR[
BXb]+B0b)/rho*(uR[
RHO]*duR*duR - Bx*Bx)*scrhR-B0b;)
643 usL[
BXt] = uL[
BXt]/rho*(uL[
RHO]*duL*duL - Bx*
Bx)*scrhL;
644 usR[
BXt] = uR[
BXt]/rho*(uR[
RHO]*duR*duR - Bx*
Bx)*scrhR; ,
646 usL[
BXb] = uL[
BXb]/rho*(uL[
RHO]*duL*duL - Bx*
Bx)*scrhL;
647 usR[
BXb] = uR[
BXb]/rho*(uR[
RHO]*duR*duR - Bx*
Bx)*scrhR;)
661 }
else if (S1R <= 0.0) {
678 sBx = (Bx > 0.0 ? 1.0 : -1.0);
682 + (usR[
BXt] - usL[
BXt])*sBx*sqrho); ,
684 + (usR[
BXb] - usL[
BXb])*sBx*sqrho);)
688 + (usR[
MXt] - usL[
MXt])*sBx/sqrho); ,
690 + (usR[
MXb] - usL[
MXb])*sBx/sqrho);)
715 for (nv =
NFLX; nv--; ){
716 if (nv ==
RHO || nv ==
MXn || nv ==
BXn)
continue;
717 scrh = (S1L - SL[
i])*usL[nv] + (S1R - S1L)*usc[nv] +
718 (SR[
i] - S1R)*usR[nv] -
719 SR[i]*uR[nv] + SL[i]*uL[nv] + fR[i][nv] - fL[i][nv];
721 if (fabs(scrh) > 1.e-6){
722 printf (
" ! Consistency condition violated, pt %d, nv %d, %12.6e \n",
724 printf (
" scrhL = %12.6e scrhR = %12.6e\n",scrhL, scrhR);
725 printf (
" SL = %12.6e, S1L = %12.6e, S1R = %12.6e, SR = %12.6e\n",
726 SL[i],S1L,S1R, SR[i]);
741 #undef VERIFY_CONSISTENCY_CONDITION
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)
void HLLD_Solver(const State_1D *state, int beg, int end, double *cmax, Grid *grid)
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)
#define VERIFY_CONSISTENCY_CONDITION
void Show(double **, int)
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