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)