Skip to content

Commit 0e3ca3d

Browse files
committed
Removed a degeneracy check from the HLLD and LHLLD Riemann Solvers.
It turned out that we should not remove the double-star states even when the normal magnetic field bx is very weak. If this branch is selected when bx is actually non-zero, it may return unphysical flux. I do not think this has affected many people, as this is problematic only when the magnetic fields are very weak and the flow is not smooth. The probability that this branch is selected is very low in a realistic flow. Thanks to Kazunari Iwasaki.
1 parent 1591aab commit 0e3ca3d

File tree

2 files changed

+91
-101
lines changed

2 files changed

+91
-101
lines changed

src/hydro/rsolvers/mhd/hlld.cpp

+45-50
Original file line numberDiff line numberDiff line change
@@ -237,46 +237,41 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
237237
urst.e = (sdr*ur.e - ptr*wri[IVX] + ptst*spd[2] +
238238
bxi*(wri[IVX]*bxi + (wri[IVY]*ur.by + wri[IVZ]*ur.bz) - vbstr))*sdmr_inv;
239239
// ul** and ur** - if Bx is near zero, same as *-states
240-
if (0.5*bxsq < (SMALL_NUMBER)*ptst) {
241-
uldst = ulst;
242-
urdst = urst;
243-
} else {
244-
Real invsumd = 1.0/(sqrtdl + sqrtdr);
245-
Real bxsig = (bxi > 0.0 ? 1.0 : -1.0);
246-
247-
uldst.d = ulst.d;
248-
urdst.d = urst.d;
249-
250-
uldst.mx = ulst.mx;
251-
urdst.mx = urst.mx;
252-
253-
// eqn (59) of M&K
254-
Real tmp = invsumd*(sqrtdl*(ulst.my*ulst_d_inv) + sqrtdr*(urst.my*urst_d_inv) +
255-
bxsig*(urst.by - ulst.by));
256-
uldst.my = uldst.d * tmp;
257-
urdst.my = urdst.d * tmp;
258-
259-
// eqn (60) of M&K
260-
tmp = invsumd*(sqrtdl*(ulst.mz*ulst_d_inv) + sqrtdr*(urst.mz*urst_d_inv) +
261-
bxsig*(urst.bz - ulst.bz));
262-
uldst.mz = uldst.d * tmp;
263-
urdst.mz = urdst.d * tmp;
264-
265-
// eqn (61) of M&K
266-
tmp = invsumd*(sqrtdl*urst.by + sqrtdr*ulst.by +
267-
bxsig*sqrtdl*sqrtdr*((urst.my*urst_d_inv) - (ulst.my*ulst_d_inv)));
268-
uldst.by = urdst.by = tmp;
269-
270-
// eqn (62) of M&K
271-
tmp = invsumd*(sqrtdl*urst.bz + sqrtdr*ulst.bz +
272-
bxsig*sqrtdl*sqrtdr*((urst.mz*urst_d_inv) - (ulst.mz*ulst_d_inv)));
273-
uldst.bz = urdst.bz = tmp;
274-
275-
// eqn (63) of M&K
276-
tmp = spd[2]*bxi + (uldst.my*uldst.by + uldst.mz*uldst.bz)/uldst.d;
277-
uldst.e = ulst.e - sqrtdl*bxsig*(vbstl - tmp);
278-
urdst.e = urst.e + sqrtdr*bxsig*(vbstr - tmp);
279-
}
240+
Real invsumd = 1.0/(sqrtdl + sqrtdr);
241+
Real bxsig = (bxi > 0.0 ? 1.0 : -1.0);
242+
243+
uldst.d = ulst.d;
244+
urdst.d = urst.d;
245+
246+
uldst.mx = ulst.mx;
247+
urdst.mx = urst.mx;
248+
249+
// eqn (59) of M&K
250+
Real tmp = invsumd*(sqrtdl*(ulst.my*ulst_d_inv) + sqrtdr*(urst.my*urst_d_inv) +
251+
bxsig*(urst.by - ulst.by));
252+
uldst.my = uldst.d * tmp;
253+
urdst.my = urdst.d * tmp;
254+
255+
// eqn (60) of M&K
256+
tmp = invsumd*(sqrtdl*(ulst.mz*ulst_d_inv) + sqrtdr*(urst.mz*urst_d_inv) +
257+
bxsig*(urst.bz - ulst.bz));
258+
uldst.mz = uldst.d * tmp;
259+
urdst.mz = urdst.d * tmp;
260+
261+
// eqn (61) of M&K
262+
tmp = invsumd*(sqrtdl*urst.by + sqrtdr*ulst.by +
263+
bxsig*sqrtdl*sqrtdr*((urst.my*urst_d_inv) - (ulst.my*ulst_d_inv)));
264+
uldst.by = urdst.by = tmp;
265+
266+
// eqn (62) of M&K
267+
tmp = invsumd*(sqrtdl*urst.bz + sqrtdr*ulst.bz +
268+
bxsig*sqrtdl*sqrtdr*((urst.mz*urst_d_inv) - (ulst.mz*ulst_d_inv)));
269+
uldst.bz = urdst.bz = tmp;
270+
271+
// eqn (63) of M&K
272+
tmp = spd[2]*bxi + (uldst.my*uldst.by + uldst.mz*uldst.bz)/uldst.d;
273+
uldst.e = ulst.e - sqrtdl*bxsig*(vbstl - tmp);
274+
urdst.e = urst.e + sqrtdr*bxsig*(vbstr - tmp);
280275

281276
//--- Step 6. Compute flux
282277
uldst.d = spd[1] * (uldst.d - ulst.d);
@@ -338,6 +333,15 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
338333
flxi[IEN] = fl.e + ulst.e;
339334
flxi[IBY] = fl.by + ulst.by;
340335
flxi[IBZ] = fl.bz + ulst.bz;
336+
} else if (spd[3] <= 0.0) {
337+
// return Fr*
338+
flxi[IDN] = fr.d + urst.d;
339+
flxi[IVX] = fr.mx + urst.mx;
340+
flxi[IVY] = fr.my + urst.my;
341+
flxi[IVZ] = fr.mz + urst.mz;
342+
flxi[IEN] = fr.e + urst.e;
343+
flxi[IBY] = fr.by + urst.by;
344+
flxi[IBZ] = fr.bz + urst.bz;
341345
} else if (spd[2] >= 0.0) {
342346
// return Fl**
343347
flxi[IDN] = fl.d + ulst.d + uldst.d;
@@ -347,7 +351,7 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
347351
flxi[IEN] = fl.e + ulst.e + uldst.e;
348352
flxi[IBY] = fl.by + ulst.by + uldst.by;
349353
flxi[IBZ] = fl.bz + ulst.bz + uldst.bz;
350-
} else if (spd[3] > 0.0) {
354+
} else {
351355
// return Fr**
352356
flxi[IDN] = fr.d + urst.d + urdst.d;
353357
flxi[IVX] = fr.mx + urst.mx + urdst.mx;
@@ -356,15 +360,6 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
356360
flxi[IEN] = fr.e + urst.e + urdst.e;
357361
flxi[IBY] = fr.by + urst.by + urdst.by;
358362
flxi[IBZ] = fr.bz + urst.bz + urdst.bz;
359-
} else {
360-
// return Fr*
361-
flxi[IDN] = fr.d + urst.d;
362-
flxi[IVX] = fr.mx + urst.mx;
363-
flxi[IVY] = fr.my + urst.my;
364-
flxi[IVZ] = fr.mz + urst.mz;
365-
flxi[IEN] = fr.e + urst.e;
366-
flxi[IBY] = fr.by + urst.by;
367-
flxi[IBZ] = fr.bz + urst.bz;
368363
}
369364

370365
flx(IDN,k,j,i) = flxi[IDN];

src/hydro/rsolvers/mhd/lhlld.cpp

+46-51
Original file line numberDiff line numberDiff line change
@@ -242,47 +242,42 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
242242
// (KGF): group transverse by, bz terms for floating-point associativity symmetry
243243
urst.e = (sdr*ur.e - ptr*wri[IVX] + ptst*spd[2] +
244244
bxi*(wri[IVX]*bxi + (wri[IVY]*ur.by + wri[IVZ]*ur.bz) - vbstr))*sdmr_inv;
245-
// ul** and ur** - if Bx is near zero, same as *-states
246-
if (0.5*bxsq < (SMALL_NUMBER)*ptst) {
247-
uldst = ulst;
248-
urdst = urst;
249-
} else {
250-
Real invsumd = 1.0/(sqrtdl + sqrtdr);
251-
Real bxsig = (bxi > 0.0 ? 1.0 : -1.0);
252-
253-
uldst.d = ulst.d;
254-
urdst.d = urst.d;
255-
256-
uldst.mx = ulst.mx;
257-
urdst.mx = urst.mx;
258-
259-
// eqn (59) of M&K
260-
Real tmp = invsumd*(sqrtdl*(ulst.my*ulst_d_inv) + sqrtdr*(urst.my*urst_d_inv) +
261-
bxsig*(urst.by - ulst.by));
262-
uldst.my = uldst.d * tmp;
263-
urdst.my = urdst.d * tmp;
264-
265-
// eqn (60) of M&K
266-
tmp = invsumd*(sqrtdl*(ulst.mz*ulst_d_inv) + sqrtdr*(urst.mz*urst_d_inv) +
267-
bxsig*(urst.bz - ulst.bz));
268-
uldst.mz = uldst.d * tmp;
269-
urdst.mz = urdst.d * tmp;
270-
271-
// eqn (61) of M&K
272-
tmp = invsumd*(sqrtdl*urst.by + sqrtdr*ulst.by +
273-
bxsig*sqrtdl*sqrtdr*((urst.my*urst_d_inv) - (ulst.my*ulst_d_inv)));
274-
uldst.by = urdst.by = tmp;
275-
276-
// eqn (62) of M&K
277-
tmp = invsumd*(sqrtdl*urst.bz + sqrtdr*ulst.bz +
278-
bxsig*sqrtdl*sqrtdr*((urst.mz*urst_d_inv) - (ulst.mz*ulst_d_inv)));
279-
uldst.bz = urdst.bz = tmp;
280-
281-
// eqn (63) of M&K
282-
tmp = spd[2]*bxi + (uldst.my*uldst.by + uldst.mz*uldst.bz)/uldst.d;
283-
uldst.e = ulst.e - sqrtdl*bxsig*(vbstl - tmp);
284-
urdst.e = urst.e + sqrtdr*bxsig*(vbstr - tmp);
285-
}
245+
246+
Real invsumd = 1.0/(sqrtdl + sqrtdr);
247+
Real bxsig = (bxi > 0.0 ? 1.0 : -1.0);
248+
249+
uldst.d = ulst.d;
250+
urdst.d = urst.d;
251+
252+
uldst.mx = ulst.mx;
253+
urdst.mx = urst.mx;
254+
255+
// eqn (59) of M&K
256+
Real tmp = invsumd*(sqrtdl*(ulst.my*ulst_d_inv) + sqrtdr*(urst.my*urst_d_inv) +
257+
bxsig*(urst.by - ulst.by));
258+
uldst.my = uldst.d * tmp;
259+
urdst.my = urdst.d * tmp;
260+
261+
// eqn (60) of M&K
262+
tmp = invsumd*(sqrtdl*(ulst.mz*ulst_d_inv) + sqrtdr*(urst.mz*urst_d_inv) +
263+
bxsig*(urst.bz - ulst.bz));
264+
uldst.mz = uldst.d * tmp;
265+
urdst.mz = urdst.d * tmp;
266+
267+
// eqn (61) of M&K
268+
tmp = invsumd*(sqrtdl*urst.by + sqrtdr*ulst.by +
269+
bxsig*sqrtdl*sqrtdr*((urst.my*urst_d_inv) - (ulst.my*ulst_d_inv)));
270+
uldst.by = urdst.by = tmp;
271+
272+
// eqn (62) of M&K
273+
tmp = invsumd*(sqrtdl*urst.bz + sqrtdr*ulst.bz +
274+
bxsig*sqrtdl*sqrtdr*((urst.mz*urst_d_inv) - (ulst.mz*ulst_d_inv)));
275+
uldst.bz = urdst.bz = tmp;
276+
277+
// eqn (63) of M&K
278+
tmp = spd[2]*bxi + (uldst.my*uldst.by + uldst.mz*uldst.bz)/uldst.d;
279+
uldst.e = ulst.e - sqrtdl*bxsig*(vbstl - tmp);
280+
urdst.e = urst.e + sqrtdr*bxsig*(vbstr - tmp);
286281

287282
//--- Step 6. Compute flux
288283
uldst.d = spd[1] * (uldst.d - ulst.d);
@@ -344,6 +339,15 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
344339
flxi[IEN] = fl.e + ulst.e;
345340
flxi[IBY] = fl.by + ulst.by;
346341
flxi[IBZ] = fl.bz + ulst.bz;
342+
} else if (spd[3] <= 0.0) {
343+
// return Fr*
344+
flxi[IDN] = fr.d + urst.d;
345+
flxi[IVX] = fr.mx + urst.mx;
346+
flxi[IVY] = fr.my + urst.my;
347+
flxi[IVZ] = fr.mz + urst.mz;
348+
flxi[IEN] = fr.e + urst.e;
349+
flxi[IBY] = fr.by + urst.by;
350+
flxi[IBZ] = fr.bz + urst.bz;
347351
} else if (spd[2] >= 0.0) {
348352
// return Fl**
349353
flxi[IDN] = fl.d + ulst.d + uldst.d;
@@ -353,7 +357,7 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
353357
flxi[IEN] = fl.e + ulst.e + uldst.e;
354358
flxi[IBY] = fl.by + ulst.by + uldst.by;
355359
flxi[IBZ] = fl.bz + ulst.bz + uldst.bz;
356-
} else if (spd[3] > 0.0) {
360+
} else {
357361
// return Fr**
358362
flxi[IDN] = fr.d + urst.d + urdst.d;
359363
flxi[IVX] = fr.mx + urst.mx + urdst.mx;
@@ -362,15 +366,6 @@ void Hydro::RiemannSolver(const int k, const int j, const int il, const int iu,
362366
flxi[IEN] = fr.e + urst.e + urdst.e;
363367
flxi[IBY] = fr.by + urst.by + urdst.by;
364368
flxi[IBZ] = fr.bz + urst.bz + urdst.bz;
365-
} else {
366-
// return Fr*
367-
flxi[IDN] = fr.d + urst.d;
368-
flxi[IVX] = fr.mx + urst.mx;
369-
flxi[IVY] = fr.my + urst.my;
370-
flxi[IVZ] = fr.mz + urst.mz;
371-
flxi[IEN] = fr.e + urst.e;
372-
flxi[IBY] = fr.by + urst.by;
373-
flxi[IBZ] = fr.bz + urst.bz;
374369
}
375370

376371
flx(IDN,k,j,i) = flxi[IDN];

0 commit comments

Comments
 (0)