Element library#

femorph-solver ships a library of structural finite elements. Each element is built from published FEM theory (textbook / journal citations on its theory page) and named to match the corresponding MAPDL element so existing input decks translate one-to-one. Correctness is verified against independently-derived closed-form solutions and cross-checked numerically against MAPDL on shared benchmarks — MAPDL is a yardstick, not a source of implementation detail.

Pick an element by dimension and kinematics:

Element

Kind

Notes

LINK180

3D 2-node truss

Axial only; 3 DOF/node.

COMBIN14

3D 2-node spring

Longitudinal KEYOPT(2)=0; 3 DOF/node.

MASS21

1-node point mass

KEYOPT(3)=2; 3 DOF/node.

BEAM188

3D 2-node Euler–Bernoulli beam

6 DOF/node; axial + torsion + two bending planes.

PLANE182

2D 4-node quad

2 DOF/node; plane stress / plane strain.

SHELL181

4-node Mindlin shell

Selective reduced integration; drilling stabilisation.

SOLID185

3D 8-node hex

2×2×2 Gauss; B-bar / enhanced-strain options.

SOLID186

3D 20-node serendipity hex

3×3×3 Gauss; degenerate wedge (15) and pyramid (13) auto-dispatched.

SOLID187

3D 10-node tet

4-point stiffness Gauss, 15-point mass Gauss.

Registry and dispatch#

Element classes register into femorph_solver.elements and are discovered by string name:

from femorph_solver.elements import get, registered

registered()
# ['BEAM188', 'COMBIN14', 'LINK180', 'MASS21', 'PLANE182', 'SHELL181',
#  'SOLID185', 'SOLID186', 'SOLID186P', 'SOLID186W', 'SOLID187']

SOLID185 = get("SOLID185")

On an femorph_solver.Model, the registry is queried through et():

m = femorph_solver.Model()
m.et(185, "SOLID185")          # ``ET,185,SOLID185`` in MAPDL terms

Every element class implements the ElementBase interface — ke() for stiffness, me() for mass, optional ke_batch() / me_batch() for vectorised assembly.