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 | Intent | Optional | 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. |
| 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 |
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