Skip to content

Geometric-MG bundle pairs a gmres smoother with a non-flexible outer KSP: converges by recurrence while the true residual stalls #514

Description

@lmoresi

Found by PR #510's CI: test_0842_nvb_3d_parallel_adapt::test_poisson_fmg_on_3d_child_matches_gamg fails on the merged tree (base + development) with true relative error 1.0e-6 against the 1e-8 gate, while passing on either side alone.

Mechanism, measured

Since #471 the geometric-MG bundle's default smoother is gmres/4 ("robust"). A Krylov smoother makes the PCMG preconditioner vary between applications, and the outer KSP on the scalar path is plain gmres, whose recurrence assumes a fixed preconditioner. The signature is exact: preconditioned residual drops nine orders and the KSP reports CONVERGED_RTOL at 3 iterations, while the true residual stalls at 1.3e-6 from iteration 2.

One-knob probes on the failing tree (3-D adapt child, 5198 cells, Poisson T=z):

configuration outer its true rel. error
bundle as shipped (gmres smoother, gmres outer) gmres 3 1.0e-6
mg_levels_ksp_type=richardson (linear PC) gmres 5 4.6e-10
bundle as shipped + ksp_type=fgmres fgmres 3 7.5e-10

Either a linear smoother or a flexible outer restores honest convergence; the shipped pairing is the only failing combination.

Why development's own CI is green

The variation of a gmres smoother per application depends on the hierarchy quality; on current development hierarchies the recurrence drift stays below the 1e-8 test gate. PR #510's one-level-per-doubling hierarchies (subsampled, transfers spanning more refinement) push the drift to 1e-6. The pairing is unsound everywhere; the exposure threshold is what differs — same class as the fieldsplit ruling that made fgmres mandatory over Krylov sub-solves.

Proposed fix

multigrid_options: when the bundle's smoother variant resolves to a Krylov type, also set the outer KSP to fgmres under the same user-ownership latch #471 introduced (a user-owned ksp_type is respected and warned about). The fast (richardson) variant needs no outer change. Regression: a unit assertion on the bundle pairing plus test_0842 as the integration canary — it bites on any hierarchy the drift exceeds the gate on.

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