Skip to content

Commit

Permalink
(*)Parenthesize continuity_PPM curv_3 expressions
Browse files Browse the repository at this point in the history
  Added parentheses to 8 expressions like `curv_3 = h_W(i) + h_E(i) - 2.0*h(i)`
in zonal_flux_layer, zonal_flux_thickness, merid_flux_layer and
merid_flux_thickness, changing them to `curv_3 = (h_W(i) + h_E(i)) - 2.0*h(i)`.
This change is required to give rotational symmetry, but it also is the order
that the Intel, GNU, and Nvidia compliers were all using in these expressions in
tests.  Moreover, had the order of arithmetic ever been anything else, this
would have led to failures in our rotational consistency and redundant point
consistency testing, and almost certainly would have been detected before.
However, by adding these parentheses, there is a remote chance that the addition
of these parentheses could change answers for some compiler or compiler settings
we have never tested before.  This change should not impact any FMA-enabled
calculations.  All answers are bitwise identical in the MOM6-examples regression
suite as run on Gaea.
  • Loading branch information
Hallberg-NOAA committed Feb 29, 2024
1 parent 86c5ed9 commit 1001d36
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions src/core/MOM_continuity_PPM.F90
Original file line number Diff line number Diff line change
Expand Up @@ -937,14 +937,14 @@ subroutine zonal_flux_layer(u, h, h_W, h_E, uh, duhdu, visc_rem, dt, G, US, j, &
if (u(I) > 0.0) then
if (vol_CFL) then ; CFL = (u(I) * dt) * (G%dy_Cu(I,j) * G%IareaT(i,j))
else ; CFL = u(I) * dt * G%IdxT(i,j) ; endif
curv_3 = h_W(i) + h_E(i) - 2.0*h(i)
curv_3 = (h_W(i) + h_E(i)) - 2.0*h(i)
uh(I) = (G%dy_Cu(I,j) * por_face_areaU(I)) * u(I) * &
(h_E(i) + CFL * (0.5*(h_W(i) - h_E(i)) + curv_3*(CFL - 1.5)))
h_marg = h_E(i) + CFL * ((h_W(i) - h_E(i)) + 3.0*curv_3*(CFL - 1.0))
elseif (u(I) < 0.0) then
if (vol_CFL) then ; CFL = (-u(I) * dt) * (G%dy_Cu(I,j) * G%IareaT(i+1,j))
else ; CFL = -u(I) * dt * G%IdxT(i+1,j) ; endif
curv_3 = h_W(i+1) + h_E(i+1) - 2.0*h(i+1)
curv_3 = (h_W(i+1) + h_E(i+1)) - 2.0*h(i+1)
uh(I) = (G%dy_Cu(I,j) * por_face_areaU(I)) * u(I) * &
(h_W(i+1) + CFL * (0.5*(h_E(i+1)-h_W(i+1)) + curv_3*(CFL - 1.5)))
h_marg = h_W(i+1) + CFL * ((h_E(i+1)-h_W(i+1)) + 3.0*curv_3*(CFL - 1.0))
Expand Down Expand Up @@ -1019,13 +1019,13 @@ subroutine zonal_flux_thickness(u, h, h_W, h_E, h_u, dt, G, GV, US, LB, vol_CFL,
if (u(I,j,k) > 0.0) then
if (vol_CFL) then ; CFL = (u(I,j,k) * dt) * (G%dy_Cu(I,j) * G%IareaT(i,j))
else ; CFL = u(I,j,k) * dt * G%IdxT(i,j) ; endif
curv_3 = h_W(i,j,k) + h_E(i,j,k) - 2.0*h(i,j,k)
curv_3 = (h_W(i,j,k) + h_E(i,j,k)) - 2.0*h(i,j,k)
h_avg = h_E(i,j,k) + CFL * (0.5*(h_W(i,j,k) - h_E(i,j,k)) + curv_3*(CFL - 1.5))
h_marg = h_E(i,j,k) + CFL * ((h_W(i,j,k) - h_E(i,j,k)) + 3.0*curv_3*(CFL - 1.0))
elseif (u(I,j,k) < 0.0) then
if (vol_CFL) then ; CFL = (-u(I,j,k)*dt) * (G%dy_Cu(I,j) * G%IareaT(i+1,j))
else ; CFL = -u(I,j,k) * dt * G%IdxT(i+1,j) ; endif
curv_3 = h_W(i+1,j,k) + h_E(i+1,j,k) - 2.0*h(i+1,j,k)
curv_3 = (h_W(i+1,j,k) + h_E(i+1,j,k)) - 2.0*h(i+1,j,k)
h_avg = h_W(i+1,j,k) + CFL * (0.5*(h_E(i+1,j,k)-h_W(i+1,j,k)) + curv_3*(CFL - 1.5))
h_marg = h_W(i+1,j,k) + CFL * ((h_E(i+1,j,k)-h_W(i+1,j,k)) + &
3.0*curv_3*(CFL - 1.0))
Expand Down Expand Up @@ -1832,15 +1832,15 @@ subroutine merid_flux_layer(v, h, h_S, h_N, vh, dvhdv, visc_rem, dt, G, US, J, &
if (v(i) > 0.0) then
if (vol_CFL) then ; CFL = (v(i) * dt) * (G%dx_Cv(i,J) * G%IareaT(i,j))
else ; CFL = v(i) * dt * G%IdyT(i,j) ; endif
curv_3 = h_S(i,j) + h_N(i,j) - 2.0*h(i,j)
curv_3 = (h_S(i,j) + h_N(i,j)) - 2.0*h(i,j)
vh(i) = (G%dx_Cv(i,J)*por_face_areaV(i,J)) * v(i) * ( h_N(i,j) + CFL * &
(0.5*(h_S(i,j) - h_N(i,j)) + curv_3*(CFL - 1.5)) )
h_marg = h_N(i,j) + CFL * ((h_S(i,j) - h_N(i,j)) + &
3.0*curv_3*(CFL - 1.0))
elseif (v(i) < 0.0) then
if (vol_CFL) then ; CFL = (-v(i) * dt) * (G%dx_Cv(i,J) * G%IareaT(i,j+1))
else ; CFL = -v(i) * dt * G%IdyT(i,j+1) ; endif
curv_3 = h_S(i,j+1) + h_N(i,j+1) - 2.0*h(i,j+1)
curv_3 = (h_S(i,j+1) + h_N(i,j+1)) - 2.0*h(i,j+1)
vh(i) = (G%dx_Cv(i,J)*por_face_areaV(i,J)) * v(i) * ( h_S(i,j+1) + CFL * &
(0.5*(h_N(i,j+1)-h_S(i,j+1)) + curv_3*(CFL - 1.5)) )
h_marg = h_S(i,j+1) + CFL * ((h_N(i,j+1)-h_S(i,j+1)) + &
Expand Down Expand Up @@ -1919,14 +1919,14 @@ subroutine meridional_flux_thickness(v, h, h_S, h_N, h_v, dt, G, GV, US, LB, vol
if (v(i,J,k) > 0.0) then
if (vol_CFL) then ; CFL = (v(i,J,k) * dt) * (G%dx_Cv(i,J) * G%IareaT(i,j))
else ; CFL = v(i,J,k) * dt * G%IdyT(i,j) ; endif
curv_3 = h_S(i,j,k) + h_N(i,j,k) - 2.0*h(i,j,k)
curv_3 = (h_S(i,j,k) + h_N(i,j,k)) - 2.0*h(i,j,k)
h_avg = h_N(i,j,k) + CFL * (0.5*(h_S(i,j,k) - h_N(i,j,k)) + curv_3*(CFL - 1.5))
h_marg = h_N(i,j,k) + CFL * ((h_S(i,j,k) - h_N(i,j,k)) + &
3.0*curv_3*(CFL - 1.0))
elseif (v(i,J,k) < 0.0) then
if (vol_CFL) then ; CFL = (-v(i,J,k)*dt) * (G%dx_Cv(i,J) * G%IareaT(i,j+1))
else ; CFL = -v(i,J,k) * dt * G%IdyT(i,j+1) ; endif
curv_3 = h_S(i,j+1,k) + h_N(i,j+1,k) - 2.0*h(i,j+1,k)
curv_3 = (h_S(i,j+1,k) + h_N(i,j+1,k)) - 2.0*h(i,j+1,k)
h_avg = h_S(i,j+1,k) + CFL * (0.5*(h_N(i,j+1,k)-h_S(i,j+1,k)) + curv_3*(CFL - 1.5))
h_marg = h_S(i,j+1,k) + CFL * ((h_N(i,j+1,k)-h_S(i,j+1,k)) + &
3.0*curv_3*(CFL - 1.0))
Expand Down

0 comments on commit 1001d36

Please sign in to comment.