With the outer fixed to fgmres (#624), the measured bottleneck of a genuine Stokes solve moves squarely to the pressure sub-solve: fieldsplit_pressure runs fgmres+gasm with ksp_rtol = solver tolerance and ksp_max_it = 200, and the iteration readout sits AT 134-200 per outer application — 200 is the cap, so the Schur solve routinely exits unconverged (the "repeating iteration count is a cap" pattern; converged reason is never checked on the sub-block). On the 85k-cell contrast benchmark (~/+Simulations/place_route_health/) the pressure block accounts for most of the ~285-308 s genuine solve, for both velocity preconditioners (custom-P FMG and GAMG), which is why the velocity-block choice moves the total by only ~8%.
Two directions, not mutually exclusive:
- Make the inner Schur affordable: a better pressure preconditioner than gasm-on-a11 for discontinuous P0 pressure with variable viscosity (the eta-scaled pressure mass matrix is the standard candidate), so the cap is never reached.
- Make the inexactness deliberate: if the design intent is an inexact inner Schur under a flexible outer (the CITCOM margin design), the tolerance/cap should say so explicitly and cheaply (far fewer than 200 iterations), instead of paying 200 iterations for an accuracy that is then not achieved anyway.
Either way the current default pays maximum cost for unconverged inner solves, silently.
Underworld development team with AI support from Claude Code
With the outer fixed to fgmres (#624), the measured bottleneck of a genuine Stokes solve moves squarely to the pressure sub-solve: fieldsplit_pressure runs fgmres+gasm with ksp_rtol = solver tolerance and ksp_max_it = 200, and the iteration readout sits AT 134-200 per outer application — 200 is the cap, so the Schur solve routinely exits unconverged (the "repeating iteration count is a cap" pattern; converged reason is never checked on the sub-block). On the 85k-cell contrast benchmark (~/+Simulations/place_route_health/) the pressure block accounts for most of the ~285-308 s genuine solve, for both velocity preconditioners (custom-P FMG and GAMG), which is why the velocity-block choice moves the total by only ~8%.
Two directions, not mutually exclusive:
Either way the current default pays maximum cost for unconverged inner solves, silently.
Underworld development team with AI support from Claude Code