Solve the Riemann problem using the HLLD Riemann solver.
89 static double **fluxL, **fluxR;
90 static double *pL, *pR, *a2L, *a2R, *hL, *hR;
91 static double **Uhll, **Fhll, **Vhll;
92 double *vL, *vR, *fL, *fR, *uL, *uR, *SL, *SR;
93 static double **VL, **VR, **UL, **UR;
95 double p0, f0, p, f, dp, dS_1;
105 #if COUNT_FAILURES == YES
106 static double totfail=0.0,totzones=1.0;
107 static int last_step = -1;
111 fp = fopen(
"hlld_fails.dat",
"w");
112 fprintf (fp,
"# Step Failures (x 100) \n");
113 fprintf (fp,
"# --------------------------\n");
118 MPI_Allreduce (&totfail, &scrh, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
120 MPI_Allreduce (&totzones, &scrh, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
124 fp = fopen(
"hlld_fails.dat",
"a+");
125 fprintf (fp,
" %d %f\n",
g_stepNumber, totfail/totzones*100.);
128 totfail = totzones = 0.0;
164 GLM_Solve (state, VL, VR, beg, end, grid);
168 VL = state->
vL; UL = state->
uL;
169 VR = state->
vR; UR = state->
uR;
179 Flux (UL, VL, hL, fluxL, pL, beg, end);
180 Flux (UR, VR, hR, fluxR, pR, beg, end);
184 SL = state->
SL; SR = state->
SR;
185 HLL_Speed (VL, VR, a2L, a2R, hL, hR, SL, SR, beg, end);
191 for (i = beg; i <= end; i++) {
194 if (!(grid[
IDIR].x[i] < 0.5 && grid[
IDIR].x[i+1] > 0.5))
continue;
197 #if COUNT_FAILURES == YES
201 scrh =
MAX(fabs(SL[i]), fabs(SR[i]));
204 vL = VL[
i]; vR = VR[
i]; fR = fluxR[
i];
205 uL = UL[
i]; uR = UR[
i]; fL = fluxL[
i];
209 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fL[nv];
210 state->
press[i] = pL[i];
212 }
else if (SR[i] <= 0.0){
214 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = fR[nv];
215 state->
press[i] = pR[i];
221 dS_1 = 1.0/(SR[
i] - SL[
i]);
222 for (nv =
NFLX; nv--; ){
224 Uhll[
i][nv] = SR[
i]*uR[nv] - SL[
i]*uL[nv] + fL[nv] - fR[nv];
227 Fhll[
i][nv] = SR[
i]*fL[nv] - SL[
i]*fR[nv] + SL[
i]*SR[
i]*(uR[nv] - uL[nv]);
230 Uhll[
i][
MXn] += (pL[
i] - pR[
i])*dS_1;
233 double vxR = vR[
VXn];
234 double vxL = vL[
VXn];
235 Uhll[
i][nv] = (SR[
i] - vxR)*uR[nv] - (SL[i] - vxL)*uL[nv];
238 Fhll[
i][nv] = SR[
i]*uL[nv]*vL[
VXn] - SL[
i]*uR[nv]*vR[
VXn]
239 + SL[
i]*SR[
i]*(uR[nv] - uL[nv]);
246 #if SHOCK_FLATTENING == MULTID
248 for (nv =
NFLX; nv--; ) state->
flux[i][nv] = Fhll[i][nv];
249 state->
press[i] = (SR[i]*pL[i] - SL[i]*pR[i])*dS_1;
259 for (nv = 0; nv <
NFLX; nv++){
260 PaL.
R[nv] = SL[
i]*uL[nv] - fL[nv];
261 PaR.
R[nv] = SR[
i]*uR[nv] - fR[nv];
265 #if RMHD_REDUCED_ENERGY == YES
266 PaL.
R[ENG] += PaL.
R[
RHO];
267 PaR.
R[ENG] += PaR.
R[
RHO];
272 scrh =
MAX(pL[i], pR[i]);
273 if (
Bx*
Bx/scrh < 0.01) {
277 b = PaR.
R[ENG] - PaL.
R[ENG] + SR[
i]*PaL.
R[
MXn] - SL[
i]*PaR.
R[
MXn];
278 c = PaL.
R[
MXn]*PaR.
R[ENG] - PaR.
R[
MXn]*PaL.
R[ENG];
279 scrh = b*b - 4.0*a*
c;
280 scrh =
MAX(scrh,0.0);
281 p0 = 0.5*(- b + sqrt(scrh))*dS_1;
294 if (f0 != f0 || PaL.
fail) switch_to_hll = 1;
299 if (fabs(f0) > 1.e-12 && !switch_to_hll){
300 p = 1.025*p0; f = f0;
304 printf (
"k = %d, p = %12.6e, f = %12.6e\n",k,p,f);
308 if (f != f || PaL.
fail || (k > 7) || (fabs(f) > fabs(f0) && k > 4)) {
313 dp = (p - p0)/(f - f0)*f;
317 if (p < 0.0) p = 1.e-6;
318 if (fabs(dp) < 1.e-5*p || fabs(f) < 1.e-6)
break;
328 if (PaL.
fail) switch_to_hll = 1;
331 #if COUNT_FAILURES == YES
335 for (nv = NFLX; nv--; ) state->
flux[i][nv] = Fhll[i][nv];
336 state->
press[i] = (SR[i]*pL[i] - SL[i]*pR[i])*dS_1;
348 if (PaL.
Sa >= -1.e-6){
351 #if RMHD_REDUCED_ENERGY == YES
352 PaL.
u[ENG] -= PaL.
u[
RHO];
354 for (nv = NFLX; nv--; ) {
355 state->
flux[
i][nv] = fL[nv] + SL[
i]*(PaL.
u[nv] - uL[nv]);
359 }
else if (PaR.
Sa <= 1.e-6){
362 #if RMHD_REDUCED_ENERGY == YES
363 PaR.
u[ENG] -= PaR.
u[
RHO];
365 for (nv = NFLX; nv--; ) {
366 state->
flux[
i][nv] = fR[nv] + SR[
i]*(PaR.
u[nv] - uR[nv]);
374 #if RMHD_REDUCED_ENERGY == YES
375 PaL.
u[ENG] -= PaL.
u[
RHO];
378 for (nv = NFLX; nv--; ) {
379 state->
flux[
i][nv] = fL[nv] + SL[
i]*(PaL.
u[nv] - uL[nv])
380 + PaL.
Sa*(Uc[nv] - PaL.
u[nv]);
385 #if RMHD_REDUCED_ENERGY == YES
386 PaR.
u[ENG] -= PaR.
u[
RHO];
389 for (nv = NFLX; nv--; ) {
390 state->
flux[
i][nv] = fR[nv] + SR[
i]*(PaR.
u[nv] - uR[nv])
391 + PaR.
Sa*(Uc[nv] - PaR.
u[nv]);
403 #if DIVB_CONTROL == EIGHT_WAVES
409 #undef COUNT_FAILURES
void GLM_Solve(const State_1D *state, double **VL, double **VR, int beg, int end, Grid *grid)
static void HLLD_GetCState(Riemann_State *, Riemann_State *, double, double *)
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.
int g_maxRiemannIter
Maximum number of iterations for iterative Riemann Solver.
double ** vR
Primitive variables to the right of the interface, .
static double HLLD_TotalPressure(double *)
void SoundSpeed2(double **v, double *cs2, double *h, int beg, int end, int pos, Grid *grid)
void HLL_DIVB_SOURCE(const State_1D *, double **, int, int, Grid *)
long int g_stepNumber
Gives the current integration step number.
int ConsToPrim(double **ucons, double **uprim, int ibeg, int iend, unsigned char *flag)
double * SL
Leftmost velocity in the Riemann fan at i+1/2.
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)
static void HLLD_GetAState(Riemann_State *, double p)
static void HLLD_PrintWhatsWrong(Riemann_State *, Riemann_State *, double, double *, double *)
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)
static double HLLD_Fstar(Riemann_State *, Riemann_State *, double)
double ** uL
same as vL, in conservative vars