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
Documentation / Build API Documentation (push) Canceled after 0s
Documentation / Build User Guide (push) Canceled after 0s
The tenth session ended on "lower the interface noise floor". This builds the levers and measures them, and the measurements overturn the diagnosis: - smooth_tractions: arclength moving average over the wetted surface, area-weighted, smooth normal-similarity factor so corners do not mix and the smoothed load stays continuous in the geometry. Nine unit tests. MEASURED NEGATIVE RESULT: the flip-scan floor is unchanged to 0.2% at radii 1-3h — the flip's load jump is coherent through the fluid field (mask rebuild shifts the pressure around the flipped cell), and a surface average preserves coherent shifts. Default off; the probe pins the attribution so nobody re-reaches for this lever. - IqnIls: interface quasi-Newton with inverse least squares (Degroote 2009) — filtered MGS least squares over secant columns (filter RELATIVE to column norm), cross-step history reuse, per-step set_tolerance. Model-map tests: exact on anisotropic linear maps within dim+2 passes (scalar Aitken provably cannot be), scale invariant, history reuse shortens the next step, stalls at the noise scale instead of diverging (fixture lesson: per-pass noise, not state-dependent noise — the latter has a genuine fixed point). - tests/fsi2_harness/: the FSI2 machinery extracted shared; verified pure code motion (committed release response reproduced to every printed digit). March gains RTX_FSI2_SMOOTH / RTX_FSI2_COUPLER=iqn / RTX_FSI2_REUSE knobs; pinned bands guard the default configuration. - tests/fsi2_interface_noise.rs: the probe. Flip-scan floor at subcycle 8: 3.05e-5 (pinned); smoothing attribution pinned; the cross-subcycle scan recorded but unpinned (the fixed geometry increment's wall-velocity trend, increment/dt_c, swamps the flip signal at small dt_c — a dt_c^2 scaling hypothesis died in that operationalization). THE OPERATIONAL FLOOR — the real release step subiterated at tolerance 1e-9 with residuals traced — converges DEEP at both subcycles: s8 aitken 3.4e-9 / iqn 1.6e-9, s2 both ~6.4e-10 in 5-6 passes. The flip jumps are events at specific geometries, not a floor under every step: the tenth session's subcycle-2 blowup was tolerance mis-budgeting (2e-4 held fixed while dt_c shrank), not an impassable floor. Probe bug found and fixed on the way: stale shared geometry leaked a 4.5e-5 phantom first residual into the first stall run; every measurement now resets the geometry on entry. All 924+17 tests green: lib 44 (was 27), piston 2, curved edge 1, FSI1, the committed FSI2 march (release response identical), the probe. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Lnyrw33Lu6rUhW42E9KHwq
48 lines
2.1 KiB
Rust
48 lines
2.1 KiB
Rust
//! # `rtx-fsi` — partitioned fluid–structure interaction coupling
|
||
//!
|
||
//! Fluid and structure solvers exist separately in this workspace
|
||
//! (`rtx-cfd`, `rtx-fea`) and nothing connects them. This crate is the
|
||
//! coupling layer: it moves loads from the fluid onto the structure and
|
||
//! motion from the structure back onto the fluid, across an interface
|
||
//! where the two meshes do **not** match — which is the normal case and
|
||
//! the source of most fluid–structure interaction errors.
|
||
//!
|
||
//! # Why the coupling is worth building separately
|
||
//!
|
||
//! The properties that make a partitioned coupling correct are testable
|
||
//! **independently of whether the solvers it couples are accurate**.
|
||
//! Conservation of force, moment and interface work are statements about
|
||
//! the transfer operators alone. So this crate can be validated now, on
|
||
//! solvers whose canonical-benchmark validation is still outstanding.
|
||
//!
|
||
//! It therefore depends on neither `rtx-cfd` nor `rtx-fea`. It takes
|
||
//! geometry and field values, and returns field values. Adapters to the
|
||
//! concrete solvers belong above it.
|
||
//!
|
||
//! # Scope, stated up front
|
||
//!
|
||
//! The **transfer operators** (`transfer`) are a small-displacement
|
||
//! formulation: interface velocity applied to the fluid through a
|
||
//! boundary condition, valid while displacements are small relative to a
|
||
//! cell. The **coupling driver** (`coupling`) carries no such limit — it
|
||
//! iterates whatever pass the adapter provides, and
|
||
//! `tests/piston_added_mass.rs` drives it against `rtx-cfd`'s moving-mesh
|
||
//! ALE solver (which owns the Discrete Geometric Conservation Law) at an
|
||
//! added-mass ratio of 6.25, reproducing the staggered divergence and the
|
||
//! Aitken recovery against a closed-form coupled frequency. Large motion
|
||
//! of complex geometry still wants a body-fitted unstructured ALE or an
|
||
//! embedded boundary treatment; that decision lives with the solvers, not
|
||
//! here.
|
||
|
||
#![forbid(unsafe_code)]
|
||
|
||
mod coupling;
|
||
mod error;
|
||
mod smoothing;
|
||
mod transfer;
|
||
|
||
pub use coupling::{Converged, IqnIls, Subiterated};
|
||
pub use error::FsiError;
|
||
pub use smoothing::smooth_tractions;
|
||
pub use transfer::{FluidFace, WettedSurface};
|