Skip to content

Commit 66a6a8c

Browse files
sbryngelsonclaude
andcommitted
Fix MUSCL THINC right-state using already-overwritten left-state values
The right reconstruction divides by left-state values that were already overwritten during left reconstruction. Save original density ratios (contxb/advxb and contxe/(1-advxb)) before left reconstruction and reuse them for both left and right states. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 84c46e0 commit 66a6a8c

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/simulation/m_muscl.fpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,12 @@ contains
248248
integer :: j, k, l
249249

250250
real(wp) :: aCL, aCR, aC, aTHINC, qmin, qmax, A, B, C, sign, moncon
251+
real(wp) :: rho_b, rho_e
251252

252253
#:for MUSCL_DIR, XYZ in [(1, 'x'), (2, 'y'), (3, 'z')]
253254
if (muscl_dir == ${MUSCL_DIR}$) then
254255

255-
$:GPU_PARALLEL_LOOP(collapse=3,private='[j,k,l,aCL,aC,aCR,aTHINC,moncon,sign,qmin,qmax]')
256+
$:GPU_PARALLEL_LOOP(collapse=3,private='[j,k,l,aCL,aC,aCR,aTHINC,moncon,sign,qmin,qmax,rho_b,rho_e]')
256257
do l = is3_muscl%beg, is3_muscl%end
257258
do k = is2_muscl%beg, is2_muscl%end
258259
do j = is1_muscl%beg, is1_muscl%end
@@ -278,25 +279,25 @@ contains
278279
B = exp(sign*ic_beta*(2._wp*C - 1._wp))
279280
A = (B/cosh(ic_beta) - 1._wp)/tanh(ic_beta)
280281

282+
! Save original density ratios before THINC overwrites them
283+
rho_b = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/vL_rs_vf_${XYZ}$ (j, k, l, advxb)
284+
rho_e = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))
285+
281286
! Left reconstruction
282287
aTHINC = qmin + 5e-1_wp*qmax*(1._wp + sign*A)
283288
if (aTHINC < ic_eps) aTHINC = ic_eps
284289
if (aTHINC > 1 - ic_eps) aTHINC = 1 - ic_eps
285-
vL_rs_vf_${XYZ}$ (j, k, l, contxb) = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/ &
286-
vL_rs_vf_${XYZ}$ (j, k, l, advxb)*aTHINC
287-
vL_rs_vf_${XYZ}$ (j, k, l, contxe) = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/ &
288-
(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))*(1._wp - aTHINC)
290+
vL_rs_vf_${XYZ}$ (j, k, l, contxb) = rho_b*aTHINC
291+
vL_rs_vf_${XYZ}$ (j, k, l, contxe) = rho_e*(1._wp - aTHINC)
289292
vL_rs_vf_${XYZ}$ (j, k, l, advxb) = aTHINC
290293
vL_rs_vf_${XYZ}$ (j, k, l, advxe) = 1 - aTHINC
291294

292295
! Right reconstruction
293296
aTHINC = qmin + 5e-1_wp*qmax*(1._wp + sign*(tanh(ic_beta) + A)/(1._wp + A*tanh(ic_beta)))
294297
if (aTHINC < ic_eps) aTHINC = ic_eps
295298
if (aTHINC > 1 - ic_eps) aTHINC = 1 - ic_eps
296-
vR_rs_vf_${XYZ}$ (j, k, l, contxb) = vL_rs_vf_${XYZ}$ (j, k, l, contxb)/ &
297-
vL_rs_vf_${XYZ}$ (j, k, l, advxb)*aTHINC
298-
vR_rs_vf_${XYZ}$ (j, k, l, contxe) = vL_rs_vf_${XYZ}$ (j, k, l, contxe)/ &
299-
(1._wp - vL_rs_vf_${XYZ}$ (j, k, l, advxb))*(1._wp - aTHINC)
299+
vR_rs_vf_${XYZ}$ (j, k, l, contxb) = rho_b*aTHINC
300+
vR_rs_vf_${XYZ}$ (j, k, l, contxe) = rho_e*(1._wp - aTHINC)
300301
vR_rs_vf_${XYZ}$ (j, k, l, advxb) = aTHINC
301302
vR_rs_vf_${XYZ}$ (j, k, l, advxe) = 1 - aTHINC
302303

0 commit comments

Comments
 (0)