//! # `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};