Element pitfalls#
Every element kernel has failure modes that are documented in the FE literature but often forgotten by users picking an element by catalogue number. This page is the diagnostic matrix: rows are elements femorph-solver ships, columns are the failure modes that bite users in practice. Each cell links to the element’s reference page (for the formulation-level fix) and to a verification example (for a runnable demonstration).
The flow is symptom → element class → failure mode → fix. If you already know which element you’re using and what symptom you see, jump straight to the element’s section below.
Quick-look matrix#
The first row of every cell names the failure mode; the second row gives the recommended fix.
Element |
distortion |
aspect-ratio |
through-thickness |
|||
|---|---|---|---|---|---|---|
HEX8 (plain Gauss) |
severe on bending; switch to EAS / B-bar |
severe as ν→0.5; B-bar / EAS |
none (full integration) |
moderate; degrades as J → 0 |
keep < 5:1 in bending |
1 element per thickness is too few |
HEX8 (EAS) |
cured on regular meshes; partial cure on distorted |
cured |
none |
mild; better than plain |
tolerates 8-10:1 |
2 elements / thickness for plates |
HEX20 |
none (cubic in each direction) |
mild; B-bar still helpful at ν > 0.49 |
none |
strong against distortion |
tolerates 15-20:1 |
1 element / thickness adequate |
TET10 |
none (quadratic) |
mild; rises near ν = 0.5 |
none |
excellent |
tolerates 20:1 |
1 element / thickness fine |
WEDGE15 |
none (degenerate HEX20) |
mild |
none |
good |
10-15:1 |
1 / thickness |
PYR13 |
none (degenerate HEX20) |
mild |
none |
good |
10:1 |
1 / thickness |
QUAD4 (plain) |
severe on plane-strain bending |
severe as ν→0.5 |
none (full integration) |
moderate |
keep < 5:1 |
n/a (2D) |
QUAD4 (Wilson-Q6) |
cured on regular meshes |
cured |
none |
mild; better than plain |
8-10:1 |
n/a |
QUAD4_SHELL (DKT) |
cured (Mindlin transverse-shear stabilisation) |
n/a (membrane / bending split) |
none |
moderate |
8-10:1 |
1-2 / thickness for thin shells |
BEAM2 (Euler-Bernoulli) |
none (Hermite cubics absorb shear analytically) |
n/a (1D line) |
none |
n/a (1D) |
L/h > 10 for slender-beam regime |
n/a |
TRUSS2 / SPRING |
n/a (axial only) |
n/a |
none |
n/a |
n/a |
n/a |
Cells marked severe mean the failure produces non-trivial quantitative error on engineering quantities of interest, not just slow convergence — replacing the element with the recommended fix is mandatory, not optional.
Per-element notes#
HEX8#
The 8-node trilinear hex is the workhorse of 3D structural FEA.
Plain-Gauss integration is the default but suffers two classical
failure modes — both are addressed by the
enhanced strain (EAS) variant, which is what
femorph-solver uses by default when integration="enhanced_strain"
is requested on Model.assign.
Shear locking — On bending-dominated meshes plain HEX8 develops \(O(1)\) error that the user reads as “the bracket is way stiffer than the analytical formula predicts”. Demonstrated in Shear-locking demonstration — HEX8 integration variants — a slender-cantilever sweep that walks the error all the way to convergence with EAS but stalls at 30-50 % over-stiffness with plain Gauss.
Volumetric locking — As \(\nu \to 0.5\) (rubber, near-incompressible plastic) the dilatational mode loses its representation in the trilinear basis; plain HEX8 stiffens by orders of magnitude. EAS or B-bar cures it; for truly incompressible problems, use HEX20.
Distortion — Even EAS struggles when the element Jacobian goes near-zero. Trim aspect-ratio outliers (Section Mesh quality) before suspecting a kernel bug.
Reference: HEX8 — 8-node trilinear hexahedron.
HEX20#
The 20-node serendipity hex is the natural choice when bending matters and you can afford the 2.5× DOF cost. Cubic in each direction so it neither shear-locks nor volumetric-locks significantly under any standard load case. Distortion robustness is excellent; aspect-ratio limit is generous (15-20:1).
The one footnote: for fully incompressible materials (\(\nu = 0.5\)) the constant-pressure mode still has no basis representation, so use the B-bar variant or switch to a mixed u-p formulation (not yet shipped — see Known limitations).
Reference: HEX20 — 20-node serendipity hexahedron.
TET10#
The 10-node quadratic tet is the workhorse of automatic-meshed 3D analysis (CAD-driven, complex geometries) where structured hex meshing isn’t practical. No locking, excellent distortion robustness, and modern mesh generators (Gmsh, Tetgen) produce clean TET10 meshes from STEP files.
Two notes:
TET10 needs ~3× the DOFs of HEX8 for similar accuracy on bending-rich problems; HEX-meshing pays off for slender bracket geometries.
On problems with sharp re-entrant corners, the TET10 stress recovery near the singularity converges to the “right infinity” (the singular solution) more cleanly than HEX8 — the higher-order basis matters where the field is rough.
Reference: TET10 — 10-node quadratic tetrahedron.
WEDGE15 / PYR13#
Degenerate HEX20 elements at the topology boundary between HEX20 and TET10 — wedges along a hex-tet transition layer, pyramids at the apex of a hex sub-domain meeting a tet sub-domain. Properties inherited from HEX20 with the degeneracy-induced stiffness reduction; mainly used to make hybrid hex-tet meshing tractable.
Reference: WEDGE15 / PYR13 — degenerate-corner serendipity hex.
QUAD4 (plane and shell)#
The 2D / shell counterpart of HEX8. Plain-Gauss QUAD4 has the same failure modes — shear locking on plane-strain bending, volumetric locking near \(\nu = 0.5\). Use the Wilson-Q6 (incompatible-modes) variant for plane elements; DKT (Discrete Kirchhoff Triangle, the non-Mindlin plate that’s used inside QUAD4_SHELL on the bending side) inherently fixes the shell-bending case.
A specific QUAD4_SHELL note: the kernel ships 5 DOFs per node (3 translations + 2 rotations). Coupling a shell to a solid mesh that carries the third rotation (drilling DOF) requires an explicit constraint. See Known limitations.
Reference: QUAD4_PLANE — 4-node bilinear plane quad, QUAD4_SHELL — 4-node Mindlin-Reissner flat shell.
BEAM2#
The 2-node Hermite-cubic beam is the only line element where shear locking is structurally absent — the cubic Hermite shape functions absorb the linear-shear constraint analytically (Cook 2002, Table 16.3-1). Distortion isn’t a concept (1D line elements have no Jacobian to distort).
The slenderness rule of thumb: BEAM2 is a faithful Euler-Bernoulli element for \(L/h > 10\). Below that the shear-deformation correction matters and a Timoshenko upgrade is needed (planned, see roadmap). For very long beams (\(L/h > 1000\)) numerical conditioning of the bending- stiffness term degrades; subdivide into more elements rather than push the slenderness limit.
Reference: BEAM2 — 3D 2-node Euler-Bernoulli beam.
TRUSS2 and SPRING#
Pure-axial elements with no transverse stiffness. The
transverse-DOF rows of the element K matrix are identically
zero; the assembled global K has zero diagonals on those DOFs
unless another element contributes. solve_static detects
zero-diagonal rows via the threshold
|K_ii| <= 1e-12 * max(|K_ii|) and folds them into the
Dirichlet set automatically — see
Static analysis. No user action required;
this is not a bug to chase.
Reference: TRUSS2 — 2-node 3D axial bar, SPRING — 2-node longitudinal spring.
Symptom-driven cross-reference#
If you opened this page because of a specific symptom, the fastest path to a fix is the troubleshooting flowchart in Troubleshooting flowchart — it asks five questions and lands you on the right element / mesh / BC / solver page. This pitfalls matrix is the companion table the flowchart points back to when “which element variant?” is the answer.
See also#
Mesh quality — element-aspect-ratio and Jacobian thresholds.
Troubleshooting flowchart — symptom-driven decision tree.
Element kernels — per-element formulation references.
Known limitations — capabilities the library does not have today (incompressible u-p mixed, drilling-DOF shell, Timoshenko beam).