Files
rustytorch/crates/specialized/rtx-fsi/src/lib.rs
T
Omar SobhandClaude Fable 5 140310b223
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
rtx-fsi: the noise floor interrogated — smoothing refuted, IQN-ILS lands, tight coupling reopened
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
2026-08-21 06:42:05 -07:00

48 lines
2.1 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! # `rtx-fsi` — partitioned fluidstructure 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 fluidstructure 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};