Source code for femorph_solver.elements._registry
"""Element-type registry — neutral kernel name → element class.
Kernels register under their **neutral, topology-first name**
(``HEX8``, ``HEX20``, ``TET10``, ``WEDGE15``, ``PYR13``, ``BEAM2``,
``QUAD4_SHELL``, ``QUAD4_PLANE``, ``TRUSS2``, ``SPRING``,
``POINT_MASS``). These are the only names the registry recognises;
foreign-deck nomenclature (MAPDL ``SOLID185`` / NASTRAN ``CHEXA`` /
Abaqus ``C3D8`` / …) is translated at each interop boundary into a
neutral name before reaching this registry.
"""
from __future__ import annotations
from femorph_solver.elements._base import ElementBase
_REG: dict[str, type[ElementBase]] = {}
def register(cls: type[ElementBase]) -> type[ElementBase]:
_REG[cls.name] = cls
return cls
[docs]
def get(name: str) -> type[ElementBase]:
"""Return the kernel class registered under its neutral ``name``.
Only canonical kernel names (``"HEX8"``, ``"TET10"``, …) are
accepted. Foreign-deck names must be translated at the interop
boundary (e.g. :class:`femorph_solver.interop.mapdl.APDL`) before
being passed here.
"""
try:
return _REG[name]
except KeyError as exc:
raise KeyError(f"element type {name!r} not registered; known: {sorted(_REG)}") from exc
def registered() -> list[str]:
return sorted(_REG)