Eigenproblems
Overview
The solid and fluid chapters solved forward problems: given loads, find the response. Eigenproblems ask a different question — what happens on its own? Three physical questions share the same mathematical shape, a generalized eigenproblem $A x = \lambda B x$:
- Eigenfrequency — at what frequencies does a structure naturally vibrate?
- Buckling — at what compressive load does a column collapse sideways?
- Acoustics — at what frequencies does a cavity resonate?
All three are solved with the same solve(Physics(), …) marker pattern; the answer is a set of eigenvalues (frequencies or load factors) and eigenvectors (mode shapes) rather than a single field.
Free vibration
A structure's natural vibrations are the eigenpairs of its stiffness $K$ against its mass $M$,
\[K \varphi = \omega^2 M \varphi ,\]
where each $\omega$ is an angular frequency and $\varphi$ its mode shape. The lowest modes matter most, because those are the ones a real excitation is most likely to hit.
Rasmah.Eigenfrequency — Type
EigenfrequencyFree (modal) vibration: solve the generalized eigenproblem $K\varphi = \omega^2 M\varphi$ for the natural frequencies and mode shapes of a structure.
Theory
A structure's natural vibrations are the eigenpairs of its stiffness $K$ against its mass $M$: $K\varphi = \omega^2 M\varphi$. Each eigenvalue $\omega^2$ is a squared angular frequency, and its eigenvector $\varphi$ the corresponding mode shape. The lowest modes are the ones a structure is most likely to be excited into, so they matter for design.
Solving
solve(Eigenfrequency(), m, material; fixed, nev = 6) returns (; frequencies, values, modes) — the natural frequencies in Hz, the $\omega^2$ values, and the mode shapes. The material supplies the stiffness and the density (for the mass matrix). Fixed supports (via fixed) remove rigid-body modes.
Example
julia> Eigenfrequency() isa AbstractPhysics
trueA worked example: a block fixed on one face
m = tetrahedralize_box(1.0, 1.0, 1.0, 6, 6, 6)
left = nodes_in_box(m, [0.0, 0.0, 0.0], [0.0, 1.0, 1.0])
r = solve(Eigenfrequency(), m, steel; fixed=left, nev=4)
round.(r.frequencies; digits=3)4-element Vector{Quantity{Float64}}:
559.475 Hz
570.117 Hz
798.921 Hz
1300.513 HzThe first four natural frequencies of a steel block clamped on one face come out at $559$, $570$, $799$, and $1300$ Hz. Each is paired with a mode shape — the deformation pattern the structure takes at that frequency:
vtk(m; field=r.modes[1][1:3:end], fieldname="mode 1 u_x", edges=false)Buckling
A column shortens under compression — until a critical load, when it suddenly bows sideways instead. That instability is buckling. The geometric (stress) stiffness $K_\sigma$ captures the effect: compression adds a destabilizing term, and buckling happens at the smallest load multiple $\lambda$ for which
\[K \varphi = \lambda\,(-K_\sigma) \varphi\]
has a solution. $\lambda$ is the critical load factor — multiply the reference load by it and the structure buckles.
Rasmah.Buckling — Type
BucklingLinear (bifurcation) buckling: solve $K\varphi = \lambda(-K_\sigma)\varphi$ for the critical load factors and buckling modes of a compressed structure.
Theory
A column under compression stiffens or softens depending on the load. The geometric (stress) stiffness $K_\sigma$ captures that: a compressive load adds a destabilizing term, and at a critical multiple $\lambda$ of the load the structure bifurcates — it buckles sideways instead of shortening. The critical factor is the smallest eigenvalue of $K\varphi = \lambda(-K_\sigma)\varphi$, where $K$ is the elastic stiffness and $K_\sigma$ is built from the stress of the pre-buckling state.
Solving
solve(Buckling(), m, material; fixed, loads, nev = 6) first solves the pre-buckling state under the reference loads, then returns (; factors, modes) — the critical load factors $\lambda$ (multiply the reference load by $\lambda$ to buckle) and the buckling mode shapes.
Example
julia> Buckling() isa AbstractPhysics
trueA worked example: the critical load
n = size(m.nodes, 2)
right = nodes_in_box(m, [1.0, 0.0, 0.0], [1.0, 1.0, 1.0])
loads = zeros(3n)
for i in right.ids
loads[3i-2] = -1e8 / length(right.ids)
end
rb = solve(Buckling(), m, steel; fixed=left, loads=loads, nev=3)
round.(rb.factors; digits=3)3-element Vector{Float64}:
251.858
262.139
439.995The reference load was $10^8$ N of compression; the first factor $\lambda \approx 252$ says the column buckles when that load is scaled to $\approx 2.5\times10^{10}$ N.
Acoustic cavity modes
Sound in a cavity is a pressure field whose standing waves satisfy the Helmholtz equation. The eigenmodes are
\[K p = \frac{\omega^2}{c^2} M p ,\]
so the resonance frequencies are $f = \omega/2\pi$, set by the sound speed $c$ and the cavity size. A rigid cavity's lowest non-trivial mode is the half-wavelength $f_1 = c/(2L)$.
Rasmah.Acoustics — Type
AcousticsAcoustic cavity modes: the scalar Helmholtz eigenproblem $K p = (\omega^2/c^2) M p$ for the standing-wave frequencies of an enclosed fluid.
Theory
Sound in a cavity is a pressure field $p$ whose standing waves satisfy the Helmholtz equation. Its eigenmodes obey $K p = (\omega^2/c^2) M p$, where $c$ is the sound speed of the fluid and $\omega$ the angular frequency, so the mode frequencies are $f = \omega/2\pi$. A rigid wall admits a constant-pressure mode at $\omega = 0$; pin one pressure dof (via fixed) to remove it.
Solving
solve(Acoustics(), m, material; fixed, nev = 6) returns (; frequencies, wavenumbers, values, modes) — the mode frequencies in Hz, the wavenumbers $\omega/c$, the $\omega^2$ values, and the pressure mode shapes. The material supplies the sound_speed (derived from its elastic constants and density).
Example
julia> Acoustics() isa AbstractPhysics
trueA worked example: the fundamental cavity mode
air = Material(youngs_modulus=1.4e5, poisson_ratio=0.25, density=1.2)
sound_speed(air)374.16573867739413ra = solve(Acoustics(), m, air; fixed=[1], nev=4)
round.(ra.frequencies; digits=3)4-element Vector{Quantity{Float64}}:
19.802 Hz
189.222 Hz
189.222 Hz
195.836 HzThe sound speed is $\approx 374$ m/s, so a unit cavity's first standing wave sits near $c/(2L) = 187$ Hz — the $189$ Hz pair in the spectrum (two degenerate directions). The mode shape is the pressure field of that wave:
vtk(m; field=ra.modes[2], fieldname="pressure mode", edges=false)Next steps
Eigenproblems reuse the sparse stiffness and mass matrices assembled in the forward FEM chapters, and the eigensolver is part of the Sparse linear algebra chapter. For the physics these modes describe — vibration, stability, and acoustics — the forward solves are in the earlier FEM chapters.
