Skip to content

Free surface with nonlinear / anisotropic rheology: strong material-boundary constraint is linear-only (penalty fallback leaks) #438

Description

@lmoresi

Why this matters

The rotated-BC free surface (uw.systems.FreeSurface, PR #435) is the only working
free-surface strategy, and nearly every target application is nonlinear — with
anisotropic nonlinearity (TI faults) required for the flagship cases, potentially WITH
the free surface (faults reaching the surface). This must not be a blocker, and it is
not: everything runs today. But one leg runs on a fallback whose deficiency we have
now measured precisely, so it needs to be first-class work, recorded here.

Current compatibility matrix

combination status
rotated free-slip (u.n=0) + nonlinear WORKS (SNES-integrated rotated path, honours consistent_jacobian)
rotated free-slip + anisotropic (TI) works at constraint level (rotation is rheology-blind); solver-config caveats only (Schur/mass pmat choice for TI)
FreeSurface free + held solves + nonlinear WORKS (held auto-dispatches nonlinear rotated; sigma_nn recovery is constitutive-agnostic)
FreeSurface consistent solve (u.n = u~_n != 0) + nonlinear GAP: linear-only. Nonlinear raises NotImplementedError with a clear message; fallback = consistent_constraint="penalty"
FMG hierarchy + nonlinear works by construction (Galerkin RAP of whatever tangent is assembled; re-formed each Newton iteration; performance-only caveats for localised viscosity)

Why the penalty fallback is not acceptable long-term

The consistent solve exists to keep the surface a MATERIAL boundary. Measured on the
isoviscous annulus (PR #435): the penalty leaks ~4% net volume flux through the surface
and misses the prescribed rate by 6.4x more than the strong datum — the exact mechanism
that put semi-Lagrangian departure feet outside the domain and injected hot material
into the cold boundary layer. Nonlinear runs on the fallback inherit that class of
error at whatever amplitude their regime produces.

Required work

  1. Extend the rotated prescribed-normal datum to the SNES path (Finish rotated free-slip prescribed-normal datum: wire FreeSurface consistent solve, pyx API, parallel, nonlinear #403 item 4): the
    linear path imposes the datum via zeroRowsColumns(x,b) with a solution-row restore;
    the Newton loop needs the equivalent per iteration — set the rotated-normal DOF of
    the iterate to the datum, zero the corresponding residual row, keep the tangent
    transparent (the machinery the u.n=0 nonlinear path already has, generalised to a
    non-zero, field-valued datum). Belongs with the pyx add_rotated_freeslip_bc datum
    argument (Finish rotated free-slip prescribed-normal datum: wire FreeSurface consistent solve, pyx API, parallel, nonlinear #403 item 2) and, ideally, with the planned linear/nonlinear rotated-path
    unification (the split itself is a design smell — flagged for the joint pyx session).
  2. Anisotropic extras (small, config-level): a sensible scalar viscosity proxy for
    the Schur mass pmat under TI in the rotated solves; never-ksponly guidance carried
    over to the FreeSurface-derived solves.
  3. Fault-at-the-surface interaction (open question, not solver work): the surface
    ring filter and tangential transport act along a ring that a TI weak zone may
    intersect; whether the filter should be fault-aware is a physics/design question to
    revisit once 1 exists and a fault-to-surface model runs.

Acceptance

Power-law annulus free-surface convection with consistent_constraint="strong" running
through the SNES path: material-boundary error and net surface flux at the strong-datum
level (not the penalty level) at matched steps; a TI fault-bearing smoke test compiling
and converging with the FreeSurface manager.

Related: #403 (items 2, 4), #435 (the 2D linear-complete toolkit), #423, #404 (3D).

Underworld development team with AI support from Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions