Skip to main content
Ctrl+K

femorph-solver

  • Getting started
  • User guide
  • Reference
  • Verification
  • Examples
    • API reference
    • Changelog
    • Provenance inventory
  • GitHub
  • Getting started
  • User guide
  • Reference
  • Verification
  • Examples
  • API reference
  • Changelog
  • Provenance inventory
  • GitHub

Section Navigation

  • Theory
    • Variational form and the discretised equations
    • Isoparametric mapping
    • Numerical quadrature
    • Global assembly
    • Boundary-condition elimination
    • Modal eigenvalue problem and shift-invert Lanczos
  • Element kernels
    • HEX8 — 8-node trilinear hexahedron
    • HEX20 — 20-node serendipity hexahedron
    • TET10 — 10-node quadratic tetrahedron
    • WEDGE15 / PYR13 — degenerate-corner serendipity hex
    • QUAD4_PLANE — 4-node bilinear plane quad
    • QUAD4_SHELL — 4-node Mindlin-Reissner flat shell
    • BEAM2 — 3D 2-node Euler-Bernoulli beam
    • TRUSS2 — 2-node 3D axial bar
    • SPRING — 2-node longitudinal spring
    • POINT_MASS — single-node lumped translational mass
  • Solver algorithms
    • Static analysis
    • Modal analysis
    • Cyclic-symmetry modal analysis
    • Transient analysis
    • Linear-solver backends
    • Eigen-solver backends
  • Validation framework
  • Reference
  • Solver algorithms
  • Modal analysis

Modal analysis#

Free-vibration modal eigenproblem \(\mathbf{K}\, \boldsymbol{\phi} = \omega^{2}\, \mathbf{M}\, \boldsymbol{\phi}\), driven by Model.modal_solve. The mathematical foundations live in Modal eigenvalue problem and shift-invert Lanczos; this chapter covers the implementation.

Algorithm#

  1. Assemble \(\mathbf{K}\) and \(\mathbf{M}\) from the element kernels (consistent or row-summed lumped, per the lumped keyword).

  2. Eliminate Dirichlet DOFs — the same partition the static path uses (Boundary-condition elimination). Both matrices are reduced to the free-DOF block.

  3. Shift-invert Lanczos. The default backend is scipy.sparse.linalg.eigsh() with sigma=0, which constructs the operator \(\mathbf{S}_{0} = \mathbf{K}^{-1}\, \mathbf{M}\), factors \(\mathbf{K}\) once through the registered linear backend (see Linear-solver backends), then re-uses the factor for every Lanczos matrix-vector product. Eigenvalues are back-transformed via \(\omega^{2} = 1 / \mu\).

  4. Mass-orthonormalise the returned eigenvectors — \(\boldsymbol{\phi}_{i}^{\!\top}\, \mathbf{M}\, \boldsymbol{\phi}_{j} = \delta_{ij}\). This is the natural basis for modal-superposition post-processing because the modal-mass matrix is the identity.

  5. Sort ascending by frequency and populate the ModalResult.

Backend dispatch#

The eigen_solver keyword controls backend selection:

  • "auto" (default) — ARPACK eigsh for small / medium problems, PRIMME (when installed) for large or many-mode runs.

  • "arpack" — explicit ARPACK shift-invert.

  • "primme" — PRIMME block-Davidson (Stathopoulos & McCombs 2010); needs the optional primme extra.

  • "lobpcg" — factor-free locally-optimal block PCG (Knyazev 2001) with selectable preconditioner.

See Eigen-solver backends for backend-side details.

Tunables#

  • n_modes — number of lowest modes to extract. Default 10.

  • sigma — shift target for the inverse map. Default 0; pass an explicit value to extract modes near a target frequency on a model whose lowest 50 modes lie below it.

  • lumped — diagonal HRZ row-sum mass for explicit-dynamics parity. Default consistent.

  • linear_solver — backend identifier for the inner shift-invert factor (see Linear-solver backends).

Public API#

  • femorph_solver.Model.modal_solve()

  • femorph_solver.solvers.modal.ModalResult — frequency (Hz), omega_sq ((rad/s)²), mode_shapes (mass-orthonormal).

  • femorph_solver.io.modal_result_to_grid() — attaches one mode_<k>_disp array per mode plus a magnitude scalar to a copy of the input grid.

Verification cross-references#

  • Fixed-free axial rod — natural frequencies — fixed-free rod natural frequencies.

  • Cantilever natural frequency — Rao 2017 Table 8.1 — first-mode cantilever.

  • Cantilever beam — first four bending modes — higher β_n L roots.

  • Simply-supported plate — first transverse bending mode — Kirchhoff plate fundamental.

Implementation: femorph_solver.solvers.modal.

References#

  • Parlett, B. N. (1998) The Symmetric Eigenvalue Problem, SIAM, §13–§14 (shift-invert Lanczos).

  • Lehoucq, R. B., Sorensen, D. C. and Yang, C. (1998) ARPACK Users’ Guide, SIAM SET 6.

  • Ericsson, T. and Ruhe, A. (1980) “The spectral transformation Lanczos method,” Math. Comp. 35, 1251–1268.

  • Stathopoulos, A. and McCombs, J. R. (2010) “PRIMME: PReconditioned Iterative MultiMethod Eigensolver — Methods and Software Description,” ACM TOMS 37 (2), 1–30.

  • Knyazev, A. V. (2001) “Toward the optimal preconditioned eigensolver: locally optimal block preconditioned conjugate gradient method,” SIAM J. Sci. Comput. 23 (2), 517–541.

  • Bathe, K.-J. (2014) Finite Element Procedures, 2nd ed., §11 (eigensolution methods).

On this page
  • Algorithm
  • Backend dispatch
  • Tunables
  • Public API
  • Verification cross-references
  • References
Show Source

© Copyright 2026, Alex Kaszynski.

Created using Sphinx 9.1.0.

Built with the PyData Sphinx Theme 0.17.1.