hermit.failure ============== .. py:module:: hermit.failure .. autoapi-nested-parse:: ``failure_index`` / ``failure_field`` -- Tsai-Wu failure, wired to ``Orientation``. ``hermit._laminate.failure.tsai_wu_field`` documents its input as **laminate**-frame strains, but the DG0 strain-measure output is in the **element** in-plane frame. So the *same* ``Tε(θ)`` (engineering-Voigt strain rotation, element -> laminate axes) the constitutive path already applies (``hermit.fenics.kinematics.strain_rotation`` / ``hermit.csdl_helpers.rotate_abd``) is applied to the strains first, before calling ``tsai_wu_field`` (unmodified -- it already uses the correct ``(xz, yz)`` transverse-shear ordering, see that module's docstring). This is covered by ``tests/test_material_api.py::test_failure_index_respects_orientation`` ("two spellings of one physical laminate must agree"). This module's entry points take mid-surface strain / curvature / shear directly, in the **element frame, FE cell order** -- the raw DG0 strain-measure convention ``hermit.fenics.ops.strain_fields`` produces. ``hm.failure_index(state, ...)`` / ``hm.failure_field(state, ...)`` (``hermit.outputs``) are the public entry points; they assemble those measures off a solved ``ShellState`` and call in here. .. !! processed by numpydoc !! Functions --------- .. autoapisummary:: hermit.failure.failure_field hermit.failure.failure_index Module Contents --------------- .. py:function:: failure_field(mid_strain, curvature, shear_strain, material, orientation_cs=None, *, faces=(-0.5, 0.5)) ``(n_cells, 3)`` / ``(n_cells, 3)`` / ``(n_cells, 2)`` **element**-frame engineering-Voigt strain / curvature / shear (FE cell order -- e.g. ``model.strain_measure_op()``'s raw output) + a composite ``Material`` -> ``(n_cells, n_plies * len(faces))`` Tsai-Wu failure indices, rotated into the laminate frame by ``material.orientation`` first (``None`` => no rotation). .. !! processed by numpydoc !! .. py:function:: failure_index(mid_strain, curvature, shear_strain, material, orientation_cs=None, *, rho=100.0, faces=(-0.5, 0.5)) KS-aggregated scalar (``< 1`` safe) -- see ``failure_field``. .. !! processed by numpydoc !!