Solving#
The solve phase turns a pre-processed Model
into numbers. femorph-solver exposes four top-level analyses and shares a
single backend registry underneath them:
\(K u = F\) — one factorisation, one back-solve. The fastest path, and the pre-stress foundation for everything else.
\(K \varphi = \omega^2 M \varphi\) — free-vibration eigenpairs via ARPACK / LOBPCG / PRIMME / dense.
\(M \ddot{u} + C \dot{u} + K u = F(t)\) — Newmark-β time integration with a one-time factorisation.
One-sector reduction + harmonic-index phase constraints for rotors and other periodic structures.
Backend and performance#
The linear / eigen backend registry, how "auto" picks,
and when to override.
Wall-time numbers for assembly, static, and modal across backends and mesh sizes.
BLAS / OpenMP cap via femorph_solver.set_thread_limit(),
FEMORPH_SOLVER_NUM_THREADS, and the per-call
thread_limit kwarg.
Extras#
In-depth investigation of every sparse SPD direct solver we
considered as an alternative to MKL Pardiso — measured
results, the NixOS OpenBLAS 0.3.30 bug we hit, why STRUMPACK
HSS didn’t land on hex elasticity, and a drop-in
MumpsSolver adapter.