update_reservoir_meridional_south Subroutine

private pure subroutine update_reservoir_meridional_south(hTr, h_layer, mass_flux_y, tres_s, T_data, nx_total, ny_total, nz, j_s, i0, i1, L_out, L_in, dt, it, n_tr)

Update reservoir for the south open edge. Wall-face index = j_s; interior cell = j_s. Outward normal = -y: u_n = -mass_flux_y(i,j_s,k)/max(h,hmin).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: hTr(nx_total,ny_total,nz)
real(kind=wp), intent(in) :: h_layer(nx_total,ny_total,nz)
real(kind=wp), intent(in) :: mass_flux_y(nx_total,ny_total+1,nz)
real(kind=wp), intent(inout) :: tres_s(nx_total,nz,n_tr)
real(kind=wp), intent(in) :: T_data
integer, intent(in) :: nx_total
integer, intent(in) :: ny_total
integer, intent(in) :: nz
integer, intent(in) :: j_s
integer, intent(in) :: i0
integer, intent(in) :: i1
real(kind=wp), intent(in) :: L_out
real(kind=wp), intent(in) :: L_in
real(kind=wp), intent(in) :: dt
integer, intent(in) :: it
integer, intent(in) :: n_tr

Calls

proc~~update_reservoir_meridional_south~~CallsGraph proc~update_reservoir_meridional_south update_reservoir_meridional_south local local proc~update_reservoir_meridional_south->local

Called by

proc~~update_reservoir_meridional_south~~CalledByGraph proc~update_reservoir_meridional_south update_reservoir_meridional_south proc~ocean_obc_update_reservoirs ocean_obc_update_reservoirs proc~ocean_obc_update_reservoirs->proc~update_reservoir_meridional_south proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~ocean_obc_update_reservoirs proc~run_stage_split run_stage_split proc~run_stage_split->proc~run_continuity_chain 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

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: T_int
real(kind=wp), private :: c_in
real(kind=wp), private :: c_out
real(kind=wp), private :: denom
real(kind=wp), private :: h_int
integer, private :: i
integer, private :: k
real(kind=wp), private :: tres_old
real(kind=wp), private :: u_n

Source Code

   pure subroutine update_reservoir_meridional_south(hTr, h_layer, mass_flux_y, &
                                                     tres_s, T_data, &
                                                     nx_total, ny_total, nz, &
                                                     j_s, i0, i1, &
                                                     L_out, L_in, dt, it, n_tr)
      !! Update reservoir for the south open edge.
      !! Wall-face index = j_s; interior cell = j_s.
      !! Outward normal = -y: u_n = -mass_flux_y(i,j_s,k)/max(h,hmin).
      integer, intent(in) :: nx_total, ny_total, nz, n_tr, it
      integer, intent(in) :: j_s, i0, i1
      real(wp), intent(in) :: hTr(nx_total, ny_total, nz)
      real(wp), intent(in) :: h_layer(nx_total, ny_total, nz)
      real(wp), intent(in) :: mass_flux_y(nx_total, ny_total + 1, nz)
      real(wp), intent(inout) :: tres_s(nx_total, nz, n_tr)
      real(wp), intent(in) :: T_data
      real(wp), intent(in) :: L_out, L_in, dt

      integer :: i, k
      real(wp) :: h_int, T_int, u_n, c_out, c_in, tres_old, denom

      do concurrent(i=i0:i1, k=1:nz) local(h_int, T_int, u_n, c_out, c_in, tres_old, denom)
         h_int = max(h_layer(i, j_s, k), RES_H_MIN)
         T_int = hTr(i, j_s, k)/h_int
         u_n = -mass_flux_y(i, j_s, k)/h_int
         tres_old = tres_s(i, k, it)
         if (L_out == 0.0_wp .and. u_n > 0.0_wp) then
            tres_s(i, k, it) = T_int
         else if (L_in == 0.0_wp .and. u_n < 0.0_wp) then
            tres_s(i, k, it) = T_data
         else
            c_out = merge(max(0.0_wp, u_n)*dt/L_out, 0.0_wp, L_out > 0.0_wp)
            c_in = merge(max(0.0_wp, -u_n)*dt/L_in, 0.0_wp, L_in > 0.0_wp)
            denom = 1.0_wp + c_out + c_in
            tres_s(i, k, it) = (tres_old + c_out*T_int + c_in*T_data)/denom
         end if
      end do
   end subroutine update_reservoir_meridional_south