Static analysis#

Linear elastostatic problem \(\mathbf{K}\, \mathbf{u} = \mathbf{f}\), driven by Model.solve.

Algorithm#

  1. Assemble the global stiffness \(\mathbf{K}\) and force \(\mathbf{f}\) from the per-element ke and apply_force calls (see Global assembly).

  2. Eliminate Dirichlet DOFs. The free / constrained partition gives \(\mathbf{K}_{ff}\, \mathbf{u}_f = \mathbf{f}_f - \mathbf{K}_{fc}\, \mathbf{u}_c\) — the reduced system the backend factorises (see Boundary-condition elimination).

  3. Factor and solve \(\mathbf{K}_{ff}\) through the registered linear backend (see Linear-solver backends). Backend dispatch order: Pardiso CHOLMOD MUMPS UMFPACK SuperLU, first-installed wins.

  4. Reaction recovery\(\mathbf{r}_c = \mathbf{K}_{cf}\, \mathbf{u}_f + \mathbf{K}_{cc}\, \mathbf{u}_c - \mathbf{f}_c\). Populates StaticResult.reaction.

  5. Stress / strain recovery is lazy — the static result returns a DOF-indexed displacement plus a thin accessor protocol that calls Model.eel(u) / compute_nodal_stress on demand.

Public API#

  • femorph_solver.Model.solve() — the main entry point.

  • femorph_solver.solvers.static.StaticResult — the return type, with displacement / reaction / free_mask arrays.

  • femorph_solver.io.static_result_to_grid() — scatter the DOF vector onto (n, 3) UX/UY/UZ point data on a copy of the input grid.

Verification cross-references#

The verification gallery exercises every static-solve path:

Implementation: femorph_solver.solvers.static.

References#

  • Cook, R. D., Malkus, D. S., Plesha, M. E., Witt, R. J. (2002) Concepts and Applications of Finite Element Analysis, 4th ed., Wiley, §2.10 (Dirichlet partitioning).

  • Bathe, K.-J. (2014) Finite Element Procedures, 2nd ed., §3.4 (boundary-condition imposition), §8 (linear elastic static analysis).

  • Saad, Y. (2003) Iterative Methods for Sparse Linear Systems, 2nd ed., SIAM, §3 (sparse direct solvers).