Solve Riemann problem for the adiabatic MHD equations using the Roe Riemann solver of Cargo & Gallice (1997).
69 double rho, u,
v, w,
vel2, bx, by, bz, pr;
70 double a2,
a, ca2, cf2, cs2;
71 double cs,
ca, cf, b2;
72 double alpha_f, alpha_s, beta_y, beta_z, beta_v,
scrh, sBx;
73 double dV[
NFLX], dU[
NFLX], *vL, *vR, *uL, *uR;
79 double delta, delta_inv;
81 double g1, sl, sr, H, Hgas, HL, HR,
Bx, By, Bz,
X;
82 double vdm, BdB, beta_dv, beta_dB;
83 double bt2, Btmag, sqr_rho_L, sqr_rho_R;
85 static double *pR, *pL, *a2L, *a2R;
86 static double **fL, **fR;
87 static double **VL, **VR, **UL, **UR;
89 #if BACKGROUND_FIELD == YES
90 double B0x, B0y, B0z, B1x, B1y, B1z;
122 #if BACKGROUND_FIELD == YES
124 #if (DIVB_CONTROL == EIGHT_WAVES)
125 print1 (
"! Roe_Solver: background field and 8wave not tested\n");
135 GLM_Solve (state, VL, VR, beg, end, grid);
139 VL = state->
vL; UL = state->
uL;
140 VR = state->
vR; UR = state->
uR;
150 Flux (UL, VL, a2L, bgf, fL, pL, beg, end);
151 Flux (UR, VR, a2R, bgf, fR, pR, beg, end);
153 SL = state->
SL; SR = state->
SR;
164 for (k =
NFLX; k--; ) {
165 for (j =
NFLX; j--; ) {
173 for (i = beg; i <= end; i++) {
175 vL = VL[
i]; uL = UL[
i];
176 vR = VR[
i]; uR = UR[
i];
182 #if SHOCK_FLATTENING == MULTID
184 HLL_Speed (VL, VR, a2L, a2R, NULL, SL, SR, i, i);
186 scrh =
MAX(fabs(SL[i]), fabs(SR[i]));
190 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fL[i][nv];
191 state->
press[i] = pL[i];
192 }
else if (SR[i] < 0.0) {
193 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fR[i][nv];
194 state->
press[i] = pR[i];
196 scrh = 1.0/(SR[
i] - SL[
i]);
197 for (nv =
NFLX; nv--; ){
198 state->
flux[
i][nv] = SR[
i]*SL[
i]*(uR[nv] - uL[nv])
199 + SR[i]*fL[i][nv] - SL[i]*fR[i][nv];
202 state->
press[
i] = (SR[
i]*pL[
i] - SL[
i]*pR[
i])*scrh;
231 for (nv = 0; nv <
NFLX; nv++) {
232 dV[nv] = vR[nv] - vL[nv];
233 dU[nv] = uR[nv] - uL[nv];
240 sqr_rho_L = sqrt(vL[
RHO]);
241 sqr_rho_R = sqrt(vR[
RHO]);
243 sl = sqr_rho_L/(sqr_rho_L + sqr_rho_R);
244 sr = sqr_rho_R/(sqr_rho_L + sqr_rho_R);
248 rho = sr*vL[
RHO] + sl*vR[
RHO];
250 sqrt_rho = sqrt(rho);
252 EXPAND (u = sl*vL[
VXn] + sr*vR[
VXn]; ,
253 v = sl*vL[
VXt] + sr*vR[
VXt]; ,
254 w = sl*vL[
VXb] + sr*vR[
VXb];)
256 EXPAND (Bx = sr*vL[
BXn] + sl*vR[
BXn]; ,
257 By = sr*vL[
BXt] + sl*vR[
BXt]; ,
258 Bz = sr*vL[
BXb] + sl*vR[
BXb];)
262 EXPAND (B0x = bgf[i][
BXn]; B1x = sr*vL[
BXn] + sl*vR[
BXn]; Bx = B0x + B1x; ,
263 B0y = bgf[
i][
BXt]; B1y = sr*vL[
BXt] + sl*vR[
BXt]; By = B0y + B1y; ,
264 B0z = bgf[
i][
BXb]; B1z = sr*vL[
BXb] + sl*vR[
BXb]; Bz = B0z + B1z;)
266 EXPAND (Bx = sr*vL[
BXn] + sl*vR[
BXn]; ,
267 By = sr*vL[
BXt] + sl*vR[
BXt]; ,
268 Bz = sr*vL[
BXb] + sl*vR[
BXb];)
271 sBx = (Bx >= 0.0 ? 1.0 : -1.0);
273 EXPAND(bx = Bx/sqrt_rho; ,
277 bt2 = EXPAND(0.0 , + by*by, + bz*bz);
279 Btmag = sqrt(bt2*rho);
282 X /= (sqr_rho_L + sqr_rho_R)*(sqr_rho_L + sqr_rho_R)*2.0;
284 vdm = EXPAND(u*dU[
MXn], + v*dU[
MXt], + w*dU[
MXb]);
285 #if BACKGROUND_FIELD == YES
286 BdB = EXPAND(B1x*dU[
BXn], + B1y*dU[
BXt], + B1z*dU[
BXb]);
288 BdB = EXPAND(Bx*dU[
BXn], + By*dU[
BXt], + Bz*dU[
BXb]);
295 #if EOS == ISOTHERMAL
296 a2 = 0.5*(a2L[
i] + a2R[
i]) + X;
298 #elif EOS == BAROTROPIC
299 print (
"! Roe_Solver: not implemented for barotropic EOS\n");
302 vel2 = EXPAND(u*u, + v*v, + w*w);
303 dV[PRS] = g1*((0.5*vel2 -
X)*dV[
RHO] - vdm + dU[ENG] - BdB);
305 HL = (uL[ENG] + pL[
i])/vL[
RHO];
306 HR = (uR[ENG] + pR[
i])/vR[
RHO];
309 #if BACKGROUND_FIELD == YES
310 scrh = EXPAND(B1x*Bx, + B1y*By, + B1z*Bz);
316 a2 = (2.0 -
g_gamma)*X + g1*(Hgas - 0.5*vel2);
318 printf (
"! Roe: a2 = %12.6e < 0.0 !! \n",a2);
341 scrh = scrh*scrh + 4.0*bt2*a2;
344 cf2 = 0.5*(a2 + b2 +
scrh);
362 scrh = 1.0/(cf2 - cs2);
363 alpha_f = (a2 - cs2)*scrh;
364 alpha_s = (cf2 - a2)*scrh;
365 alpha_f =
MAX(0.0, alpha_f);
366 alpha_s =
MAX(0.0, alpha_s);
367 alpha_f = sqrt(alpha_f);
368 alpha_s = sqrt(alpha_s);
373 beta_y =
DSIGN(By); ,
408 scrh = alpha_s*cs*sBx;
409 beta_dv = EXPAND(0.0, + beta_y*dV[
VXt], + beta_z*dV[
VXb]);
410 beta_dB = EXPAND(0.0, + beta_y*dV[
BXt], + beta_z*dV[
BXb]);
411 beta_v = EXPAND(0.0, + beta_y*v, + beta_z*w);
413 Rc[
RHO][
k] = alpha_f;
414 EXPAND(Rc[
MXn][k] = alpha_f*lambda[k]; ,
415 Rc[
MXt][
k] = alpha_f*v + scrh*beta_y; ,
416 Rc[
MXb][
k] = alpha_f*w + scrh*beta_z;)
418 Rc[
BXt][k] = alpha_s*a*beta_y/sqrt_rho; ,
419 Rc[
BXb][
k] = alpha_s*a*beta_z/sqrt_rho;)
422 Rc[ENG][k] = alpha_f*(Hgas - u*cf) + scrh*beta_v
423 + alpha_s*a*Btmag/sqrt_rho;
424 #if BACKGROUND_FIELD == YES
425 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
428 eta[
k] = alpha_f*(X*dV[
RHO] + dV[PRS]) + rho*scrh*beta_dv
429 - rho*alpha_f*cf*dV[
VXn] + sqrt_rho*alpha_s*a*beta_dB;
430 #elif EOS == ISOTHERMAL
431 eta[
k] = alpha_f*(0.0*X + a2)*dV[
RHO] + rho*scrh*beta_dv
432 - rho*alpha_f*cf*dV[
VXn] + sqrt_rho*alpha_s*a*beta_dB;
444 Rc[
RHO][
k] = alpha_f;
445 EXPAND( Rc[
MXn][k] = alpha_f*lambda[k]; ,
446 Rc[
MXt][
k] = alpha_f*v - scrh*beta_y; ,
447 Rc[
MXb][
k] = alpha_f*w - scrh*beta_z; )
453 Rc[ENG][k] = alpha_f*(Hgas + u*cf) - scrh*beta_v
454 + alpha_s*a*Btmag/sqrt_rho;
456 #if BACKGROUND_FIELD == YES
457 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
460 eta[
k] = alpha_f*(X*dV[
RHO] + dV[PRS]) - rho*scrh*beta_dv
461 + rho*alpha_f*cf*dV[
VXn] + sqrt_rho*alpha_s*a*beta_dB;
462 #elif EOS == ISOTHERMAL
463 eta[
k] = alpha_f*(0.*X + a2)*dV[
RHO] - rho*scrh*beta_dv
464 + rho*alpha_f*cf*dV[
VXn] + sqrt_rho*alpha_s*a*beta_dB;
478 EXPAND( Rc[
MXn][k] = u; ,
481 Rc[ENG][k] = 0.5*vel2 + (
g_gamma - 2.0)/g1*
X;
483 eta[
k] = ((a2 -
X)*dV[
RHO] - dV[PRS])/a2;
506 #if DIVB_CONTROL == EIGHT_WAVES
510 Rc[
BXn][
k] = eta[
k] = 0.0;
520 scrh = alpha_f*cf*sBx;
525 Rc[
RHO][
k] = alpha_s;
526 EXPAND( Rc[
MXn][k] = alpha_s*lambda[k]; ,
527 Rc[
MXt][
k] = alpha_s*v - scrh*beta_y; ,
528 Rc[
MXb][
k] = alpha_s*w - scrh*beta_z;)
530 Rc[
BXt][k] = - alpha_f*a*beta_y/sqrt_rho; ,
531 Rc[
BXb][
k] = - alpha_f*a*beta_z/sqrt_rho; )
534 Rc[ENG][k] = alpha_s*(Hgas - u*cs) - scrh*beta_v
535 - alpha_f*a*Btmag/sqrt_rho;
536 #if BACKGROUND_FIELD == YES
537 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
540 eta[
k] = alpha_s*(X*dV[
RHO] + dV[PRS]) - rho*scrh*beta_dv
541 - rho*alpha_s*cs*dV[
VXn] - sqrt_rho*alpha_f*a*beta_dB;
542 #elif EOS == ISOTHERMAL
543 eta[
k] = alpha_s*(0.*X + a2)*dV[
RHO] - rho*scrh*beta_dv
544 - rho*alpha_s*cs*dV[
VXn] - sqrt_rho*alpha_f*a*beta_dB;
556 Rc[
RHO][
k] = alpha_s;
557 EXPAND(Rc[
MXn][k] = alpha_s*lambda[k]; ,
558 Rc[
MXt][
k] = alpha_s*v + scrh*beta_y; ,
559 Rc[
MXb][
k] = alpha_s*w + scrh*beta_z; )
561 Rc[
BXt][k] = Rc[
BXt][KSLOWM]; ,
565 Rc[ENG][k] = alpha_s*(Hgas + u*cs) + scrh*beta_v
566 - alpha_f*a*Btmag/sqrt_rho;
567 #if BACKGROUND_FIELD == YES
568 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
571 eta[
k] = alpha_s*(X*dV[
RHO] + dV[PRS]) + rho*scrh*beta_dv
572 + rho*alpha_s*cs*dV[
VXn] - sqrt_rho*alpha_f*a*beta_dB;
573 #elif EOS == ISOTHERMAL
574 eta[
k] = alpha_s*(0.*X + a2)*dV[
RHO] + rho*scrh*beta_dv
575 + rho*alpha_s*cs*dV[
VXn] - sqrt_rho*alpha_f*a*beta_dB;
591 Rc[
MXt][
k] = - rho*beta_z;
592 Rc[
MXb][
k] = + rho*beta_y;
593 Rc[
BXt][
k] = - sBx*sqrt_rho*beta_z;
594 Rc[
BXb][
k] = sBx*sqrt_rho*beta_y;
596 Rc[ENG][
k] = - rho*(v*beta_z - w*beta_y);
597 #if BACKGROUND_FIELD == YES
598 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
602 eta[
k] = + beta_y*dV[
VXb] - beta_z*dV[
VXt]
603 + sBx/sqrt_rho*(beta_y*dV[
BXb] - beta_z*dV[
BXt]);
614 Rc[
MXt][
k] = - Rc[
MXt][KALFVM];
615 Rc[
MXb][
k] = - Rc[
MXb][KALFVM];
619 Rc[ENG][
k] = - Rc[ENG][KALFVM];
620 #if BACKGROUND_FIELD == YES
621 Rc[ENG][
k] -= B0y*Rc[
BXt][
k] + B0z*Rc[
BXb][
k];
625 eta[
k] = - beta_y*dV[
VXb] + beta_z*dV[
VXt]
626 + sBx/sqrt_rho*(beta_y*dV[
BXb] - beta_z*dV[
BXt]);
635 cmax[
i] = fabs (u) + cf;
637 for (k = 0; k <
NFLX; k++) alambda[k] = fabs(lambda[k]);
643 if (alambda[
KFASTM] < 0.5*delta) {
646 if (alambda[
KFASTP] < 0.5*delta) {
650 if (alambda[KSLOWM] < 0.5*delta) {
651 alambda[KSLOWM] = lambda[KSLOWM]*lambda[KSLOWM]/delta + 0.25*delta;
653 if (alambda[KSLOWP] < 0.5*delta) {
654 alambda[KSLOWP] = lambda[KSLOWP]*lambda[KSLOWP]/delta + 0.25*delta;
662 for (nv = 0; nv <
NFLX; nv++) {
664 for (k = 0; k <
NFLX; k++) {
665 scrh += alambda[
k]*eta[
k]*Rc[nv][
k];
667 state->
flux[
i][nv] = 0.5*(fL[
i][nv] + fR[
i][nv] -
scrh);
669 state->
press[
i] = 0.5*(pL[
i] + pR[
i]);
676 #if CHECK_ROE_MATRIX == YES
677 for (nv = 0; nv <
NFLX; nv++){
678 dV[nv] = fR[
i][nv] - fL[
i][nv];
679 if (nv ==
MXn) dV[
MXn] += pR[
i] - pL[
i];
680 for (k = 0; k <
NFLX; k++){
681 dV[nv] -= Rc[nv][
k]*eta[
k]*lambda[
k];
683 if (fabs(dV[nv]) > 1.e-4){
684 printf (
" ! Roe matrix condition not satisfied, var = %d\n", nv);
685 printf (
" ! Err = %12.6e\n",dV[nv]);
708 #if HLL_HYBRIDIZATION == YES
710 if (SL[i] < 0.0 && SR[i] > 0.0){
717 #if EOS == ISOTHERMAL
719 ifail = (Uv[
RHO] < 0.0);
721 for (nv = NFLX; nv--; ){
722 Uv[nv] = uL[nv] + (state->
flux[
i][nv] - fL[
i][nv])/SL[i];
728 pr = Uv[ENG] - 0.5*vel2/Uv[
RHO] - 0.5*b2;
729 ifail = (pr < 0.0) || (Uv[
RHO] < 0.0);
736 #if EOS == ISOTHERMAL
738 ifail = (Uv[
RHO] < 0.0);
740 for (nv = NFLX; nv--; ){
741 Uv[nv] = uR[nv] + (state->
flux[
i][nv] - fR[
i][nv])/SR[i];
747 pr = Uv[ENG] - 0.5*vel2/Uv[
RHO] - 0.5*b2;
748 ifail = (pr < 0.0) || (Uv[
RHO] < 0.0);
758 #if EOS == ISOTHERMAL
759 scrh = fabs(vL[
RHO] - vR[
RHO]);
760 scrh /=
MIN(vL[
RHO], vR[RHO]);
762 scrh = fabs(vL[PRS] - vR[PRS]);
763 scrh /=
MIN(vL[PRS], vR[PRS]);
765 if (scrh > 1.0 && (vR[
VXn] < vL[
VXn])) ifail = 1;
769 scrh = 1.0/(SR[
i] - SL[
i]);
770 for (nv = 0; nv <
NFLX; nv++) {
771 state->
flux[
i][nv] = SL[
i]*SR[
i]*(uR[nv] - uL[nv]) +
772 SR[i]*fL[i][nv] - SL[i]*fR[i][nv];
775 state->
press[
i] = (SR[
i]*pL[
i] - SL[
i]*pR[
i])*scrh;
785 #if DIVB_CONTROL == EIGHT_WAVES
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 print1(const char *fmt,...)
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 g_maxMach
The maximum Mach number computed during integration.
double * SL
Leftmost velocity in the Riemann fan at i+1/2.
void Roe_DivBSource(const State_1D *state, int is, int ie, Grid *grid)
void print(const char *fmt,...)
double ** uR
same as vR, in conservative vars
#define ARRAY_1D(nx, type)
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)
double glm_ch
The propagation speed of divergence error.
#define QUIT_PLUTO(e_code)
double ** uL
same as vL, in conservative vars