diff --git a/crates/specialized/rtx-fsi/tests/fsi2_harness/overset_march.rs b/crates/specialized/rtx-fsi/tests/fsi2_harness/overset_march.rs index d7b4bbf..5c5f6a8 100644 --- a/crates/specialized/rtx-fsi/tests/fsi2_harness/overset_march.rs +++ b/crates/specialized/rtx-fsi/tests/fsi2_harness/overset_march.rs @@ -91,10 +91,25 @@ pub struct OversetMarchResult { } pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> OversetMarchResult { - let cfg = config.clone(); + let mut cfg = config.clone(); let mut fluid = OversetFluid::build_case(case, cfg.ny, cfg.flag_nx, cfg.sweeps, cfg.max_rounds) .expect("overset fluid"); let dt_fluid = fluid.dt_fluid; + // R4-d (2026-09-21): the acceleration-scaled floor. The loop converges + // the displacement; the fluid feels its second difference over dt², so + // a fixed floor's admissible acceleration noise quadruples per rung + // (R4: the FSI3 force spikes). `RTX_FSI2O_TOL_FLOOR_DT2=` sets floor = value · (dt_fluid / 3.44e-4)². + if let Some(f0) = std::env::var("RTX_FSI2O_TOL_FLOOR_DT2") + .ok() + .and_then(|v| v.parse::().ok()) + { + cfg.tol_floor = f0 * (dt_fluid / 3.44e-4).powi(2); + println!( + " floor scaled with dt² (R4-d): {:.3e} at dt {:.3e} (from {f0:.1e} at 3.44e-4)", + cfg.tol_floor, 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