Irons patch test — constant-strain completeness ================================================ The Irons patch test is the *ur*-completeness check for any finite-element formulation: a patch of elements under a displacement field consistent with a uniform strain tensor must produce that exact strain, to machine precision, on every element. If a formulation fails the patch test it can't converge — not "converges slowly", not "inaccurate on coarse meshes" but **cannot reach the correct answer at any refinement**. The patch test is the shibboleth separating elements that work from elements that don't. Problem ------- Take a unit cube subdivided into a 2 × 2 × 2 patch of HEX8 elements. Apply a uniform affine displacement field on every boundary node: .. math:: \mathbf{u}(\mathbf{x}) = \mathbf{F}\,\mathbf{x} where :math:`\mathbf{F}` is a constant deformation gradient. Per the kinematic relation :math:`\varepsilon = \tfrac{1}{2}(\mathbf{F} + \mathbf{F}^T) - \mathbf{I}`, the interior strain field must be that constant tensor on every cell. Any node-to-node variation in the recovered strain — even at the 10⁻⁸ level — indicates the element formulation is not constant-strain-complete. Analytical reference -------------------- This is not a convergence test; it is an identity test. The expected outcome is exact: .. math:: \varepsilon_{ij}(\mathbf{x}) = \tfrac{1}{2}(F_{ij} + F_{ji}) - \delta_{ij}, \quad \forall \mathbf{x} \in \Omega on every cell, in every component. femorph-solver result --------------------- Ran by :file:`tests/analytical/test_patch_test.py` on a 2 × 2 × 2 HEX8 patch with a non-trivial constant strain tensor applied through the affine boundary condition. Per-cell strain matches the imposed :math:`\mathbf{F}`-derived tensor to machine precision — the regression test asserts ≤ 10⁻¹⁰ absolute error on every strain component of every cell. This confirms the SOLID185 kernel's B̄ formulation (Hughes §4.4) satisfies the Irons completeness criterion. Cross-references ---------------- .. list-table:: :header-rows: 1 :widths: 45 25 30 * - Source - Expected - Problem ID / location * - Irons–Razzaque 1972 (original) - Identity (exact) - *The Mathematical Foundations of the FEM*, pp. 557–587 * - Taylor–Beresford–Wilson 1976 - Identity (exact) - IJNME 10 (1976), pp. 1211–1219 * - Hughes *The Finite Element Method* - Identity (exact) - Dover (2000), §4.4.3 * - NAFEMS *Background to Benchmarks* - Identity (exact) - BtB-4.2 (patch-test completeness) * - femorph-solver - ≤ 10⁻¹⁰ abs - ``test_patch_test.py`` * - Abaqus Verification Manual - Identity (exact) - AVM 1.4.4 (C3D8 patch test) * - MAPDL Verification Manual - Identity (exact) - VM-82 (patch test) All public sources agree this is an identity test — there is no tolerance band to argue about. A formulation that doesn't pass at machine precision is broken. femorph-solver's HEX8 kernel clears the patch test; the ≤ 10⁻¹⁰ residual is pure floating-point arithmetic noise on the Gauss-integration path. Source ------ Backing regression test: :file:`tests/analytical/test_patch_test.py` — landed with Agent 2's TA-9b analytical suite (#150).