rtx-cfd: overset Schwarz stall rule guarded (fires only within 10× the tolerance) — unguarded it cut CFD1's transient at round 3 every step and the coupled march diverged at ny=62 (pressure 4e4 → 1e140 by step 450); CFD1 harness knobs (stall, step cap, trace)
CI / Test (macos-latest) (push) Canceled after 0s
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Build CPU-Only (Explicit) (push) Canceled after 0s
Documentation / Build User Guide (push) Canceled after 0s
Performance Benchmarks / Run Benchmarks (push) Canceled after 0s
CI / Format Check (push) Canceled after 0s
CI / Clippy Check (push) Canceled after 0s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
CI / Python Bindings (maturin) (macos-latest) (push) Canceled after 0s
CI / Python Bindings (maturin) (ubuntu-latest) (push) Canceled after 0s
CI / WASM Build + Size Check (push) Canceled after 0s
CI / Distributed Training Tests (push) Canceled after 0s
CI / CI Success (push) Canceled after 0s
Documentation / Build API Documentation (push) Canceled after 0s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01X2GmJXeQ2njUecEKiJZ1G2
This commit is contained in:
Omar Sobh
2026-09-05 21:01:57 -07:00
co-authored by Claude Fable 5.1
parent 00f73eb70a
commit 02c855b9c4
2 changed files with 48 additions and 2 deletions
@@ -716,7 +716,17 @@ impl OversetPisoSolver {
// 20-round cap at n = 64, and a 7.5 h n = 128 march.
history.push(change);
let k = self.params.stall_rounds;
if k > 0 && history.len() > k && change > 0.7 * history[history.len() - 1 - k] {
// Guarded: a stall counts only once the exchange is already
// within 10× the tolerance — Anderson converges
// non-monotonically, and an unguarded 30%-over-k-rounds test
// fired at round 3 of the first corrector throughout CFD1's
// transient, under-converging every step until the coupled
// march diverged (pressure 4e4 → 1e140 by step 450 at ny = 62).
if k > 0
&& history.len() > k
&& change > 0.7 * history[history.len() - 1 - k]
&& change <= 10.0 * self.params.schwarz_tolerance * scale
{
schwarz_stalled += 1;
done = true;
break;