apply_nudge_meridional_north Subroutine

private pure subroutine apply_nudge_meridional_north(v_layer, nx_total, ny_total, nz, j_n, i0, i1, tau_in, tau_out, dt, v_data)

Post-anomaly nudging for the north edge. “Incoming” at north = v_wall < 0 ⟹ tau_in.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout) :: v_layer(nx_total,ny_total+1,nz)
integer, intent(in) :: nx_total
integer, intent(in) :: ny_total
integer, intent(in) :: nz
integer, intent(in) :: j_n
integer, intent(in) :: i0
integer, intent(in) :: i1
real(kind=wp), intent(in) :: tau_in
real(kind=wp), intent(in) :: tau_out
real(kind=wp), intent(in) :: dt
real(kind=wp), intent(in) :: v_data

Calls

proc~~apply_nudge_meridional_north~~CallsGraph proc~apply_nudge_meridional_north apply_nudge_meridional_north local local proc~apply_nudge_meridional_north->local

Called by

proc~~apply_nudge_meridional_north~~CalledByGraph proc~apply_nudge_meridional_north apply_nudge_meridional_north proc~ocean_obc_apply_baroclinic ocean_obc_apply_baroclinic proc~ocean_obc_apply_baroclinic->proc~apply_nudge_meridional_north 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 :: g2
integer, private :: i
integer, private :: k
real(kind=wp), private :: tau
real(kind=wp), private :: v_b

Source Code

   pure subroutine apply_nudge_meridional_north(v_layer, nx_total, ny_total, nz, &
                                                j_n, i0, i1, tau_in, tau_out, dt, v_data)
      !! Post-anomaly nudging for the north edge.
      !! "Incoming" at north = v_wall < 0 ⟹ tau_in.
      integer, intent(in) :: nx_total, ny_total, nz, j_n, i0, i1
      real(wp), intent(inout) :: v_layer(nx_total, ny_total + 1, nz)
      real(wp), intent(in) :: tau_in, tau_out, dt, v_data
      integer :: i, k
      real(wp) :: tau, g2, v_b
      do concurrent(i=i0:i1, k=1:nz) local(tau, g2, v_b)
         if (v_layer(i, j_n, k) < 0.0_wp) then
            tau = tau_in
         else
            tau = tau_out
         end if
         if (tau > 0.0_wp) then
            g2 = dt/(tau + dt)
            v_b = (1.0_wp - g2)*v_layer(i, j_n, k) + g2*v_data
            v_layer(i, j_n, k) = v_b
         end if
      end do
   end subroutine apply_nudge_meridional_north