probe_dS Subroutine

private subroutine probe_dS(grid, ms, label, stage, outer_step)

Debug-gated diagnostic. Pulls h_layer + hTr_S from device and prints max|hTr_S/h_layer - bcdiag_S_ref| over interior columns. Early-returns when bcdiag_enabled = .false. or after bcdiag_step_limit outer steps have completed.

Used to localise where the first 9e-5 dS jump enters during one outer step of geostrophic_adjust under realistic β_S.

Arguments

Type IntentOptional Attributes Name
type(hgrid_t), intent(in) :: grid
type(multilayer_state_t), intent(inout) :: ms
character(len=*), intent(in) :: label
integer, intent(in) :: stage
integer, intent(in) :: outer_step

Called by

proc~~probe_ds~~CalledByGraph proc~probe_ds probe_dS proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~probe_ds proc~run_gm_step run_gm_step proc~ocean_dyn_step_split->proc~run_gm_step proc~run_stage_split run_stage_split proc~ocean_dyn_step_split->proc~run_stage_split proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~probe_ds proc~run_gm_step->proc~probe_ds proc~run_stage_split->proc~probe_ds proc~run_stage_split->proc~run_continuity_chain 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 proc~driver_run driver_run proc~driver_run->proc~driver_run_ocean

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: dS
integer, private :: i
integer, private :: i0
integer, private :: i1
integer, private :: iS
integer, private :: ig
integer, private :: j
integer, private :: j0
integer, private :: j1
integer, private :: k
real(kind=wp), private :: max_dS

Source Code

   subroutine probe_dS(grid, ms, label, stage, outer_step)
      !! Debug-gated diagnostic.  Pulls `h_layer` + `hTr_S` from device
      !! and prints `max|hTr_S/h_layer - bcdiag_S_ref|` over interior
      !! columns.  Early-returns when `bcdiag_enabled = .false.` or
      !! after `bcdiag_step_limit` outer steps have completed.
      !!
      !! Used to localise where the first 9e-5 dS jump enters during
      !! one outer step of `geostrophic_adjust` under realistic β_S.
      type(hgrid_t), intent(in) :: grid
      type(multilayer_state_t), intent(inout) :: ms
      character(len=*), intent(in) :: label
      integer, intent(in) :: stage, outer_step

      integer :: i, j, k, iS, ig, i0, i1, j0, j1
      real(wp) :: max_dS, dS

      if (.not. bcdiag_enabled) return
      if (outer_step > bcdiag_step_limit) return
      if (ms%idx_salinity <= 0) return
      if (.not. allocated(ms%tracers)) return

      iS = ms%idx_salinity
      !$acc update self(ms%h_layer, ms%tracers(iS)%hTr)

      ig = grid%nghost
      i0 = ig + 1
      i1 = grid%nx_total - ig
      j0 = ig + 1
      j1 = grid%ny_total - ig

      max_dS = 0.0_wp
      do k = 1, ms%nz_ml
         do j = j0, j1
            do i = i0, i1
               if (ms%h_layer(i, j, k) > 0.0_wp) then
                  dS = abs(ms%tracers(iS)%hTr(i, j, k)/ms%h_layer(i, j, k) - bcdiag_S_ref)
                  if (dS > max_dS) max_dS = dS
               end if
            end do
         end do
      end do

      write (output_unit, '("[bcdiag] step=", i0, " stage=", i0, " ", a40, " max|dS|=", es12.4)') &
         outer_step, stage, label, max_dS
      flush (output_unit)
   end subroutine probe_dS