Solver algorithms#

Reference for the analysis types and backend algorithms femorph-solver ships. The user-guide section walks through how to drive each solver; this page lists the underlying algorithm and its sources.

Static#

Linear static analysis \(\mathbf{K}\mathbf{u} = \mathbf{f}\) after Dirichlet elimination. Driven by Model.solve().

  • Boundary-condition reduction. Master/slave partitioning — Cook §2.10; Bathe §3.4.

  • Linear backend. Any SPD-capable solver from the auto-chain (Pardiso → CHOLMOD → MUMPS → UMFPACK → SuperLU) resolves the reduced system.

Full cites in femorph_solver.solvers.static.

Cyclic modal#

Per-harmonic-index modal analysis on a single sector. Driven by Model.cyclic_modal_solve() and the functional femorph_solver.solvers.cyclic.solve_cyclic_modal().

  • Constraint reduction. P^H K P complex-Hermitian reduction per harmonic index \(k\); the plan is cached once across \(k\) (topology-invariant, see femorph_solver.solvers.cyclic._CyclicReductionPlan).

  • Real augmentation identity. Complex Hermitian (K, M) are factored at the n-sized complex level inside the OPinv, then embedded into a real 2n system only for the eigsh iteration — halves the factor cost. Grimes-Lewis-Simon, SIAM J. Matrix Anal. Appl. 15 (1994), §5.

  • Theory provenance. Thomas, J. Sound Vib. 1979; Wildheim, J. Appl. Mech. 1979.

Full cites in femorph_solver.solvers.cyclic.

Transient#

Newmark-β time-integration for \(\mathbf{M}\ddot{\mathbf{u}} + \mathbf{C}\dot{\mathbf{u}} + \mathbf{K}\mathbf{u} = \mathbf{f}(t)\). Driven by Model.transient_solve().

  • Scheme. Newmark 1959 with γ = 0.5, β = 0.25 (average acceleration; unconditionally stable).

  • Damping. Optional Rayleigh damping C = αM + βK.

  • Source. Hughes §9.1–§9.2; Bathe §9.2.

Full cites in femorph_solver.solvers.transient.

Harmonic (scaffolded)#

Frequency-domain steady-state response \((\mathbf{K} - \omega^{2}\mathbf{M} + i\omega\mathbf{C})\tilde{\mathbf{u}} = \tilde{\mathbf{f}}\). Scaffolding lives in femorph_solver.solvers.harmonic; full validation against a MAPDL HARFRQ sweep is roadmap.

Linear backends#

Shift-invert factorisation is routed through a pluggable linear solver registry. Every backend is wrapped around an established upstream implementation; the wrappers cite their upstream paper in the References docstring block.

Name

Kind

Upstream

superlu

direct, LU

scipy.sparse.linalg.splu — Demmel/Eisenstat/Gilbert/Li/Liu 1999; Li 2005

cholmod

direct, Cholesky (SPD)

SuiteSparse CHOLMOD — Chen/Davis/Hager/Rajamanickam 2008

umfpack

direct, LU

SuiteSparse UMFPACK — Davis, ACM TOMS 2004

pardiso

direct, LU / Cholesky

Intel MKL Pardiso via pypardiso — Schenk & Gärtner 2004, 2006

mkl_direct

direct, LU / Cholesky

Intel MKL Pardiso via in-tree ctypes wrapper (PR #126); unlocks iparm control + out-of-core factor

mumps

direct, multifrontal

MUMPS via python-mumps — Amestoy et al. 2001, 2006

cg

iterative, Krylov

scipy cg — Hestenes & Stiefel 1952

gmres

iterative, Krylov

scipy gmres — Saad & Schultz 1986

pyamg

iterative, algebraic multigrid (SPD)

PyAMG — Ruge/Stüben 1987; Bell/Olson/Schroder

Full cites live in each backend’s module docstring under femorph_solver.solvers.linear.

Eigen backends#

Name

Algorithm / source

arpack

Implicitly-restarted Arnoldi, shift-invert. Lehoucq/Sorensen 1996; Lehoucq/Sorensen/Yang 1998 (Users’ Guide)

lobpcg

Locally-optimal block preconditioned CG. Knyazev 2001; Knyazev et al. 2007 (BLOPEX)

primme

Preconditioned iterative multi-method eigensolver. Stathopoulos/McCombs 2010; Davidson 1975

lapack_dense

Dense LAPACK syevr / heevr for small problems. LAPACK Users’ Guide 1999; Parlett 1998 §7; Golub/Van Loan §8

Full cites live in each backend module under femorph_solver.solvers.eigen.

See also

Solving — how-to walk-throughs for each analysis type, backend autotune behaviour, and performance notes.