Skip to content

PostProcessIce: stop runaway sea-ice growth in cycling - #1274

Open
shlyaeva wants to merge 5 commits into
developfrom
feature/ens_ice_fixes
Open

shlyaeva wants to merge 5 commits into
developfrom
feature/ens_ice_fixes

Conversation

@shlyaeva

@shlyaeva shlyaeva commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Description

In Joao's @jspsl 25-day cycling run with PostProcessIce, Arctic ice volume doubled (17.7 -> 37.1 x10^3 km^3), Antarctic ice grew through austral summer, and cells reached ~1000 m (the top category bound). Causes:

  • the ITD rebin put volume residuals into the open top category and seeded new top-category ice as 500-1000 m slivers; positive concentration increments then multiplied that ice every cycle;
  • the top-layer enthalpy cap cooled the ice every cycle;
  • thick remnants at ~1e-3 concentration were carried onto analysis area and used as donors for new ice.

Changes:

  • Rebin: a volume change scales every category's thickness by one factor; the top category's rebin bound is capped at max(2 x lower edge, current thickness).
  • max new ice thickness (default 5 m) caps the NOICE2ICE seed.
  • Thermo: clamp Tsfc and cap surface ice enthalpy split out of update snow thermo; the enthalpy cap is now off by default.
  • low concentration: background cells below min background aice (1e-3) are treated as ice-free and never used as donors; ICE2ICE thickness targets are capped at max thickness (5 m) below max aice (0.01).
  • concentration increment: keep thickness | keep volume sets whether concentration increments keep thickness (default, as before) or volume.
  • Donors for new ice are visited in a fixed order (distance rounded to 1 m, then global index), so results no longer depend on platform rounding. Previously the KDTree's order between equidistant neighbours decided the donor, and soca2cice_new_bgfallback differed between platforms.

Behavior changes with default settings: the new rebin rule, enthalpy cap off, remnant cutoff and thickness caps.

Joao reran the experiment with these changes and saw significant improvement.

Checklist

  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • I have run the unit tests before creating the PR

- IcePhysics: VolumeRedistribution {Headroom (default), Proportional} for
  adjustThicknessCategories. Proportional scales every free category's thickness
  by one factor and caps the open top category's rebin bound at max(2 x its lower
  edge, its current thickness), so thin top-category slivers cannot absorb volume
  residuals and ratchet toward the top bound.
- PostProcessIce: `itd: volume redistribution` (headroom | proportional) and
  `max new ice thickness` for noice->ice seeding (0 = off).
- TestIcePhysics: cases for both rules (sliver gain, volume loss, Phase-2 top seed).
Defaults keep the previous behaviour.
…ice cap

Fixes the runaway ice volume seen in the SFS scout run (Arctic volume
doubling over 25 days, cell-mean thickness pinned near the 1000 m top
category bound).

- IcePhysics: remove the headroom volume-redistribution rule. With an open
  top category it put almost every volume gain into category ncat, and
  Phase 2 seeded newly populated top categories as ~500-1000 m slivers.
  Proportional scaling with the capped top bound (max(2 x its lower edge,
  its current thickness)) is now the only rule; `itd: volume
  redistribution` is gone.
- Thermo: split `update snow thermo` into `clamp Tsfc` (default on),
  `update snow thermo` (qsno rebuild only, default on) and
  `cap surface ice enthalpy` (default off). The top-layer qice cap forced
  qice001 down to BL99(Tsfcn) on almost every category in winter, adding
  cold content every cycle (~0.06-0.09 x 10^3 km^3 of equivalent ice per
  6-h cycle per hemisphere in the SFS run).
- `max new ice thickness` now defaults to 5 m (0 disables the cap), so
  noice->ice cells are not seeded from donors with inflated thickness.
- Tests: unit tests use the single rule; soca2cice_new{,_freeboard,_seed}
  refs regenerated (freeboard enforcement reacts to the new ITD shape;
  mean hice changes by ~2e-5 relative).
…me option

CICE leaves thick ice remnants (tens of m) on cells with ~1e-3
concentration (SFS initial state: 1318 NH cells thicker than 10 m, median
concentration 7e-4). Keeping their thickness while the analysis raises the
concentration multiplies that volume.

- `low concentration: min background aice` (default 1e-3): background cells
  below it are treated as ice-free. Where the analysis has ice they are
  seeded as NOICE2ICE cells (neighbour thickness, capped at `max new ice
  thickness`, no snow), ignoring the remnant's analysis thickness and snow;
  otherwise the remnant is removed. Remnants are never used as donors and
  count as empty categories for the new-ice thermo seed.
- `low concentration: max aice / max thickness` (defaults 0.01 / 5 m):
  where the background or analysis concentration is below `max aice`, the
  ICE2ICE thickness target is capped at `max thickness`.
- `concentration increment: keep thickness | keep volume` (default keep
  thickness, the previous behaviour). With keep volume, ICE2ICE cells keep
  the background volume (plus the analysis thickness increment over the
  analysis area) when the analysis changes the concentration. Keeping
  thickness adds volume wherever concentration rises over thick ice
  (+0.14 x 10^3 km^3 per cycle in the SH in the SFS_v3 run on 9 Jan).
- New test soca2cice_new_keepvolume. soca2cice_new{,_freeboard,_seed,
  _bgfallback} refs regenerated: the test grid has 78 background remnant
  cells (43 re-seeded, 35 removed); concentration is unchanged and all
  other differences are surface temperature / snow enthalpy on new-ice
  slots whose donor changed.
- `keep volume` with a volume analysis (`sea_ice_volume` in `analysis
  variables`) now takes the analysed volume. It used to add the analysed
  volume to the background volume a second time.
- New-ice Tsfc seeds honour `clamp Tsfc: false`.
- The thermo stage again returns early when all its options are off.
- Unit-test comments no longer refer to removed code or run names.
…ependent

donorMeanIce took the first donor with ice in the KDTree neighbour list. On
regular grids mirror neighbours are equidistant, and which of them the
KDTree lists first depends on rounding, so new-ice thickness and Tsfc could
differ between platforms (soca2cice_new_bgfallback failed in CI). Neighbours
are now visited in order of distance rounded to 1 m, then global index.
seedNewIce uses donorMeanIce instead of its own copy of the donor search.
soca2cice_new* refs regenerated (mean thickness changes by ~1e-3 relative;
concentration and snow unchanged).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant