apply_meridional_baroclinic Subroutine

private pure subroutine apply_meridional_baroclinic(v_layer, h_layer, vbt_end, nx_total, ny_total, nz, i0, i1, j_s, j_n, bc_s, bc_n, clamp_v_s, clamp_v_n)

Set south and north wall-face per-layer v. Mirror of apply_zonal_baroclinic for the y-direction.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout) :: v_layer(nx_total,ny_total+1,nz)

v_face_y_layer, shape (nx_total, ny_total+1, nz).

real(kind=wp), intent(in) :: h_layer(nx_total,ny_total,nz)
real(kind=wp), intent(in) :: vbt_end(nx_total,ny_total+1)
integer, intent(in) :: nx_total
integer, intent(in) :: ny_total
integer, intent(in) :: nz
integer, intent(in) :: i0

first / last physical i-cell

integer, intent(in) :: i1

first / last physical i-cell

integer, intent(in) :: j_s

south / north physical wall-face indices

integer, intent(in) :: j_n

south / north physical wall-face indices

integer, intent(in) :: bc_s
integer, intent(in) :: bc_n
real(kind=wp), intent(in) :: clamp_v_s
real(kind=wp), intent(in) :: clamp_v_n

Calls

proc~~apply_meridional_baroclinic~~CallsGraph proc~apply_meridional_baroclinic apply_meridional_baroclinic local local proc~apply_meridional_baroclinic->local proc~is_radiating is_radiating proc~apply_meridional_baroclinic->proc~is_radiating

Called by

proc~~apply_meridional_baroclinic~~CalledByGraph proc~apply_meridional_baroclinic apply_meridional_baroclinic proc~ocean_obc_apply_baroclinic ocean_obc_apply_baroclinic proc~ocean_obc_apply_baroclinic->proc~apply_meridional_baroclinic proc~run_stage_split run_stage_split proc~run_stage_split->proc~ocean_obc_apply_baroclinic proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step_split 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 :: h_tot
integer, private :: i
integer, private :: j_int_n
integer, private :: j_int_s
integer, private :: k
real(kind=wp), private :: v_bar
real(kind=wp), private :: v_int

Source Code

   pure subroutine apply_meridional_baroclinic(v_layer, h_layer, vbt_end, &
                                               nx_total, ny_total, nz, &
                                               i0, i1, j_s, j_n, &
                                               bc_s, bc_n, clamp_v_s, clamp_v_n)
      !! Set south and north wall-face per-layer v.  Mirror of
      !! `apply_zonal_baroclinic` for the y-direction.
      integer, intent(in) :: nx_total, ny_total, nz
      real(wp), intent(inout) :: v_layer(nx_total, ny_total + 1, nz)
         !! v_face_y_layer, shape (nx_total, ny_total+1, nz).
      real(wp), intent(in)    :: h_layer(nx_total, ny_total, nz)
      real(wp), intent(in)    :: vbt_end(nx_total, ny_total + 1)
      integer, intent(in) :: i0, i1     !! first / last physical i-cell
      integer, intent(in) :: j_s, j_n   !! south / north physical wall-face indices
      integer, intent(in) :: bc_s, bc_n
      real(wp), intent(in) :: clamp_v_s, clamp_v_n

      integer  :: i, k
      real(wp) :: h_tot, v_bar, v_int
      integer  :: j_int_s, j_int_n

      j_int_s = j_s + 1
      j_int_n = j_n - 1

      ! ---- South wall ----
      if (bc_s == OBC_CLAMPED) then
         do concurrent(k=1:nz, i=i0:i1)
            v_layer(i, j_s, k) = clamp_v_s
         end do
      else if (is_radiating(bc_s)) then
         do concurrent(i=i0:i1) local(k, h_tot, v_bar, v_int)
            h_tot = 0.0_wp
            v_bar = 0.0_wp
            do k = 1, nz
               h_tot = h_tot + h_layer(i, j_s, k)
               v_bar = v_bar + v_layer(i, j_int_s, k)*h_layer(i, j_s, k)
            end do
            if (h_tot > 0.0_wp) then
               v_bar = v_bar/h_tot
            else
               v_bar = 0.0_wp
            end if
            do k = 1, nz
               v_int = v_layer(i, j_int_s, k)
               v_layer(i, j_s, k) = vbt_end(i, j_s) + (v_int - v_bar)
            end do
         end do
      end if

      ! ---- North wall ----
      if (bc_n == OBC_CLAMPED) then
         do concurrent(k=1:nz, i=i0:i1)
            v_layer(i, j_n, k) = clamp_v_n
         end do
      else if (is_radiating(bc_n)) then
         do concurrent(i=i0:i1) local(k, h_tot, v_bar, v_int)
            h_tot = 0.0_wp
            v_bar = 0.0_wp
            do k = 1, nz
               h_tot = h_tot + h_layer(i, j_n - 1, k)
               v_bar = v_bar + v_layer(i, j_int_n, k)*h_layer(i, j_n - 1, k)
            end do
            if (h_tot > 0.0_wp) then
               v_bar = v_bar/h_tot
            else
               v_bar = 0.0_wp
            end if
            do k = 1, nz
               v_int = v_layer(i, j_int_n, k)
               v_layer(i, j_n, k) = vbt_end(i, j_n) + (v_int - v_bar)
            end do
         end do
      end if
   end subroutine apply_meridional_baroclinic