Fix potential division by zero in reta_val calculation and enable NaN checks
Added a safety check for the denominator in the reta_val calculation to prevent division by zero when chi approaches zero (e.g., at far-field boundaries). Also enabled DEBUG_NAN_CHECK macro to catch invalid inputs early. Initialized output arrays to zero to prevent uninitialized memory access.
This commit is contained in:
@@ -88,10 +88,30 @@ contains
|
||||
idy = ONE/dY_val
|
||||
idz = ONE/dZ_val
|
||||
|
||||
! Initialize outputs to zero
|
||||
chi_rhs = ZEO; trK_rhs = ZEO
|
||||
gxx_rhs = ZEO; gxy_rhs = ZEO; gxz_rhs = ZEO
|
||||
gyy_rhs = ZEO; gyz_rhs = ZEO; gzz_rhs = ZEO
|
||||
Axx_rhs = ZEO; Axy_rhs = ZEO; Axz_rhs = ZEO
|
||||
Ayy_rhs = ZEO; Ayz_rhs = ZEO; Azz_rhs = ZEO
|
||||
Gamx_rhs = ZEO; Gamy_rhs = ZEO; Gamz_rhs = ZEO
|
||||
Lap_rhs = ZEO; betax_rhs = ZEO; betay_rhs = ZEO; betaz_rhs = ZEO
|
||||
dtSfx_rhs = ZEO; dtSfy_rhs = ZEO; dtSfz_rhs = ZEO
|
||||
Gamxxx = ZEO; Gamxxy = ZEO; Gamxxz = ZEO
|
||||
Gamxyy = ZEO; Gamxyz = ZEO; Gamxzz = ZEO
|
||||
Gamyxx = ZEO; Gamyxy = ZEO; Gamyxz = ZEO
|
||||
Gamyyy = ZEO; Gamyyz = ZEO; Gamyzz = ZEO
|
||||
Gamzxx = ZEO; Gamzxy = ZEO; Gamzxz = ZEO
|
||||
Gamzyy = ZEO; Gamzyz = ZEO; Gamzzz = ZEO
|
||||
Rxx = ZEO; Rxy = ZEO; Rxz = ZEO
|
||||
Ryy = ZEO; Ryz = ZEO; Rzz = ZEO
|
||||
|
||||
! Optimization 1: NaN Check
|
||||
#define DEBUG_NAN_CHECK
|
||||
#ifdef DEBUG_NAN_CHECK
|
||||
dX_check = sum(chi)+sum(trK)+sum(dxx)+sum(gxy)+sum(gxz)+sum(dyy)+sum(gyz)+sum(dzz)
|
||||
if(dX_check.ne.dX_check) then
|
||||
write(*,*) "bssn_rhs_opt: NaN detected in input variables!"
|
||||
gont = 1
|
||||
return
|
||||
endif
|
||||
@@ -152,7 +172,7 @@ contains
|
||||
real*8 :: gxy2, gxz2, gyz2 ! For optimized matrix inversion
|
||||
real*8 :: term_xx1, term_xx2, term_yy1, term_yy2, term_zz1, term_zz2 ! For Christoffel CSE
|
||||
real*8 :: term_xy, term_xz, term_yz
|
||||
real*8 :: reta_val
|
||||
real*8 :: reta_val, denom
|
||||
|
||||
nx = ie - is + 1
|
||||
ny = je - js + 1
|
||||
@@ -642,7 +662,14 @@ contains
|
||||
! reta calculation using chix... computed in Step 1
|
||||
reta_val = gupxx(ii,jj,kk)*chix(ii,jj,kk)**2 + gupyy(ii,jj,kk)*chiy(ii,jj,kk)**2 + gupzz(ii,jj,kk)*chiz(ii,jj,kk)**2 + &
|
||||
TWO*(gupxy(ii,jj,kk)*chix(ii,jj,kk)*chiy(ii,jj,kk) + gupxz(ii,jj,kk)*chix(ii,jj,kk)*chiz(ii,jj,kk) + gupyz(ii,jj,kk)*chiy(ii,jj,kk)*chiz(ii,jj,kk))
|
||||
reta_val = 1.31d0/TWO * sqrt(reta_val/chin1) / (ONE - sqrt(chin1))**2
|
||||
|
||||
if (chin1 > 1.0d-10) then
|
||||
denom = ONE - sqrt(chin1)
|
||||
if (abs(denom) < 1.0d-15) denom = 1.0d-15
|
||||
reta_val = 1.31d0/TWO * sqrt(max(reta_val, ZEO)/chin1) / denom**2
|
||||
else
|
||||
reta_val = ZEO
|
||||
endif
|
||||
|
||||
dtSfx_rhs(ig,jg,kg) = Gamx_rhs(ig,jg,kg) - reta_val*dtSfx(ig,jg,kg)
|
||||
dtSfy_rhs(ig,jg,kg) = Gamy_rhs(ig,jg,kg) - reta_val*dtSfy(ig,jg,kg)
|
||||
|
||||
Reference in New Issue
Block a user