continuity_apply_zonal Subroutine

private pure subroutine continuity_apply_zonal(grid, metrics, ms, dt, h_min)

Apply the zonal (x-flux) thickness update: h(i,j,k) ← h(i,j,k) - dt · (Φx(i+1,j,k) - Φx(i,j,k)) · iareaT Overwrites flux_h_layer with the x-divergence so the companion meridional apply can accumulate the total. Φx is the width-weighted transport (m³/s); iareaT closes the divergence to a per-area rate (= inv_dx on uniform metrics).

Optional h_min (m): when > 0, applies max(h_new, h_min) on the h-update (Phase-1 Lagrangian floor). mass_budget_continuity records the RAW divergence regardless — the floor injection shows up in the mass Error diagnostic (R2). 0 or absent ⇒ bit-identical.

Arguments

Type IntentOptional Attributes Name
type(hgrid_t), intent(in) :: grid
type(ocean_metrics_t), intent(in) :: metrics
type(multilayer_state_t), intent(inout) :: ms
real(kind=wp), intent(in) :: dt
real(kind=wp), intent(in), optional :: h_min

Minimum-thickness floor (m). 0 or absent ⇒ off ⇒ bit-identical.


Called by

proc~~continuity_apply_zonal~~CalledByGraph proc~continuity_apply_zonal continuity_apply_zonal proc~continuity_step_split continuity_step_split proc~continuity_step_split->proc~continuity_apply_zonal proc~continuity_tracer_step_split continuity_tracer_step_split proc~continuity_tracer_step_split->proc~continuity_apply_zonal proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~continuity_tracer_step_split proc~run_stage run_stage proc~run_stage->proc~continuity_tracer_step_split proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~run_stage_split run_stage_split proc~run_stage_split->proc~run_continuity_chain proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step proc~ocean_dyn_step_split ocean_dyn_step_split proc~engine_step->proc~ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_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 :: div_x
real(kind=wp), private :: h_min_use
integer, private :: i
integer, private :: j
integer, private :: k
integer, private :: nx
integer, private :: ny
integer, private :: nz

Source Code

   pure subroutine continuity_apply_zonal(grid, metrics, ms, dt, h_min)
      !! Apply the zonal (x-flux) thickness update:
      !!   h(i,j,k) ← h(i,j,k) - dt · (Φx(i+1,j,k) - Φx(i,j,k)) · iareaT
      !! Overwrites `flux_h_layer` with the x-divergence so the
      !! companion meridional apply can accumulate the total.  Φx is
      !! the width-weighted transport (m³/s); `iareaT` closes the
      !! divergence to a per-area rate (= `inv_dx` on uniform metrics).
      !!
      !! Optional `h_min` (m): when > 0, applies max(h_new, h_min) on the
      !! h-update (Phase-1 Lagrangian floor). `mass_budget_continuity` records
      !! the RAW divergence regardless — the floor injection shows up in the
      !! mass Error diagnostic (R2). 0 or absent ⇒ bit-identical.
      type(hgrid_t), intent(in) :: grid
      type(ocean_metrics_t), intent(in) :: metrics
      type(multilayer_state_t), intent(inout) :: ms
      real(wp), intent(in) :: dt
      real(wp), intent(in), optional :: h_min
         !! Minimum-thickness floor (m). 0 or absent ⇒ off ⇒ bit-identical.

      integer :: i, j, k, nx, ny, nz
      real(wp) :: div_x, h_min_use

      h_min_use = 0.0_wp
      if (present(h_min)) h_min_use = h_min

      nx = grid%nx_total
      ny = grid%ny_total
      nz = ms%nz_ml

      if (h_min_use > 0.0_wp) then
         do concurrent(k=1:nz, j=1:ny, i=1:nx)
            div_x = (ms%mass_flux_x_layer(i + 1, j, k) - &
                     ms%mass_flux_x_layer(i, j, k))*metrics%iareaT(i, j)
            ms%flux_h_layer(i, j, k) = div_x
            ms%h_layer(i, j, k) = max(ms%h_layer(i, j, k) - dt*div_x, h_min_use)
            ms%mass_budget_continuity(i, j, k) = &
               ms%mass_budget_continuity(i, j, k) - dt*div_x
         end do
      else
         do concurrent(k=1:nz, j=1:ny, i=1:nx)
            div_x = (ms%mass_flux_x_layer(i + 1, j, k) - &
                     ms%mass_flux_x_layer(i, j, k))*metrics%iareaT(i, j)
            ms%flux_h_layer(i, j, k) = div_x
            ms%h_layer(i, j, k) = ms%h_layer(i, j, k) - dt*div_x
            ms%mass_budget_continuity(i, j, k) = &
               ms%mass_budget_continuity(i, j, k) - dt*div_x
         end do
      end if
   end subroutine continuity_apply_zonal