P5-1 instruments: the overset fluid saves/loads its rigid-phase state (RTX_FSI2O_SAVE / _LOAD — a coupling experiment then costs seconds, not the 12-minute rigid march), dumps the interface edges when the composite refuses a patch (RTX_FSI2O_DUMP_DIR, at the advance where the overlap is rebuilt), the release time is the fluid's clock; patch_cylinder_flag_deformed: cells inside the flag are holes at small bends and both sweep counts (the cantilever shape does not reproduce the P5-1 death — the CSVs show a coupling runaway), and a dumped-edges reproduction test
Documentation / Build User Guide (push) Canceled after 0s
Documentation / Build API Documentation (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 / Test (macos-latest) (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
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

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-07 08:09:56 -07:00
co-authored by Claude Fable 5.1
parent d74571e21a
commit 2ed36c3a8c
3 changed files with 309 additions and 6 deletions
@@ -98,12 +98,27 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
let dt = dt_fluid * cfg.subcycle as f64;
let zero_d = vec![0.0; 2 * fluid.interface.wetted.len()];
// Phase 1: rigid flag to t_release.
// Phase 1: rigid flag to t_release (`RTX_FSI2O_LOAD=dir` replaces the
// march with the saved state; `RTX_FSI2O_SAVE=dir` saves it).
let start = std::time::Instant::now();
let rigid_steps = (cfg.t_release / dt_fluid).round() as usize;
for _ in 0..rigid_steps {
fluid.step().expect("rigid fluid step");
if let Ok(dir) = std::env::var("RTX_FSI2O_LOAD") {
let t = fluid.load(&dir).expect("load");
assert!(
(t - cfg.t_release).abs() < dt_fluid,
"the saved state is at t = {t}, not t_release = {}",
cfg.t_release
);
} else {
for _ in 0..rigid_steps {
fluid.step().expect("rigid fluid step");
}
if let Ok(dir) = std::env::var("RTX_FSI2O_SAVE") {
fluid.save(&dir).expect("save");
}
}
// The release time is the fluid's clock (the rigid step count rounds).
let t_release = fluid.time();
let (rigid_drag, rigid_lift) = fluid.measure_force();
println!(
" {} OVERSET rigid phase: {rigid_steps} steps (dt {dt_fluid:.3e}) to t = {:.2} s in {:.0} s wall; wall drag {rigid_drag:.2} (rigid-flag reference {:.1}; the overset's own CFD2 at ny = 41: 137.8), lift {rigid_lift:.2}; rounds mean {:.2}",
@@ -280,7 +295,7 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
outcome = iqn_ref.solve(&d_predicted, pass);
}
}
let t_now = cfg.t_release + (step + 1) as f64 * dt;
let t_now = t_release + (step + 1) as f64 * dt;
match outcome {
Ok(c) => {
total_subiterations += c.iterations;