vmix_guard_impl Subroutine

private pure subroutine vmix_guard_impl(nx, ny, nzp1, kv, kt, ks, bad_count)

Count negative or NaN diffusivities across interior interfaces. A reduction over fresh scratch — uses !$acc parallel loop reduction (the project rule for device reductions; bare count/sum over device data can silently return 0).

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nzp1
real(kind=wp), intent(in) :: kv(nx,ny,nzp1)
real(kind=wp), intent(in) :: kt(nx,ny,nzp1)
real(kind=wp), intent(in) :: ks(nx,ny,nzp1)
integer, intent(out) :: bad_count

Calls

proc~~vmix_guard_impl~~CallsGraph proc~vmix_guard_impl vmix_guard_impl reduce reduce proc~vmix_guard_impl->reduce

Called by

proc~~vmix_guard_impl~~CalledByGraph proc~vmix_guard_impl vmix_guard_impl proc~vmix_assemble vmix_assemble proc~vmix_assemble->proc~vmix_guard_impl proc~vmix_apply_in_stage vmix_apply_in_stage proc~vmix_apply_in_stage->proc~vmix_assemble proc~run_stage run_stage proc~run_stage->proc~vmix_apply_in_stage proc~run_stage_split run_stage_split proc~run_stage_split->proc~vmix_apply_in_stage 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

Variables

Type Visibility Attributes Name Initial
integer, private :: i
integer, private :: j
integer, private :: k

Source Code

   pure subroutine vmix_guard_impl(nx, ny, nzp1, kv, kt, ks, bad_count)
      !! Count negative or NaN diffusivities across interior interfaces.
      !! A reduction over fresh scratch — uses `!$acc parallel loop
      !! reduction` (the project rule for device reductions; bare
      !! `count`/`sum` over device data can silently return 0).
      integer, intent(in) :: nx, ny, nzp1
      real(wp), intent(in) :: kv(nx, ny, nzp1)
      real(wp), intent(in) :: kt(nx, ny, nzp1)
      real(wp), intent(in) :: ks(nx, ny, nzp1)
      integer, intent(out) :: bad_count

      integer :: i, j, k

      bad_count = 0
      do concurrent(k=2:nzp1 - 1, j=1:ny, i=1:nx) reduce(+:bad_count)
         if (kv(i, j, k) < 0.0_wp .or. kv(i, j, k) /= kv(i, j, k)) bad_count = bad_count + 1
         if (kt(i, j, k) < 0.0_wp .or. kt(i, j, k) /= kt(i, j, k)) bad_count = bad_count + 1
         if (ks(i, j, k) < 0.0_wp .or. ks(i, j, k) /= ks(i, j, k)) bad_count = bad_count + 1
      end do
   end subroutine vmix_guard_impl