FSI2 overset march: print every coupling setting once (coupler, floor, rtol, stall accept, max subit, predictor, s, patch offset × rows) and add RTX_FSI2O_LOAD_SETTLE (rigid steps after a loaded state, clock put back; default 20) — P5-3 lost a day to the default floor 2e-4 against the overnight marches' 1e-6: at 2e-4 every s = 1 release at ny = 62 rings at ± 1000 N/m (the flag's thickness breathing), at 1e-6 all are clean, thick patches included
CI / Build (macos-latest) (push) Failing after 17s
Performance Benchmarks / Run Benchmarks (push) Canceled after 0s
CI / Format Check (push) Canceled after 0s
CI / Clippy Check (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
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Build CPU-Only (Explicit) (push) Canceled after 0s
CI / Python Bindings (maturin) (macos-latest) (push) Canceled after 0s
Documentation / Build API Documentation (push) Canceled after 0s
Documentation / Build User Guide (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
CI / Test (macos-latest) (push) Canceled after 0s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_0116sg1Qz1gMv9hdcKP1XUam
This commit is contained in:
Omar Sobh
2026-09-08 14:52:02 -07:00
co-authored by Claude Fable 5.1
parent 3e019d1491
commit 75ab6e77b4
@@ -97,6 +97,23 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
let dt_fluid = fluid.dt_fluid;
let dt = dt_fluid * cfg.subcycle as f64;
let zero_d = vec![0.0; 2 * fluid.interface.wetted.len()];
// Every setting the acceptance rule reads, printed once: P5-3 lost a
// day to a floor of 2e-4 against the overnight marches' 1e-6.
println!(
" coupling: {} (reuse {}, ω0 {}, c1 {}), floor {:.1e}, rtol {:.1e}, stall accept {:.1e}, max subit {}, predictor {}, s = {}, patch offset {} h × {} rows",
cfg.coupler,
cfg.reuse,
cfg.initial_relaxation,
cfg.c1_interface,
cfg.tol_floor,
cfg.rtol,
cfg.stall_accept,
cfg.max_subiterations,
cfg.predictor,
cfg.subcycle,
std::env::var("RTX_FSI2O_PATCH_OFFSET").unwrap_or_else(|_| "6".into()),
std::env::var("RTX_FSI2O_PATCH_ROWS").unwrap_or_else(|_| "12".into()),
);
// Phase 1: rigid flag to t_release (`RTX_FSI2O_LOAD=dir` replaces the
// march with the saved state; `RTX_FSI2O_SAVE=dir` saves it).
@@ -109,6 +126,28 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
"the saved state is at t = {t}, not t_release = {}",
cfg.t_release
);
// The saved state is the FIELDS; the solvers' own warm state (the
// Schwarz acceptor warm start, the fringe flux correction, the
// embedded body's old volume fractions) is not in it, and a
// release straight off the load carries a pressure-level
// transient that the live march does not (P5-3: drag 27 vs 132
// twenty steps in, lift ± 1000 vs ± 4 — enough to kick the flag's
// thickness breathing at ny = 62). `RTX_FSI2O_LOAD_SETTLE=N`
// (default 20) rigid steps rebuild that state on the steady rigid
// flow; the clock is put back so the runs stay comparable.
let settle: usize = std::env::var("RTX_FSI2O_LOAD_SETTLE")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(20);
let (d0, l0) = fluid.measure_force();
for _ in 0..settle {
fluid.step().expect("settle fluid step");
}
fluid.solver.set_time(t);
let (d1, l1) = fluid.measure_force();
println!(
" settled the loaded state with {settle} rigid steps: wall drag {d0:.2}{d1:.2}, lift {l0:.2}{l1:.2}; clock back to t = {t:.4}"
);
} else {
for _ in 0..rigid_steps {
fluid.step().expect("rigid fluid step");