rtx-fea: ECSW model-order reduction — POD-Galerkin plus hyper-reduction, verified end to end
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 third Farhat gap. New rtx_fea::mor module:

- pod::pod_basis — orthonormal SVD basis with an energy-criterion
  truncation. Verified: rank-2 data yields exactly 2 orthonormal modes that
  reconstruct every snapshot to machine precision; a loose tolerance
  truncates a dominant-mode-plus-noise set to one mode.
- nnls — Lawson-Hanson non-negative least squares with the early stop that
  makes ECSW work: iteration ends at the requested residual, and the
  active-set structure caps the support at one column per outer iteration,
  so sparsity falls out of the stopping tolerance. Verified against KKT
  conditions, exact positive solutions, negative-clipping, and a
  sparsity-vs-tolerance case. Its thresholds are RELATIVE to the problem's
  own scales — the first version used absolute cutoffs (1e-14) that
  silently ended the iteration on ECSW's small-magnitude training systems
  at 1.2e-3 instead of the requested 1e-4.
- ecsw::train_ecsw — element weights such that a small subset reproduces
  the reduced internal force (the virtual work against the basis) over the
  training snapshots. w = 1 solves the system exactly by construction, so
  it is always consistent; nonnegativity is what keeps a sampled element
  from producing energy.
- reduced::ReducedNonlinearModel — Newton in POD coordinates, assembling
  either every element (POD-Galerkin) or the ECSW sample, on the same
  per-element force/tangent machinery the nonlinear analysis uses.

End-to-end verification (tests/ecsw_mor.rs): a clamped nonlinear block,
snapshots from a 4-point load sweep, evaluated at an UNSEEN load factor:

    POD modes: 2         ECSW sample: 5 of 24 elements
    training residual 2.2e-7 (requested 1e-4)
    error vs full solve: POD-Galerkin 3.09e-7, ECSW 3.08e-7
    hyper-reduction cost (ECSW vs full ROM): 1.6e-8

And the assertion with the most teeth: the same 5 elements with their
weights forced to 1 read a relative error of 1.22 — a completely wrong
field — so the accuracy is carried by the WEIGHTS, not by the subset
happening to be representative.

Scope, stated plainly: geometrically linear, materially nonlinear,
homogeneous Dirichlet only (no lifting); the basis lives on the free DOFs.

559 rtx-fea tests, 0 failing.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Omar Sobh
2026-08-20 00:43:32 -07:00
co-authored by Claude Fable 5
parent b321a9aba7
commit 8071d5888d
7 changed files with 992 additions and 6 deletions
+29
View File
@@ -0,0 +1,29 @@
//! 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: geometrically linear, materially nonlinear (what the nonlinear
//! analysis supports), homogeneous Dirichlet data. Lifting for
//! inhomogeneous boundary values is not implemented and the basis is over
//! the free DOFs only.
pub mod ecsw;
pub mod nnls;
pub mod pod;
pub mod reduced;
pub use ecsw::{EcswModel, train_ecsw};
pub use nnls::nnls;
pub use pod::pod_basis;
pub use reduced::ReducedNonlinearModel;