solver, model, engine: linear buckling steps

Procedure::Buckle {modes, shift}: the step's loads as a linear preload, K_σ from its stresses,
and (K + λ K_σ) φ = 0 by block Lanczos in the K inner product: K⁻¹(−K_σ) on Cholesky without a
shift, the buckling transformation (K + σ K_σ)⁻¹ K on LDLᵀ with one, whose inertia counts the
load factors below σ (Grimes–Lewis–Simon 1994). Lanczos gains an operand and an eigenvalue map
(defaults keep frequency steps bit for bit) and reports converged negative eigenvalues. Results
are frequency results with a `buckling` part; modes display with their load factor.
solve.buckle (in the Static drop-down); Abaqus *BUCKLE, Nastran SOL 105 and LS-DYNA refuse it by
name. Euler columns of hex20 within 0.18 % of Engesser's load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 13:30:59 -04:00
1 parent 9a8ae50bca
commit 1b57e2e672
20 files changed
+511 -27

No files matched your search

+20
View File
@@ -173,6 +173,26 @@ On a hex8 stiffness pattern of 140 000 equations (1.5 · 10⁸ entries) the LDL
times the Cholesky factor, and 1.2 times on a shift with 10 600 negative eigenvalues and 7 700
2 × 2 pivots (`ldlt::tests::speed_against_cholesky`).
## Linear buckling
A step `{"type": "buckle", "modes": 4}` (`Procedure::Buckle`, solved by `solve.buckle`,
`fieldcraft_solver::buckle`) solves its loads and prescribed motions as a linear static preload,
forms the initial-stress stiffness K_σ = ∫ (∇N_a · σ ∇N_b) I dV of every solid and 2D element
from the preload's stresses at the stiffness points (`Solid::geometric_stiffness`,
`Plane::geometric_stiffness`, with the axisymmetric hoop term), and finds the load factors λ
with (K + λ K_σ) φ = 0 by block Lanczos in the K inner product (Grimes, Lewis & Simon 1994):
without a shift on K⁻¹(−K_σ) (θ = 1/λ, Cholesky of K), the lowest positive λ; with `"shift": σ`
on the buckling transformation (K + σ K_σ)⁻¹ K (θ = λ/(λ − σ), LDLᵀ), the λ above σ, and the
LDLᵀ inertia counts the load factors between 0 and σ, reported. Negative load factors (the
reversed load buckles) are reported, not returned. Modes are scaled to a largest component of 1
and display and probe like frequency modes (their value is λ; `FrequencyResult::buckling`).
Boundary conditions hold their directions at zero in the eigenproblem; pressures are dead loads
(no load stiffness); trusses, shells and beams are refused (no K_σ yet). Decks: Abaqus
`*BUCKLE, EIGENSOLVER=LANCZOS` (refused after a general step, whose loaded state Abaqus would
buckle from, and with a shift); Nastran SOL 105 and LS-DYNA refuse it by name. Verified by Euler
columns of hex20 (pinned and clamped–free, 0.18 % from Engesser's shear-corrected load) and the
shifted form against the plain one.
## Nonlinear static analysis (finite strain)
A step `{"type": "nonlinear_static", …}` (`Procedure::NonlinearStatic`, solved by