Clamp the ocean SURFACE layer at the seawater freezing point and
BANK the removed supercooling deficit for the sea-ice model
(PLAN_SEA_ICE.md “Prerequisites” #2 — the MOM6/SIS2 frazil
limiter on the ocean side of the coupling seam).
Physics: after a full outer dynamics step the surface layer
(k = nz, Roundabout’s bottom-up convention) can be advected/mixed
below the salinity-dependent freezing point T_f =
eos_freezing_point(S, p). Liquid seawater cannot supercool at
leading order — the deficit freezes out as frazil crystals whose
latent-heat release warms the water back to T_f. This kernel
applies exactly that: it raises the surface tracer temperature to
T_f and deposits the heat spent,
deficit = ρ·Cp·h_surf·(T_f − T)⁺ [J/m²],
into the persistent frazil_heat bank on the ice slot. ENERGY
CONSERVING by construction: the sensible heat ADDED to the ocean
equals the latent heat the (future, PR 3) ice model will spend
forming new ice from the same bank — banked, never discarded.
The matching hTr increment h·(T_f − T) (K·m) is mirrored into
the slot’s heat_budget_frazil contributor so the global heat
budget (rdb_ocean_budgets) still closes with ice on.
Runs ONCE per outer step on the FINAL (post-RK2-average,
post-remap) tracer state — clamping inside the RK2 stages would
not bound the averaged result. Gated at the driver on
state%ice%enable (default off ⇒ byte-identical).
Nodes of different colours represent the following:
Solid arrows point from a submodule to the (sub)module which it is
descended from. Dashed arrows point from a module or program unit to
modules which it uses.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.
Nodes of different colours represent the following:
Solid arrows point from a submodule to the (sub)module which it is
descended from. Dashed arrows point from a module or program unit to
modules which it uses.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.
Subroutines
public pure subroutine ice_frazil_accumulate(grid, eos, ms, frazil_heat, heat_budget_frazil)
Outer shim (outer-shim + flat-impl pattern): dereference the
tracer registry (ms%tracers(idx)%hTr) on the HOST and forward
bare arrays to the device kernel — NVHPC stdpar cannot follow
the array-of-derived-types indirection inside a do-concurrent
body. No-op when either S or T is unregistered.
Device kernel over PHYSICAL surface cells (ghosts excluded —
wall ghosts are inert and seam ghosts are rebuilt by the wrap /
exchange, so clamping them would double-count the bank in any
area integral). Per wet cell at k = nz: