relax_band_y_impl Subroutine

private pure subroutine relax_band_y_impl(hTr, h_layer, nx_total, ny_total, nz, i0, i1, wall_face, band, side, strength, C_bc, dt, budget)

Cosine-ramp tracer relaxation in a south/north sponge band. Mirror of relax_band_x_impl for the y-direction; see its docstring for the optional budget mirror (PR-23).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout) :: hTr(nx_total,ny_total,nz)
real(kind=wp), intent(in) :: h_layer(nx_total,ny_total,nz)
integer, intent(in) :: nx_total
integer, intent(in) :: ny_total
integer, intent(in) :: nz
integer, intent(in) :: i0
integer, intent(in) :: i1
integer, intent(in) :: wall_face
integer, intent(in) :: band
integer, intent(in) :: side
real(kind=wp), intent(in) :: strength
real(kind=wp), intent(in) :: C_bc
real(kind=wp), intent(in) :: dt
real(kind=wp), intent(inout), optional :: budget(nx_total,ny_total,nz)

Calls

proc~~relax_band_y_impl~~CallsGraph proc~relax_band_y_impl relax_band_y_impl local local proc~relax_band_y_impl->local proc~relax_one relax_one proc~relax_band_y_impl->proc~relax_one proc~relax_toward relax_toward proc~relax_one->proc~relax_toward

Called by

proc~~relax_band_y_impl~~CalledByGraph proc~relax_band_y_impl relax_band_y_impl proc~sponge_relax_band_y_tracer sponge_relax_band_y_tracer proc~sponge_relax_band_y_tracer->proc~relax_band_y_impl proc~ocean_sponge_apply_tracers ocean_sponge_apply_tracers proc~ocean_sponge_apply_tracers->proc~sponge_relax_band_y_tracer proc~run_stage_split run_stage_split proc~run_stage_split->proc~ocean_sponge_apply_tracers 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
integer, private :: d
logical, private :: has_budget
integer, private :: i
integer, private :: jj
integer, private :: k
real(kind=wp), private :: new_val

Source Code

   pure subroutine relax_band_y_impl(hTr, h_layer, nx_total, ny_total, nz, &
                                     i0, i1, wall_face, band, side, strength, C_bc, dt, budget)
      !! Cosine-ramp tracer relaxation in a south/north sponge band.
      !! Mirror of `relax_band_x_impl` for the y-direction; see its
      !! docstring for the optional `budget` mirror (PR-23).
      integer, intent(in) :: nx_total, ny_total, nz, i0, i1, wall_face, band, side
      real(wp), intent(inout) :: hTr(nx_total, ny_total, nz)
      real(wp), intent(in)    :: h_layer(nx_total, ny_total, nz)
      real(wp), intent(in)    :: strength, C_bc, dt
      real(wp), intent(inout), optional :: budget(nx_total, ny_total, nz)

      integer :: k, i, d, jj
      real(wp) :: new_val
      logical :: has_budget

      has_budget = present(budget)
      do concurrent(k=1:nz, i=i0:i1, d=0:band - 1) local(jj, new_val)
         if (side > 0) then
            jj = wall_face + d
         else
            jj = wall_face - d - 1
         end if
         new_val = relax_one(hTr(i, jj, k), C_bc*h_layer(i, jj, k), &
                             strength, d, band, dt)
         if (has_budget) budget(i, jj, k) = budget(i, jj, k) + (new_val - hTr(i, jj, k))
         hTr(i, jj, k) = new_val
      end do
   end subroutine relax_band_y_impl