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#
Assemble \(\mathbf{K}\) and \(\mathbf{M}\) from the element kernels (consistent or row-summed lumped, per the
lumpedkeyword).Eliminate Dirichlet DOFs — the same partition the static path uses (Boundary-condition elimination). Both matrices are reduced to the free-DOF block.
Shift-invert Lanczos. The default backend is
scipy.sparse.linalg.eigsh()withsigma=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\).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.
Sort ascending by frequency and populate the
ModalResult.
Backend dispatch#
The eigen_solver keyword controls backend selection:
"auto"(default) — ARPACKeigshfor 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 optionalprimmeextra."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 onemode_<k>_disparray 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).