R4-m: RTX_FSI2O_NODE_CSV — per-node accepted load and displacement along the flag every coupled step

Each wetted node's (dx, dy, fx, fy) grouped bottom / tip / top (sidecar
<path>.nodes.csv: group, node, reference x, y, arc length) plus the
centreline uy at s = 1/4 (mean of the two straddling nodes) and 1/2.
Default off; gate on the R4-l line slice 6.0 -> 6.2 s (CPU V-cycle,
floor 7.5e-8, rtol 1e-3): main vs branch knob-off vs knob-on march CSV
and step CSV byte-identical (md5 70dcf484..., dd535386...); the node
sums equal the step CSV's fx_nodal / fy_nodal.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-24 22:36:17 -05:00
co-authored by Claude Opus 5.5
parent d9847cd818
commit e80b122854
3 changed files with 134 additions and 0 deletions
@@ -368,6 +368,15 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
.sqrt()
);
let mut node_csv = super::node_csv::NodeCsv::from_env(
&fluid.mesh,
&fluid.interface,
[a_dofs[0], a_dofs[1]],
|id| {
let d = flag.borrow().node_dofs(id);
[d[0], d[1]]
},
);
let fluid = RefCell::new(fluid);
let mut iqn = (cfg.coupler == "iqn").then(|| {
IqnIls::new(cfg.max_subiterations, 1.0)
@@ -626,6 +635,9 @@ pub fn run_march_overset(case: BenchmarkCase, config: &OversetMarchConfig) -> Ov
)
.unwrap();
}
if let Some(nc) = node_csv.as_mut() {
nc.write(t_now, &flag_state, &committed_nodal);
}
interval_drag.push(drag_now);
interval_lift.push(lift_now);
if (step + 1) % 10 == 0 {