R4-i + R5 design pass: RTX_FSI2O_REGEN_ONCE (one patch regeneration per coupled step; dies at step 0 — the registered test is void), the step CSV's subit/dres_y/dres_norm/fx_nodal/fy_nodal columns; the cut predictor's per-face term probe (enable_term_probe) and the curved instrument's exact side/wall viscous integrals — the static convex wall's flat residual is the viscous closure's first-order relative accuracy on O(1/h) fluxes
CI / Test (macos-latest) (push) Blocked by required conditions
CI / Test (ubuntu-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (macos-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (ubuntu-latest) (push) Blocked by required conditions
CI / WASM Build + Size Check (push) Blocked by required conditions
CI / Distributed Training Tests (push) Blocked by required conditions
CI / CI Success (push) Blocked by required conditions
CI / Build (macos-latest) (push) Waiting to run
CI / Build CPU-Only (Explicit) (push) Failing after 4s
CI / Clippy Check (push) Failing after 4s
Documentation / Build User Guide (push) Successful in 4s
CI / Format Check (push) Failing after 12s
CI / Build (ubuntu-latest) (push) Failing after 1m26s
Documentation / Build API Documentation (push) Failing after 1m28s
Performance Benchmarks / Run Benchmarks (push) Successful in 2m7s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-22 07:39:54 -05:00
co-authored by Claude Fable 5.1
parent f5735fdeaa
commit 501b45f9d0
5 changed files with 316 additions and 31 deletions
@@ -240,6 +240,15 @@ pub struct OversetFluid {
/// The last fluid step's mass defects (patch acceptor ring, background
/// fringe) and the patch's max divergence.
pub last_defects: Cell<(f64, f64, f64)>,
/// R4-i `RTX_FSI2O_REGEN_ONCE`: one patch regeneration per coupled
/// step — the first pass's meshes (one per substep) are reused by every
/// later subiteration of the same step (the wall polygon and velocity
/// still follow the candidate). Active between `begin_coupled_step`
/// calls only; `restore` rewinds the cursor to the step's first substep.
pub regen_once: bool,
pub regen_hold: bool,
pub regen_cache: Vec<rtx_cfd::mesh::PatchMesh>,
pub regen_cursor: usize,
}
impl OversetFluid {
@@ -503,6 +512,10 @@ impl OversetFluid {
correctors_total: Cell::new(0),
last_d: zero_d,
last_defects: Cell::new((0.0, 0.0, 0.0)),
regen_once: std::env::var("RTX_FSI2O_REGEN_ONCE").is_ok(),
regen_hold: false,
regen_cache: Vec::new(),
regen_cursor: 0,
warm_base: None,
warm_sweeps,
})
@@ -918,6 +931,12 @@ impl OversetFluid {
self.last_d = d.to_vec();
return Ok(());
}
if self.regen_once && self.regen_hold && self.regen_cursor < self.regen_cache.len() {
let mesh = self.regen_cache[self.regen_cursor].clone();
self.regen_cursor += 1;
self.last_d = d.to_vec();
return self.solver.set_patch_mesh(mesh);
}
let mesh = match self.patch_for(d) {
Ok(m) => m,
Err(e) => {
@@ -925,10 +944,22 @@ impl OversetFluid {
return Err(e);
}
};
if self.regen_once && self.regen_hold {
self.regen_cache.push(mesh.clone());
self.regen_cursor += 1;
}
self.last_d = d.to_vec();
self.solver.set_patch_mesh(mesh)
}
/// R4-i: a new coupled step begins — the first pass regenerates, the
/// later passes reuse (`RTX_FSI2O_REGEN_ONCE`; a no-op otherwise).
pub fn begin_coupled_step(&mut self) {
self.regen_hold = self.regen_once;
self.regen_cache.clear();
self.regen_cursor = 0;
}
/// The last geometry, for the offline reproduction
/// (`patch_cylinder_flag_deformed.rs`, `RTX_CF_EDGES_FILE`): one edge
/// per block, `x y` per line, when `RTX_FSI2O_DUMP_DIR` is set.
@@ -1198,6 +1229,7 @@ impl OversetFluid {
let t0 = std::time::Instant::now();
self.solver.restore(&saved.0);
self.field = saved.1.clone();
self.regen_cursor = 0;
self.t_restore
.set(self.t_restore.get() + t0.elapsed().as_secs_f64());
}