hvisc_apply_impl Subroutine

private subroutine hvisc_apply_impl(u_face, v_face, du_visc, dv_visc, dt, nx, ny, nz, lwait)

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout) :: u_face(nx+1,ny,nz)
real(kind=wp), intent(inout) :: v_face(nx,ny+1,nz)
real(kind=wp), intent(in) :: du_visc(nx+1,ny,nz)
real(kind=wp), intent(in) :: dv_visc(nx,ny+1,nz)
real(kind=wp), intent(in) :: dt
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
logical, intent(in) :: lwait

.false. ⇒ leave the apply on queue 1 without syncing (batched).


Called by

proc~~hvisc_apply_impl~~CalledByGraph proc~hvisc_apply_impl hvisc_apply_impl proc~ocean_horizontal_viscosity_apply_tendencies ocean_horizontal_viscosity_apply_tendencies proc~ocean_horizontal_viscosity_apply_tendencies->proc~hvisc_apply_impl proc~run_stage run_stage proc~run_stage->proc~ocean_horizontal_viscosity_apply_tendencies proc~run_stage_split run_stage_split proc~run_stage_split->proc~ocean_horizontal_viscosity_apply_tendencies proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage 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 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
integer, private :: i
integer, private :: j
integer, private :: k

Source Code

   subroutine hvisc_apply_impl(u_face, v_face, du_visc, dv_visc, dt, nx, ny, nz, lwait)
      integer, intent(in)    :: nx, ny, nz
      real(wp), intent(inout) :: u_face(nx + 1, ny, nz), v_face(nx, ny + 1, nz)
      real(wp), intent(in)    :: du_visc(nx + 1, ny, nz), dv_visc(nx, ny + 1, nz)
      real(wp), intent(in)    :: dt
      logical, intent(in)    :: lwait
         !! .false. ⇒ leave the apply on queue 1 without syncing (batched).
      integer :: i, j, k
      !$acc kernels async(1)
      do concurrent(k=1:nz, j=1:ny, i=1:nx + 1)
         u_face(i, j, k) = u_face(i, j, k) + dt*du_visc(i, j, k)
      end do
      do concurrent(k=1:nz, j=1:ny + 1, i=1:nx)
         v_face(i, j, k) = v_face(i, j, k) + dt*dv_visc(i, j, k)
      end do
      !$acc end kernels
      if (lwait) then
         !$acc wait(1)
      end if
   end subroutine hvisc_apply_impl