Skip to content

Add an optional pore-volume floor in the CNV normalisation - #7301

Closed
hnil wants to merge 1 commit into
OPM:masterfrom
hnil:cnv-pore-volume-floor
Closed

hnil wants to merge 1 commit into
OPM:masterfrom
hnil:cnv-pore-volume-floor

Conversation

@hnil

@hnil hnil commented Aug 9, 2026

Copy link
Copy Markdown
Member

CNV divides the cell residual by the cell pore volume, so vanishing-PV cells are held to a divergently strict standard (admissible residual -> 0). Measured on the regression suite: the decks that need tolerance-cnv-relaxed=1.0 are exactly those whose offending cells are 1e-6..1e-15 of the average cell size (DISPERC_FINGERS, the PRECSALT decks, SPE1CASE2_RADIAL inner radial cells) — the 3% pore-volume budget with tolerance 1.0 is compensating for a division by (near) zero.

--cnv-pore-volume-floor-fraction=f floors the normalisation volume at f x the average cell PV (default 0 = off, byte-identical). With the floor, fully strict settings become viable on that class: DISPERC 46,121 Newton / 1,799 failed substeps -> 516 / 0 at matched dt; CO2STORE_PRECSALT 295/1 -> 41/0.

Draft to discuss direction: this is the cheap proxy for the physically complete form B dt |R| / max(PV, B dt q_throughput) (residual per storage OR throughput, whichever is larger). One caveat to be aware of: on such decks the ill-posed criterion has been acting as an accidental time-step limiter, so fixing it lets dt grow and answers move — it should be paired with a real time-accuracy control before any default change.

@hnil hnil added the manual:enhancement This is an enhancement/improvent that needs to be documented in the manual label Aug 10, 2026
CNV divides the cell residual by the cell pore volume, so cells with
vanishing PV are held to a divergently strict standard: |R| <= tol*PV/(B*dt)
-> 0. Measured (INFOITER pore-volume split vs deck cell counts): the decks
that measurably need the relaxed-CNV escape hatch are exactly those whose
offending cells have vanishing relative size -- DISPERC_FINGERS 2e-15,
CO2STORE_PRECSALT ~1e-6, SPE1CASE2_RADIAL ~9e-6 (inner radial cells) --
while on the rest of the suite the hatch excuses ~7 ordinary-sized cells.
The 3% pore-volume budget with tolerance 1.0 is a workaround for this
ill-posed normalisation.

--cnv-pore-volume-floor-fraction=f floors the normalisation volume at
f x the average cell PV (0 = off). With the floor, fully strict settings
(hatch closed, no iteration relaxation) become viable on the pathological
class: DISPERC 46,121/1,799 (strict, no floor) -> 516/0 at matched dt;
CO2STORE_PRECSALT 295/1 -> 41/0; healthy decks unchanged.

Caveats recorded in investigation/CNV_PHYSICAL_REDESIGN.md: answer
adjudication on DISPERC pending (its convergence failures currently act as
an accidental temporal-error controller, so removing them exposes the time
step to the accuracy-blind controller); one linear-solver abort on
GASCONDENSATE_VAPWAT_PRECSALT under the floor; the principled form is a
throughput-based denominator max(PV, dt*B*q), which also fixes the
incompressible limit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hnil
hnil force-pushed the cnv-pore-volume-floor branch from ddc018e to ba9231f Compare August 11, 2026 12:05
@hnil

hnil commented Aug 11, 2026

Copy link
Copy Markdown
Member Author

Closing this. The floor is a fraction of the mean cell pore volume, and the mean is set by the largest cells: on DISPERC_FINGERS (50 buffer cells at 1e10 m3 via OPERATE PORV ... ADDX) 2450 of 2500 cells fall under a 1% floor, and on CO2STORE_PRECSALT 18 of 20. On those decks it does not bound a degenerate normalisation, it removes the criterion - which is why the DISPERC answer moved. On uniform grids it is a no-op. Filed #7312 for the underlying scale problem; the follow-up will use a per-cell throughput term instead, which has no global scale.

@hnil hnil closed this Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manual:enhancement This is an enhancement/improvent that needs to be documented in the manual

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant