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
Found by PR #510's CI:
test_0842_nvb_3d_parallel_adapt::test_poisson_fmg_on_3d_child_matches_gamgfails 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 plaingmres, 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):
mg_levels_ksp_type=richardson(linear PC)ksp_type=fgmresEither 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
fgmresmandatory over Krylov sub-solves.Proposed fix
multigrid_options: when the bundle's smoother variant resolves to a Krylov type, also set the outer KSP tofgmresunder the same user-ownership latch #471 introduced (a user-ownedksp_typeis respected and warned about). Thefast(richardson) variant needs no outer change. Regression: a unit assertion on the bundle pairing plustest_0842as the integration canary — it bites on any hierarchy the drift exceeds the gate on.Underworld development team with AI support from Claude Code