Skip to content

fix(Rosenbrock): saturation adjustment on max(S_ice, S_liq)#737

Draft
haakon-e wants to merge 3 commits into
he/postsolve-diagnosticsfrom
he/rosenbrock-modes
Draft

fix(Rosenbrock): saturation adjustment on max(S_ice, S_liq)#737
haakon-e wants to merge 3 commits into
he/postsolve-diagnosticsfrom
he/rosenbrock-modes

Conversation

@haakon-e

@haakon-e haakon-e commented Jun 17, 2026

Copy link
Copy Markdown
Member

What this changes

Refines the EndStateSaturationAdjustment limiter so the substep increment is held at saturation over the more-supersaturated phase, max(S_ice, S_liq), instead of over ice alone. Below freezing ice carries the larger supersaturation, so the criterion reduces to the previous ice-only limit and the cold deposition-instability fix is unchanged. Above freezing it limits on liquid, so warm cells condense to liquid saturation; an ice-only limit would instead stop vapor depletion before liquid saturation and hold the cell supersaturated over liquid (too little cloud).

Docs & test

Adds a "mixed-phase saturation criterion" section to docs/src/RosenbrockNumerics.md with a simplified 0-D model that exchanges vapor with cloud liquid and ice only, illustrating the Wegener–Bergeron–Findeisen transfer (why the two saturation thresholds matter), and a framework test covering the warm (liquid) and cold (ice) limits.

Scope and a known refinement

Limiting on max(S_ice, S_liq) is a single shared scalar on the whole increment, which is what keeps the limiter stable. It is correct wherever a single phase grows from vapor. When both phases are supersaturated below freezing (a vigorous mixed-phase updraft core), it limits on the ice floor and so condenses the co-present growing liquid past its own saturation in one step rather than transferring it gradually; a fully per-phase floor (limiting only the supersaturation-driven tendencies of each phase) is a documented candidate refinement. The distinction is inactive at fine substeps and does not affect the cold-instability fix.

@haakon-e haakon-e changed the title Experimental Rosenbrock modes: implicit-T, ManualJ, and configurable substep stabilizers Unified RosenbrockAverage microphysics substepping framework Jun 17, 2026
@haakon-e
haakon-e changed the base branch from he/diagnostic-nc to he/postsolve-diagnostics June 17, 2026 21:20
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 3d41feb to a4aa680 Compare June 17, 2026 21:20
@haakon-e haakon-e changed the title Unified RosenbrockAverage microphysics substepping framework fix(Rosenbrock): saturation adjustment on max(S_ice, S_liq) Jun 17, 2026
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 224c902 to 328ac11 Compare June 18, 2026 21:42
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from a4aa680 to 440ddbf Compare June 18, 2026 21:42
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 328ac11 to 3ab1235 Compare June 18, 2026 22:41
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 440ddbf to 309724f Compare June 18, 2026 22:41
@haakon-e haakon-e mentioned this pull request Jun 18, 2026
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 3ab1235 to 2b6587d Compare June 22, 2026 21:01
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 309724f to 871b731 Compare June 22, 2026 21:01
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 2b6587d to 4edcf64 Compare June 22, 2026 23:43
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 871b731 to 205acdc Compare June 22, 2026 23:43
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 4edcf64 to d798708 Compare June 22, 2026 23:55
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 205acdc to 2e70e53 Compare June 22, 2026 23:55
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from d798708 to 9e374ec Compare June 23, 2026 00:32
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 2e70e53 to b6ab68d Compare June 23, 2026 00:32
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 4604d1d to 19fdeab Compare June 26, 2026 00:38
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from df30b49 to 82ef2c6 Compare June 26, 2026 01:22
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 19fdeab to 40ca910 Compare June 26, 2026 01:22
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 82ef2c6 to 83d763e Compare June 26, 2026 01:31
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 40ca910 to b2dbb8c Compare June 26, 2026 01:31
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 83d763e to 5d0be63 Compare July 1, 2026 05:34
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from b2dbb8c to 98ea608 Compare July 1, 2026 05:34
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 5d0be63 to 6299f13 Compare July 1, 2026 05:46
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 98ea608 to 3a09afe Compare July 1, 2026 05:46
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 6299f13 to 3e406c0 Compare July 1, 2026 06:24
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 3a09afe to 33b6a35 Compare July 1, 2026 06:24
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 3e406c0 to 2b40424 Compare July 1, 2026 15:01
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 33b6a35 to 090fd49 Compare July 1, 2026 15:01
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 2b40424 to 9f81040 Compare July 8, 2026 04:34
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 090fd49 to 043da95 Compare July 8, 2026 04:34
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 9f81040 to 58e4ca6 Compare July 10, 2026 02:14
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 043da95 to c5c4783 Compare July 10, 2026 02:14
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 58e4ca6 to 132adb1 Compare July 10, 2026 23:15
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from c5c4783 to 1c96cf0 Compare July 10, 2026 23:15
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 132adb1 to e91d34c Compare July 11, 2026 00:58
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 1c96cf0 to f821b88 Compare July 11, 2026 00:58
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from e91d34c to db5a1cc Compare July 11, 2026 02:14
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from f821b88 to 3805142 Compare July 11, 2026 02:14
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from db5a1cc to 6eeffe8 Compare July 11, 2026 02:31
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from 3805142 to ed1ddb6 Compare July 11, 2026 02:31
haakon-e added 3 commits July 10, 2026 20:24
EndStateSaturationAdjustment now keeps the latent-heated end state at or above
saturation over its more-supersaturated phase, max(S_ice, S_liq), instead of over
ice alone. Below freezing ice carries the larger supersaturation, so the criterion
reduces to the previous ice cap and the cold deposition-instability cure is
unchanged; above freezing it caps on liquid and removes the warm under-condensation
an ice-only cap leaves behind.

Add a documentation section deriving the criterion with a 0-D vapor-exchange-only
illustration of the Wegener-Bergeron-Findeisen transfer, and a framework test for
the warm (liquid) and cold (ice) caps.
Mirror the warm subtest in the cold block, so a regression that disables
the ice-side limiter is caught. Drop markdown emphasis from the
saturation-adjustment documentation.
The mixed-phase saturation section labelled the coarse-step instability a
"deposition instability", but the positive Jacobian diagonal sits in the
rime-mass row (riming self-gain); the pure-deposition diagonal is negative
there. Rename the reference to "ice-growth instability" to match the
section heading and the mechanism.
@haakon-e
haakon-e force-pushed the he/postsolve-diagnostics branch from 6eeffe8 to fb70028 Compare July 11, 2026 03:28
@haakon-e
haakon-e force-pushed the he/rosenbrock-modes branch from ed1ddb6 to 10acc85 Compare July 11, 2026 03:28
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