//! Model-order reduction: POD-Galerkin projection with ECSW hyper-reduction. //! //! The pipeline, all offline steps verified by their own invariants: //! //! 1. Collect full-order solution snapshots (the caller's job — typically a //! parameter or load sweep of [`crate::analysis::NonlinearStaticAnalysis`]). //! 2. [`pod::pod_basis`] — orthonormal basis by SVD, truncated at an energy //! criterion. //! 3. [`ecsw::train_ecsw`] — nonnegative element weights so that a small //! element subset reproduces the reduced internal force over the //! training set ([`nnls`] with an early stop; sparsity comes from the //! stopping tolerance). //! 4. [`reduced::ReducedNonlinearModel`] — Newton in reduced coordinates, //! assembling only the sampled elements. //! //! Scope: homogeneous Dirichlet data; the basis is over the free DOFs //! only (lifting for inhomogeneous boundary values is not implemented). //! Kinematics are selected per [`reduced::Formulation`]: the original //! small-strain scope (geometrically linear, materially nonlinear), or //! total-Lagrangian Saint Venant–Kirchhoff matching //! `NonlinearDynamicAnalysis::with_total_lagrangian` — required when the //! snapshots come from a total-Lagrangian trajectory (the FSI flag). pub mod dynamic; pub mod ecsw; pub mod nnls; pub mod pod; pub mod reduced; pub use dynamic::{ReducedNewmark, ReducedState}; pub use ecsw::{EcswModel, ecsw_residual, train_ecsw, train_ecsw_formulated}; pub use nnls::nnls; pub use pod::pod_basis; pub use reduced::{Formulation, ReducedNonlinearModel};