ocean_slopes_pass_y Subroutine

private pure subroutine ocean_slopes_pass_y(nx, ny, nz, eos, rho0, min_dz, h_layer, t_fill, s_fill, e_int, idyCv, wet_v, slope_y, n2_v)

v-face slope + N² pass — mirror of pass_x with v-staggering. The v-face at (i,j) sits between cells (i,j-1) and (i,j); pairs columns js=j-1 (south) and j (north), loop j=2:ny.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
type(eos_t), intent(in) :: eos
real(kind=wp), intent(in) :: rho0
real(kind=wp), intent(in) :: min_dz
real(kind=wp), intent(in) :: h_layer(nx,ny,nz)
real(kind=wp), intent(in) :: t_fill(nx,ny,nz)
real(kind=wp), intent(in) :: s_fill(nx,ny,nz)
real(kind=wp), intent(in) :: e_int(nx,ny,nz+1)
real(kind=wp), intent(in) :: idyCv(nx,ny+1)
real(kind=wp), intent(in) :: wet_v(nx,ny+1)
real(kind=wp), intent(out) :: slope_y(nx,ny+1,nz+1)
real(kind=wp), intent(out) :: n2_v(nx,ny+1,nz+1)

Calls

proc~~ocean_slopes_pass_y~~CallsGraph proc~ocean_slopes_pass_y ocean_slopes_pass_y local local proc~ocean_slopes_pass_y->local proc~eos_density_specvol_derivs eos_density_specvol_derivs proc~ocean_slopes_pass_y->proc~eos_density_specvol_derivs proc~pressure_above_x pressure_above_x proc~ocean_slopes_pass_y->proc~pressure_above_x proc~roquet_spv_point roquet_spv_point proc~eos_density_specvol_derivs->proc~roquet_spv_point

Called by

proc~~ocean_slopes_pass_y~~CalledByGraph proc~ocean_slopes_pass_y ocean_slopes_pass_y proc~ocean_slopes_compute_impl ocean_slopes_compute_impl proc~ocean_slopes_compute_impl->proc~ocean_slopes_pass_y proc~ocean_slopes_compute ocean_slopes_compute proc~ocean_slopes_compute->proc~ocean_slopes_compute_impl proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~ocean_slopes_compute proc~run_stage run_stage proc~run_stage->proc~ocean_slopes_compute proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step_split proc~ocean_dyn_step ocean_dyn_step proc~engine_step->proc~ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_step proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: drdjA
real(kind=wp), private :: drdjB
real(kind=wp), private :: drdkL
real(kind=wp), private :: drdkR
real(kind=wp), private :: drds
real(kind=wp), private :: drdt
real(kind=wp), private :: drdy
real(kind=wp), private :: drdz
real(kind=wp), private :: dsv_ds
real(kind=wp), private :: dsv_dt
real(kind=wp), private :: dzaL
real(kind=wp), private :: dzaR
real(kind=wp), private :: g_rho0
real(kind=wp), private :: haA
real(kind=wp), private :: haB
real(kind=wp), private :: haL
real(kind=wp), private :: haR
real(kind=wp), private :: hg2A
real(kind=wp), private :: hg2B
real(kind=wp), private :: hg2L
real(kind=wp), private :: hg2R
integer, private :: i
integer, private :: j
integer, private :: js
integer, private :: k
integer, private :: ka
integer, private :: kb
real(kind=wp), private :: mag2
real(kind=wp), private :: mask
real(kind=wp), private :: presN
real(kind=wp), private :: presS
real(kind=wp), private :: pres_v
real(kind=wp), private :: rho_v
real(kind=wp), private :: s_v
real(kind=wp), private :: slope
real(kind=wp), private :: t_v
real(kind=wp), private :: wtA
real(kind=wp), private :: wtB
real(kind=wp), private :: wtL
real(kind=wp), private :: wtR

Source Code

   pure subroutine ocean_slopes_pass_y(nx, ny, nz, eos, rho0, min_dz, &
                                       h_layer, t_fill, s_fill, e_int, &
                                       idyCv, wet_v, slope_y, n2_v)
      !! v-face slope + N² pass — mirror of `pass_x` with v-staggering.
      !! The v-face at (i,j) sits between cells (i,j-1) and (i,j); pairs
      !! columns `js=j-1` (south) and `j` (north), loop `j=2:ny`.
      integer, intent(in) :: nx, ny, nz
      type(eos_t), intent(in) :: eos
      real(wp), intent(in) :: rho0, min_dz
      real(wp), intent(in) :: h_layer(nx, ny, nz)
      real(wp), intent(in) :: t_fill(nx, ny, nz)
      real(wp), intent(in) :: s_fill(nx, ny, nz)
      real(wp), intent(in) :: e_int(nx, ny, nz + 1)
      real(wp), intent(in) :: idyCv(nx, ny + 1)
      real(wp), intent(in) :: wet_v(nx, ny + 1)
      real(wp), intent(out) :: slope_y(nx, ny + 1, nz + 1)
      real(wp), intent(out) :: n2_v(nx, ny + 1, nz + 1)

      integer :: i, j, k, js, ka, kb
      real(wp) :: pres_v, t_v, s_v, rho_v, dsv_dt, dsv_ds, drdt, drds
      real(wp) :: drdjA, drdjB, drdkL, drdkR
      real(wp) :: hg2A, hg2B, hg2L, hg2R, haA, haB, haL, haR
      real(wp) :: dzaL, dzaR, wtA, wtB, wtL, wtR
      real(wp) :: drdy, drdz, mag2, slope, presS, presN
      real(wp) :: g_rho0, mask

      g_rho0 = GRAVITY/rho0

      do concurrent(i=1:nx, j=1:ny + 1)
         slope_y(i, j, 1) = 0.0_wp
         slope_y(i, j, nz + 1) = 0.0_wp
         n2_v(i, j, 1) = 0.0_wp
         n2_v(i, j, nz + 1) = 0.0_wp
      end do
      do concurrent(k=1:nz + 1, i=1:nx)
         slope_y(i, 1, k) = 0.0_wp
         slope_y(i, ny + 1, k) = 0.0_wp
         n2_v(i, 1, k) = 0.0_wp
         n2_v(i, ny + 1, k) = 0.0_wp
      end do

      do concurrent(k=2:nz, j=2:ny, i=1:nx) &
         local(js, ka, kb, pres_v, t_v, s_v, rho_v, dsv_dt, dsv_ds, &
               drdt, drds, drdjA, drdjB, drdkL, drdkR, &
               hg2A, hg2B, hg2L, hg2R, haA, haB, haL, haR, &
               dzaL, dzaR, wtA, wtB, wtL, wtR, drdy, drdz, &
               mag2, slope, presS, presN, mask)
         js = j - 1
         ka = k
         kb = k - 1

         presS = pressure_above_x(nx, ny, nz, h_layer, i, js, ka, rho0)
         presN = pressure_above_x(nx, ny, nz, h_layer, i, j, ka, rho0)
         pres_v = 0.5_wp*(presS + presN)

         t_v = 0.25_wp*((t_fill(i, js, ka) + t_fill(i, j, ka)) + &
                        (t_fill(i, js, kb) + t_fill(i, j, kb)))
         s_v = 0.25_wp*((s_fill(i, js, ka) + s_fill(i, j, ka)) + &
                        (s_fill(i, js, kb) + s_fill(i, j, kb)))

         call eos_density_specvol_derivs(eos, t_v, s_v, pres_v, rho_v, dsv_dt, dsv_ds)
         drdt = -(rho_v*rho_v)*dsv_dt
         drds = -(rho_v*rho_v)*dsv_ds

         drdjA = drdt*(t_fill(i, j, ka) - t_fill(i, js, ka)) + &
                 drds*(s_fill(i, j, ka) - s_fill(i, js, ka))
         drdjB = drdt*(t_fill(i, j, kb) - t_fill(i, js, kb)) + &
                 drds*(s_fill(i, j, kb) - s_fill(i, js, kb))

         drdkL = drdt*(t_fill(i, js, kb) - t_fill(i, js, ka)) + &
                 drds*(s_fill(i, js, kb) - s_fill(i, js, ka))
         drdkR = drdt*(t_fill(i, j, kb) - t_fill(i, j, ka)) + &
                 drds*(s_fill(i, j, kb) - s_fill(i, j, ka))

         hg2A = h_layer(i, js, ka)*h_layer(i, j, ka) + H_DIV_EPS*H_DIV_EPS
         hg2B = h_layer(i, js, kb)*h_layer(i, j, kb) + H_DIV_EPS*H_DIV_EPS
         hg2L = h_layer(i, js, ka)*h_layer(i, js, kb) + H_DIV_EPS*H_DIV_EPS
         hg2R = h_layer(i, j, ka)*h_layer(i, j, kb) + H_DIV_EPS*H_DIV_EPS
         haA = 0.5_wp*(h_layer(i, js, ka) + h_layer(i, j, ka)) + H_DIV_EPS
         haB = 0.5_wp*(h_layer(i, js, kb) + h_layer(i, j, kb)) + H_DIV_EPS
         haL = 0.5_wp*(h_layer(i, js, ka) + h_layer(i, js, kb)) + H_DIV_EPS
         haR = 0.5_wp*(h_layer(i, j, ka) + h_layer(i, j, kb)) + H_DIV_EPS
         dzaL = max(haL, min_dz)
         dzaR = max(haR, min_dz)
         wtA = hg2A*haB
         wtB = hg2B*haA
         wtL = hg2L*(haR*dzaR)
         wtR = hg2R*(haL*dzaL)

         drdz = ((wtL*drdkL) + (wtR*drdkR))/((dzaL*wtL) + (dzaR*wtR))

         drdy = ((wtA*drdjA + wtB*drdjB)/(wtA + wtB) - &
                 drdz*(e_int(i, js, k) - e_int(i, j, k)))*idyCv(i, j)

         mag2 = drdy*drdy + drdz*drdz
         if (mag2 > 0.0_wp) then
            slope = drdy/sqrt(mag2)
         else
            slope = 0.0_wp
         end if

         mask = wet_v(i, j)
         slope_y(i, j, k) = slope*mask
         n2_v(i, j, k) = g_rho0*drdz*mask
      end do
   end subroutine ocean_slopes_pass_y