Single hex — uniaxial tension (Hooke's law) ============================================ The most elementary first-principles correctness check for any 3D continuum element: does a single hex under uniaxial tension produce the stress and strain a textbook predicts? For a unit cube of isotropic linear-elastic material with the ``x = 0`` face axially fixed and a uniform axial traction on the ``x = L`` face: .. math:: \sigma_{xx} = E \varepsilon_{xx}, \qquad \varepsilon_{yy} = \varepsilon_{zz} = -\nu \varepsilon_{xx}, \qquad \varepsilon_{xy} = \varepsilon_{yz} = \varepsilon_{xz} = 0. This problem is **exactly** what the element kernel and the constitutive law encode — if a single hex fails it, something is wrong at the material-law or strain-recovery layer, not at the numerical-convergence layer. Problem ------- .. list-table:: :header-rows: 1 :widths: 30 70 * - Parameter - Value * - Geometry - Unit cube, ``L × L × L`` with ``L = 1 m`` * - Element - Single ``HEX8`` (``SOLID185``) — one cell * - Young's modulus ``E`` - 200 GPa * - Poisson's ratio ``ν`` - 0.30 * - Axial load - 1 MN distributed on four corner nodes of the ``x = L`` face (→ uniform nominal stress σ\ :sub:`xx` = 1 MPa) * - BCs - ``UX = 0`` on every node of the ``x = 0`` face; single- node UY / UZ anchors on corners to remove rigid-body modes without over-constraining the transverse Poisson contraction Analytical reference -------------------- Hooke's law in 3D (Cook et al. §1.3; Hughes §2.7 — public-domain derivations): .. math:: \varepsilon_{xx} = \frac{\sigma_{xx}}{E} = \frac{1 \text{ MPa}}{200 \text{ GPa}} = 5.0 \times 10^{-6} \varepsilon_{yy} = \varepsilon_{zz} = -\nu \varepsilon_{xx} = -1.5 \times 10^{-6} \sigma_{xx} = 1.0 \times 10^{6} \text{ Pa}, \qquad \sigma_{yy} = \sigma_{zz} = \tau_{ij} = 0. No approximation; no convergence discussion. The HEX8 shape functions are linear in each Cartesian direction, so a single element can represent the uniform strain state *exactly*. femorph-solver result --------------------- Ran by :file:`tests/analytical/test_single_hex_uniaxial.py` using the Model's ``.strain(u)`` on-the-fly API (Agent 1's TA-9b contribution). With the strain-recovery path returning per-node Voigt strain in ``(xx, yy, zz, xy, yz, xz)`` order: .. list-table:: :header-rows: 1 :widths: 25 25 25 25 * - Component - Analytical - femorph-solver - Relative error * - ``ε_xx`` - ``5.000 × 10⁻⁶`` - ``5.000 × 10⁻⁶`` - < 10⁻⁸ * - ``ε_yy`` - ``-1.500 × 10⁻⁶`` - ``-1.500 × 10⁻⁶`` - < 10⁻⁸ * - ``ε_zz`` - ``-1.500 × 10⁻⁶`` - ``-1.500 × 10⁻⁶`` - < 10⁻⁸ * - ``ε_xy``, ``ε_yz``, ``ε_xz`` - 0 - < 10⁻¹⁰ - — Hooke's law holds to machine precision. The regression test sets ``rtol = 1 × 10⁻⁸`` for the diagonal components (tight enough to catch a material-law bug but loose enough for single-precision element-return-path rounding) and ``1 × 10⁻¹⁰`` absolute for the shear components. Cross-references ---------------- .. list-table:: :header-rows: 1 :widths: 35 30 35 * - Source - Reported ``ε_xx`` - Problem ID / location * - Closed form (Hooke's law) - ``5.00 × 10⁻⁶`` - Cook *CAFEA* §1.3 + Hughes *FEM* §2.7 * - NAFEMS *Background to Benchmarks* - ``5.00 × 10⁻⁶`` - BtB-2.1 (uniaxial tension test) * - femorph-solver - ``5.00 × 10⁻⁶`` - ``test_single_hex_uniaxial.py`` * - Abaqus Verification Manual - ``5.00 × 10⁻⁶`` - AVM 1.3.1 (uniaxial stress, C3D8) * - MAPDL Verification Manual - ``5.00 × 10⁻⁶`` - VM-1 (statically indeterminate reaction force analysis) Every source agrees to the precision at which the value is stated. This is the minimum bar an FE implementation has to clear — no solver that ships results differing from Hooke's law on a single element is worth trusting. Source ------ Backing regression test: :file:`tests/analytical/test_single_hex_uniaxial.py` — landed with Agent 2's TA-9b analytical suite (#150).