oracle: 2D cases (Kirsch plane stress, Lamé plane strain and axisymmetric, rotating disc and cylinder, NAFEMS LE1 with quad8) and J2 uniaxial explicit

The pending 2D LE1 case becomes a real one; the plasticity cases stay
pending with what they still need (static J2 for the collapse pressure,
the transcribed measurements for the Taylor bar).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-13 21:42:19 -04:00
1 parent 84e81acf3a
commit 96c9992c92
31 files changed
+686 -13

No files matched your search

+27 -4
View File
@@ -2,7 +2,7 @@
Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the policy is [verification.md](verification.md). Every case is our own model, built with ModelCraft commands from the problem's published description, and compared with the reference value its `expected.json` cites, within the stated tolerance and for the stated reason. Accepted results are frozen in each case's `fixture.json`: a later change that moves one beyond its band (10⁻⁹ of its size) fails CI even while the reference still passes. No reference value was produced with a commercial product.
**100 of 106 quantities pass** (6 known failure(s)) in 28 active cases: 20 theory, 8 published benchmark, 0 experiment; 10 pending cases wait for capabilities still being built.
**117 of 123 quantities pass** (6 known failure(s)) in 35 active cases: 26 theory, 9 published benchmark, 0 experiment; 9 pending cases wait for capabilities still being built.
## Theory: closed-form solutions, patch tests and mesh invariants
@@ -31,11 +31,22 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
| [free-beam-frequencies](../tests/oracle/free-beam-frequencies/) | sixth frequency (the last rigid-body mode) | 0 | 1.5486e-7 | 1.5e-7 | ± 8.1264e-5 | pass | matches |
| [free-beam-frequencies](../tests/oracle/free-beam-frequencies/) | first free–free bending frequency (mode 7) | 0.081264 | 0.080618 | -0.795% | 1.5% | pass | matches |
| [free-beam-frequencies](../tests/oracle/free-beam-frequencies/) | total mass | 20 | 20 | < 1e-10% | 1e-12 rel. | pass | matches |
| [j2-uniaxial-explicit](../tests/oracle/j2-uniaxial-explicit/) | axial Cauchy stress at a logarithmic strain of 0.2 | 643.56 | 643.57 | 0.000174% | 1% | pass | matches |
| [j2-uniaxial-explicit](../tests/oracle/j2-uniaxial-explicit/) | equivalent plastic strain | 0.19678 | 0.19678 | -0.00000113% | 1% | pass | matches |
| [kirsch-plate](../tests/oracle/kirsch-plate/) | σ_xx at the top of the hole (0, 1, 0) over the remote stress | 3 | 3.0121 | 0.402% | 2% | pass | matches |
| [kirsch-plate](../tests/oracle/kirsch-plate/) | σ_yy at the side of the hole (1, 0, 0) over the remote stress | -1 | -1.011 | -1.1% | 3% | pass | matches |
| [kirsch-plate-plane-stress](../tests/oracle/kirsch-plate-plane-stress/) | σ_xx at the top of the hole (0, 1) over the remote stress | 3 | 3.0029 | 0.096% | 2% | pass | matches |
| [kirsch-plate-plane-stress](../tests/oracle/kirsch-plate-plane-stress/) | σ_yy at the side of the hole (1, 0) over the remote stress | -1 | -1.0019 | -0.187% | 3% | pass | matches |
| [lame-cylinder](../tests/oracle/lame-cylinder/) | radial displacement at the bore (10, 0, 0) | 0.0090794 | 0.0090793 | -0.000267% | 0.1% | pass | matches |
| [lame-cylinder](../tests/oracle/lame-cylinder/) | radial displacement outside (20, 0, 0) | 0.0057778 | 0.0057778 | -0.000301% | 0.1% | pass | matches |
| [lame-cylinder](../tests/oracle/lame-cylinder/) | hoop stress σ_θ = σ_yy at the bore (10, 0, 0) | 166.67 | 166.36 | -0.183% | 1% | pass | matches |
| [lame-cylinder-axisymmetric](../tests/oracle/lame-cylinder-axisymmetric/) | radial displacement at the bore (r = 10) | 0.0090794 | 0.0090793 | -0.000416% | 0.1% | pass | matches |
| [lame-cylinder-axisymmetric](../tests/oracle/lame-cylinder-axisymmetric/) | radial displacement outside (r = 20) | 0.0057778 | 0.0057778 | -0.000327% | 0.1% | pass | matches |
| [lame-cylinder-axisymmetric](../tests/oracle/lame-cylinder-axisymmetric/) | hoop stress σ_θ at the bore (stress component 3 of an axisymmetric element) | 166.67 | 165.98 | -0.412% | 1% | pass | matches |
| [lame-cylinder-axisymmetric](../tests/oracle/lame-cylinder-axisymmetric/) | axial stress σ_z = 2νA at the bore (held ends) | 20 | 20.084 | 0.42% | 1% | pass | matches |
| [lame-cylinder-plane-strain](../tests/oracle/lame-cylinder-plane-strain/) | radial displacement at the bore (10, 0) | 0.0090794 | 0.0090793 | -0.000267% | 0.1% | pass | matches |
| [lame-cylinder-plane-strain](../tests/oracle/lame-cylinder-plane-strain/) | hoop stress σ_θ = σ_yy at the bore (10, 0) | 166.67 | 166.36 | -0.183% | 1% | pass | matches |
| [lame-cylinder-plane-strain](../tests/oracle/lame-cylinder-plane-strain/) | axial stress σ_zz = 2νA at the bore (plane strain) | 20 | 20.083 | 0.415% | 1% | pass | matches |
| [patch-hex20](../tests/oracle/patch-hex20/) | u_x at the corner (1, 1, 1) | -2.5000e-4 | -2.5000e-4 | < 1e-10% | 1e-9 rel. | pass | matches |
| [patch-hex20](../tests/oracle/patch-hex20/) | u_y at the corner (1, 1, 1) | 0.001 | 0.001 | < 1e-10% | 1e-9 rel. | pass | matches |
| [patch-hex20](../tests/oracle/patch-hex20/) | u_z at the corner (1, 1, 1) | 0.00225 | 0.00225 | < 1e-10% | 1e-9 rel. | pass | matches |
@@ -87,6 +98,11 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
| [patch-wedge6](../tests/oracle/patch-wedge6/) | σ_xy at the inner node | 0 | -8.3791e-17 | < 1e-12 | ± 1.0000e-9 | pass | matches |
| [pure-bending-coupling](../tests/oracle/pure-bending-coupling/) | bending stress σ_xx at mid-span, top fibre (10, 0.5, 1) | 15 | 15 | -0.0000103% | 0.5% | pass | matches |
| [pure-bending-coupling](../tests/oracle/pure-bending-coupling/) | rotation of the reference point about y | 0.3 | 0.30355 | 1.18% | 1% | known failure: 1.2% high: the distributing coupling weights every node of the end face equally, corner and mid-side nodes of hex20 alike, which is not the consistent linear traction; the end face deforms locally and the fitted rotation includes it. Area-consistent weights would remove it | — |
| [rotating-cylinder-axisymmetric](../tests/oracle/rotating-cylinder-axisymmetric/) | radial stress σ_r on the axis (r = 0) | 0.38571 | 0.38608 | 0.0958% | 1% | pass | matches |
| [rotating-cylinder-axisymmetric](../tests/oracle/rotating-cylinder-axisymmetric/) | hoop stress σ_θ at the surface (r = 1) | 0.12857 | 0.12873 | 0.123% | 1% | pass | matches |
| [rotating-disc-plane-stress](../tests/oracle/rotating-disc-plane-stress/) | hoop stress σ_θ = σ_yy at the bore (20, 0) | 65.312 | 65.188 | -0.19% | 1% | pass | matches |
| [rotating-disc-plane-stress](../tests/oracle/rotating-disc-plane-stress/) | radial stress σ_r = σ_xx at r = √(ab), its maximum | 20.724 | 20.683 | -0.2% | 1% | pass | matches |
| [rotating-disc-plane-stress](../tests/oracle/rotating-disc-plane-stress/) | hoop stress σ_θ = σ_yy at the rim (100, 0) | 16.328 | 16.352 | 0.149% | 1% | pass | matches |
| [tube-torsion-coupling](../tests/oracle/tube-torsion-coupling/) | rotation of the reference point about z | 0.056071 | 0.056071 | 0.000619% | 0.5% | pass | matches |
| [tube-torsion-coupling](../tests/oracle/tube-torsion-coupling/) | surface shear stress τ_θz = σ_yz at (10, 0, 20) | 1078.3 | 1081.4 | 0.288% | 1% | pass | matches |
@@ -117,6 +133,7 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
| [nafems-fv32](../tests/oracle/nafems-fv32/) | frequency of mode 5 (Hz) | 379.9 | 379.9 | 0.000182% | 1% | pass | matches |
| [nafems-fv32](../tests/oracle/nafems-fv32/) | frequency of mode 6 (Hz) | 391.44 | 391.44 | -0.0012% | 1% | pass | matches |
| [nafems-le1](../tests/oracle/nafems-le1/) | σ_yy at D (2, 0) | 92.7 | 92.869 | 0.182% | 1% | pass | matches |
| [nafems-le1-plane-stress](../tests/oracle/nafems-le1-plane-stress/) | σ_yy at D (2, 0) | 92.7 | 92.648 | -0.0559% | 1% | pass | matches |
| [nafems-le10](../tests/oracle/nafems-le10/) | σ_yy at D (2, 0, 0.3) on the loaded face | -5.38 | -5.3339 | 0.857% | 2% | pass | matches |
| [scordelis-lo-roof-solid](../tests/oracle/scordelis-lo-roof-solid/) | vertical displacement at the midpoint of the free edge, mid-surface | -0.3024 | -0.3014 | 0.33% | 2% | pass | matches |
@@ -131,14 +148,19 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
- **[cdt-cylinder](../tests/oracle/cdt-cylinder/)** (theory): Constrained Delaunay mesh of a cylinder: volume within the chordal bound, valid elements. Source: mesh invariants: an inscribed polygon of sagitta s loses at most 2s/R of a circle's area (elementary geometry); constrained Delaunay tetrahedralization after Diazzi et al., ACM TOG 42(6) 2023. Tolerances — volume: the tessellation inscribes the cylinder within the chordal tolerance s = 0.05: the polygon section loses between 0 and 2s/R = 0.5% of the area; the reference is the middle of that band; invalid: every element of a valid mesh has positive volume
- **[cdt-stepped-block](../tests/oracle/cdt-stepped-block/)** (theory): Constrained Delaunay mesh of a stepped block: exact volume, valid elements. Source: mesh invariants: a tetrahedralization of a polyhedron fills its volume exactly (Si, TetGen paper ACM TOMS 41(2) 2015 for the definition of a CDT; Diazzi et al., ACM TOG 42(6) 2023); the volume is 60·40·10 + 40·40·10 + 20·40·10 − 10·10·10. Tolerances — volume: a planar boundary is tessellated exactly and the constrained Delaunay mesh fills it exactly: only rounding; invalid: every element of a valid mesh has positive volume; undetermined: a linear tetrahedron's sign is exact
- **[free-beam-frequencies](../tests/oracle/free-beam-frequencies/)** (theory): Natural frequencies of a free beam: rigid-body modes and the first bending mode. Source: Euler–Bernoulli free–free beam, β₁L = 4.7300; Timoshenko, Young and Weaver, Vibration Problems in Engineering, 4th ed., Wiley 1974, §5.3. Tolerances — rigid_6: a free body has six zero frequencies; numerical rigid-body frequencies below 10⁻³ of the first elastic one (eigenvalues below 10⁻⁶ of it) are rounding of the shifted solve; f7: Euler–Bernoulli neglects shear and rotary inertia, about 0.8% at L/h = 20 for the free–free mode; mass: the mass matrix integrates the density exactly
- **[j2-uniaxial-explicit](../tests/oracle/j2-uniaxial-explicit/)** (theory): Uniaxial tension of a J2 bilinear-hardening cube to large strain (explicit). Source: von Mises plasticity with linear isotropic hardening under uniaxial stress (Simo and Hughes, Computational Inelasticity, Springer 1998, §2.3); logarithmic strain for a hypoelastic–plastic law under coaxial stretching. Tolerances — sigma: uniaxial J2 with linear hardening: σ = σ_y + E_t (ε − σ_y/E) in logarithmic strain; the stretch takes 10⁴ wave transits, so inertia and the ringing of the start (ρcv ≈ 0.1% of σ) stay well under 1%; plastic_strain: ε_p = ε − σ/E, as for the stress
- **[kirsch-plate](../tests/oracle/kirsch-plate/)** (theory): Plate with a circular hole in tension (Kirsch). Source: Kirsch, Zeitschrift des VDI 42 (1898) 797–807; Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §35. Tolerances — kt: the reference is the infinite plate; the finite plate (W = 60a, Heywood's width correction about +0.1%, and the loaded ends 30a away) raises the peak by a few tenths of a percent, and the stress extrapolated to the hole surface adds up to about 1%; side: infinite-plate value −S; finite width and extrapolation as for Kt, on a smaller value
- **[kirsch-plate-plane-stress](../tests/oracle/kirsch-plate-plane-stress/)** (theory): Plate with a circular hole in tension, 2D plane stress (Kirsch). Source: Kirsch, Zeitschrift des VDI 42 (1898) 797–807; Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §35. Tolerances — kt: the reference is the infinite plate; the finite plate (W = 60a, loaded ends 30a away) raises the peak by a few tenths of a percent, and the stress extrapolated to the hole surface adds up to about 1%; side: infinite-plate value −S; finite width and extrapolation as for Kt, on a smaller value
- **[lame-cylinder](../tests/oracle/lame-cylinder/)** (theory): Thick-walled cylinder under internal pressure, plane strain (Lamé). Source: Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28 (thick-walled cylinder). Tolerances — ur_a: quadratic elements on 8 radial divisions resolve u_r = A r + B/r to well under 0.1%; ur_b: as for the bore; hoop_a: stress extrapolated from the integration points to the bore surface and averaged over two elements: about 0.5% at the steepest gradient
- **[lame-cylinder-axisymmetric](../tests/oracle/lame-cylinder-axisymmetric/)** (theory): Thick-walled cylinder under internal pressure, axisymmetric (Lamé). Source: Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28. Tolerances — ur_a: quadratic elements on 8 radial divisions resolve u_r = A r + B/r to well under 0.1%; ur_b: as at the bore; hoop_a: stress extrapolated to the bore surface: about 0.5%; axial: as for the hoop stress
- **[lame-cylinder-plane-strain](../tests/oracle/lame-cylinder-plane-strain/)** (theory): Thick-walled cylinder under internal pressure, 2D plane strain (Lamé). Source: Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28. Tolerances — ur_a: quadratic elements on 8 radial divisions resolve u_r = A r + B/r to well under 0.1%; hoop_a: stress extrapolated to the bore surface and averaged over two elements: about 0.5%; szz: σ_zz = ν(σ_r + σ_θ) follows the in-plane stresses, extrapolated as they are
- **[mh-curved-cantilever](../tests/oracle/mh-curved-cantilever/)** (benchmark): MacNeal–Harder curved cantilever, hex8 with incompatible modes. Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 5 (p. 7) geometry, material and mesh; Table 3 (p. 10) theoretical tip displacements. Tolerances — in_plane: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); out_of_plane: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)
- **[mh-solid-patch](../tests/oracle/mh-solid-patch/)** (benchmark): MacNeal–Harder patch test for solids (hex8 with incompatible modes). Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 3 (p. 6) geometry and inner node locations, Table 2(c) (p. 10) boundary displacements and theoretical solution. Tolerances — sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; txy: a patch test is passed exactly: the tolerance only admits rounding; txz: a patch test is passed exactly: the tolerance only admits rounding; tyz: a patch test is passed exactly: the tolerance only admits rounding; u7: a patch test is passed exactly: the tolerance only admits rounding
- **[mh-straight-cantilever](../tests/oracle/mh-straight-cantilever/)** (benchmark): MacNeal–Harder straight cantilever, regular hex8 mesh with incompatible modes. Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 4(a) (p. 7) geometry, material and mesh; Table 3 (p. 10) theoretical tip displacements. Tolerances — extension: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); in_plane: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); out_of_plane: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); twist: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); the moment reaches the end through a distributing coupling
- **[mh-thick-cylinder](../tests/oracle/mh-thick-cylinder/)** (benchmark): MacNeal–Harder thick-walled cylinder, nearly incompressible (hex8 with incompatible modes). Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 10 (p. 9) geometry, material and radial mesh; Table 5(c) (p. 11) radial displacements at the inner radius. Tolerances — ur_1: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); ur_2: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); ur_3: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)
- **[nafems-fv32](../tests/oracle/nafems-fv32/)** (benchmark): NAFEMS FV32 cantilevered tapered membrane, free vibration (hex20 plane stress layer). Source: NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test FV32 (frequencies 44.623, 130.03, 162.70, 246.05, 379.90, 391.44 Hz); as reproduced in the Abaqus 2017 Benchmarks Guide, 'FV32: Cantilevered tapered membrane'. Tolerances — f1: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%; f2: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%; f3: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%; f4: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%; f5: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%; f6: targets published to five figures for 2D plane stress; a thin solid layer with a free face differs from plane stress by O((t/L)²) and the 16 × 8 quadratic mesh is converged to about 0.1%
- **[nafems-le1](../tests/oracle/nafems-le1/)** (benchmark): NAFEMS LE1 elliptic membrane (hex20 plane stress layer). Source: NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE1 (target σ_yy = 92.7 MPa at D); as reproduced in the Abaqus 2017 Benchmarks Guide, 'LE1: Plane stress elements—elliptic membrane'. Tolerances — syy_D: the target is published to three figures; plane stress modelled by a thin solid layer and the stress extrapolated to the edge add a few tenths of a percent
- **[nafems-le1-plane-stress](../tests/oracle/nafems-le1-plane-stress/)** (benchmark): NAFEMS LE1 elliptic membrane with 2D plane stress elements (quad8). Source: NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE1 (target σ_yy = 92.7 MPa at D); as reproduced in the Abaqus 2017 Benchmarks Guide, 'LE1: Plane stress elements—elliptic membrane'. Tolerances — syy_D: the target is published to three figures; the stress extrapolated to the edge on a converged mesh adds a few tenths of a percent
- **[nafems-le10](../tests/oracle/nafems-le10/)** (benchmark): NAFEMS LE10 thick plate under pressure (hex20). Source: NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE10 (target σ_yy = −5.38 MPa at D); as reproduced in the Abaqus 2017 Benchmarks Guide, 'LE10: Thick plate under pressure'. Tolerances — syy_D: the target is published to three figures; at D the stress is extrapolated to a corner where the hole edge meets the loaded face, and published converged solutions scatter by 1–2% (Abaqus Benchmarks Guide fine meshes: −5.51 to −5.89)
- **[patch-hex20](../tests/oracle/patch-hex20/)** (theory): Constant-stress patch test, hex20. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[patch-hex20-reduced](../tests/oracle/patch-hex20-reduced/)** (theory): Constant-stress patch test, hex20-reduced. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
@@ -148,6 +170,8 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
- **[patch-tet4](../tests/oracle/patch-tet4/)** (theory): Constant-stress patch test, tet4. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[patch-wedge6](../tests/oracle/patch-wedge6/)** (theory): Constant-stress patch test, wedge6. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[pure-bending-coupling](../tests/oracle/pure-bending-coupling/)** (theory): Pure bending through a distributing coupling. Source: Euler–Bernoulli pure bending, σ = M_y z/I, θ = ML/(EI) (exact in elasticity for ν = 0); Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §102. Tolerances — sigma_top: with ν = 0 pure bending is a quadratic displacement field that hex20 represents exactly; the coupling's nodal force pattern differs from the linear traction only within a depth or two of the end (Saint-Venant), five depths from the probe; rotation: the reference point follows the best-fit rigid motion of the end section, which the end zone's local deformation disturbs by well under 1%
- **[rotating-cylinder-axisymmetric](../tests/oracle/rotating-cylinder-axisymmetric/)** (theory): Long rotating solid cylinder, axisymmetric. Source: Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (long rotating cylinder, ε_z = 0). Tolerances — radial_axis: stress extrapolated to the axis, where σ_r = σ_θ: under 1% with sixteen quadratic elements across; hoop_rim: stress extrapolated to the surface: under 1%
- **[rotating-disc-plane-stress](../tests/oracle/rotating-disc-plane-stress/)** (theory): Rotating disc with a central hole, plane stress. Source: Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (rotating disc of uniform thickness with a hole). Tolerances — hoop_bore: stress extrapolated to the bore surface, where the a²b²/r² term is steepest: 16 radial quadratic elements graded towards the bore leave about 0.2% (8 uniform: −2.4%; 32 graded: −0.05%); radial_max: the nearest node to √(ab) is within half an element of it, where σ_r is stationary (an error of order (h/r)², under 0.5%), and nodal averaging adds a few tenths of a percent; hoop_rim: as at the bore
- **[scordelis-lo-roof-solid](../tests/oracle/scordelis-lo-roof-solid/)** (benchmark): Scordelis–Lo roof with one layer of hex20 reduced-integration solids. Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 8 (p. 8) geometry, material and load; Table 5(a) (p. 11) reference displacement 0.3024; Belytschko et al., Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (shell obstacle course). Tolerances — uz: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); MacNeal and Harder normalise by 0.3024 (the deep-shell value quoted in their [5] is 0.3086), and a solid model of R/t = 100 differs from shell theory by O(t/R)
- **[tube-torsion-coupling](../tests/oracle/tube-torsion-coupling/)** (theory): Torsion of a tube through a kinematically coupled reference point. Source: Saint-Venant torsion of a circular tube, φ = TL/(GJ), τ = Tr/J with J = π(b⁴ − a⁴)/2; Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §104. Tolerances — twist: Saint-Venant torsion of a circular tube is exact in elasticity; the rigid end coupling only stiffens a short zone near the tip; quadratic elements with 16 divisions around are within 0.1%; shear: stress extrapolated to the outer surface and averaged where two blocks meet: about 0.3% with four radial quadratic elements (two gave 1.1%)
@@ -160,10 +184,9 @@ Reference values already cited; each case gets its recipe when the capability it
| [cylinder-channel-2d1](../tests/oracle/cylinder-channel-2d1/) | benchmark | Flow around a cylinder, steady 2D-1 (Re = 20) | lattice Boltzmann CFD (M12) | drag coefficient (published interval 5.57–5.59) = 5.58; lift coefficient (interval 0.0104–0.0110) = 0.0107 | Schäfer and Turek, 'Benchmark computations of laminar flow around a cylinder', Notes on Numerical Fluid Mechanics 52 (1996) 547–566, Table 4 (reference intervals) |
| [lid-driven-cavity-re100](../tests/oracle/lid-driven-cavity-re100/) | benchmark | Lid-driven cavity, Re = 100 | lattice Boltzmann CFD (M12) | u/U at y = 0.4531 on the vertical centreline = -0.2109 | Ghia, Ghia and Shin, Journal of Computational Physics 48 (1982) 387–411, Table I (u along the vertical centreline) |
| [mh-twisted-beam](../tests/oracle/mh-twisted-beam/) | benchmark | MacNeal–Harder twisted beam | shell elements (M8) or mapped blocks with helical edges | tip displacement along the in-plane load = 0.005424; tip displacement along the out-of-plane load = 0.001754 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 6 (p. 8), Table 3 (p. 10) |
| [nafems-le1-plane-stress](../tests/oracle/nafems-le1-plane-stress/) | benchmark | NAFEMS LE1 elliptic membrane with 2D plane stress elements | 2D plane stress elements (docs/elements.md) | σ_yy at D (2, 0) = 92.7 | NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE1 |
| [nafems-le11](../tests/oracle/nafems-le11/) | benchmark | NAFEMS LE11 solid cylinder/taper/sphere under a temperature field | thermal loads (M8 heat transfer) | σ_zz at A = -105 | NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE11 (target σ_zz = −105 MPa at A) |
| [pinched-cylinder](../tests/oracle/pinched-cylinder/) | benchmark | Pinched cylinder with rigid diaphragms | shell elements (M8) | radial displacement under the load = -1.8248e-5 | Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course); reference 1.8248 × 10⁻⁵ under the load |
| [pinched-hemisphere](../tests/oracle/pinched-hemisphere/) | benchmark | Hemispherical shell with an 18° hole under alternating point loads | shell elements (M8), or mapped blocks that follow doubly curved faces | displacement under the load along the load = 0.094 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 9 (p. 9), Table 5(b) (p. 11): 0.0940 (lower bound 0.0924 from their [7]) |
| [plastic-thick-cylinder](../tests/oracle/plastic-thick-cylinder/) | theory | Elastic–perfectly plastic thick cylinder: collapse pressure | J2 plasticity (M8/M10 X2) | collapse pressure for a = 10, b = 20, σ_y = 250 = 200.09 | Hill, The Mathematical Theory of Plasticity, Oxford 1950, ch. V §2: plane strain von Mises collapse pressure p = (2/√3)σ_y ln(b/a) |
| [plastic-thick-cylinder](../tests/oracle/plastic-thick-cylinder/) | theory | Elastic–perfectly plastic thick cylinder: collapse pressure | implicit (static) J2 plasticity: explicit J2 is in, a collapse load needs the static solver | collapse pressure for a = 10, b = 20, σ_y = 250 = 200.09 | Hill, The Mathematical Theory of Plasticity, Oxford 1950, ch. V §2: plane strain von Mises collapse pressure p = (2/√3)σ_y ln(b/a) |
| [scordelis-lo-roof-shell](../tests/oracle/scordelis-lo-roof-shell/) | benchmark | Scordelis–Lo roof with shell elements | shell elements (MITC4, M8) | vertical displacement at the midpoint of the free edge = -0.3024 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 8 (p. 8), Table 5(a) (p. 11); Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course) |
| [taylor-bar](../tests/oracle/taylor-bar/) | experiment | Taylor bar impact (copper) | large-deformation plasticity and contact (M10 X2/X3) | final over initial length = to be transcribed | Wilkins and Guinan, 'Impact of cylinders on a rigid boundary', Journal of Applied Physics 44 (1973) 1200–1206 (final length and mushroom diameter vs impact speed) |
| [taylor-bar](../tests/oracle/taylor-bar/) | experiment | Taylor bar impact (copper) | the measured final shapes, to be transcribed from the paper (explicit Johnson–Cook plasticity is in) | final over initial length = to be transcribed | Wilkins and Guinan, 'Impact of cylinders on a rigid boundary', Journal of Applied Physics 44 (1973) 1200–1206 (final length and mushroom diameter vs impact speed) |
@@ -0,0 +1,6 @@
# Uniaxial tension of a J2 bilinear-hardening cube to large strain (explicit)
A unit cube of one hex8 (one-point, hourglass control), steel-like (E = 200000, ν = 0.3,
σ_y = 250, H = 2000, ρ = 7.8e-9), held by symmetry on three faces and stretched on the fourth to
λ = e^0.2 over 0.01 s (quasi-static), lateral faces free: uniaxial stress at a logarithmic
strain of 0.2.
@@ -0,0 +1,45 @@
{
"title": "Uniaxial tension of a J2 bilinear-hardening cube to large strain (explicit)",
"kind": "theory",
"source": "von Mises plasticity with linear isotropic hardening under uniaxial stress (Simo and Hughes, Computational Inelasticity, Springer 1998, §2.3); logarithmic strain for a hypoelastic–plastic law under coaxial stretching",
"quantities": [
{
"id": "sigma",
"quantity": "axial Cauchy stress at a logarithmic strain of 0.2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pull",
"elements": [
1
]
},
"pointer": "/elements/0/stress/0"
},
"value": 643.5643564356436,
"tolerance": {
"relative": 0.01
},
"reason": "uniaxial J2 with linear hardening: σ = σ_y + E_t (ε − σ_y/E) in logarithmic strain; the stretch takes 10⁴ wave transits, so inertia and the ringing of the start (ρcv ≈ 0.1% of σ) stay well under 1%"
},
{
"id": "plastic_strain",
"quantity": "equivalent plastic strain",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pull",
"elements": [
1
]
},
"pointer": "/elements/0/plastic_strain"
},
"value": 0.1967821782178218,
"tolerance": {
"relative": 0.01
},
"reason": "ε_p = ε − σ/E, as for the stress"
}
]
}
@@ -0,0 +1,13 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"plastic_strain": {
"band": 1.967821782178218e-10,
"value": 0.1967821759864614
},
"sigma": {
"band": 6.435654787724778e-7,
"value": 643.5654787724778
}
}
}
@@ -0,0 +1,16 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0", "4": "x1"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Cube"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Cube", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 200000.0, "poisson": 0.3}, "density": 7.8e-09, "plastic": {"type": "bilinear", "yield_stress": 250.0, "hardening_modulus": 2000.0}}},
{"command": "model.section.create", "params": {"name": "cube", "set": "all", "material": "Steel", "kind": {"type": "solid"}, "formulation": {"integration": "reduced"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sz", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "pull", "type": "displacement", "target": {"set": "x1"}, "values": [0.22140275816016985, null, null, null, null, null]}},
{"command": "model.step.create", "params": {"name": "Pull", "procedure": {"type": "explicit_dynamic", "end_time": 0.01}, "boundary_conditions": ["sx", "sy", "sz", "pull"], "loads": []}},
{"command": "solve.explicit", "params": {"step": "Pull"}, "id": "solve"}
]
@@ -0,0 +1,5 @@
# Plate with a circular hole in tension, 2D plane stress (Kirsch)
The plate of `kirsch-plate` as a 2D plane stress model: a quarter of half-width 30 with a hole of
radius 1, two quad8 patches around the hole (40 × 16 each, graded 40 : 1 towards it, mid-side
nodes on the arc), symmetry on x = 0 and y = 0, a traction of 1 on x = 30.
@@ -0,0 +1,53 @@
{
"title": "Plate with a circular hole in tension, 2D plane stress (Kirsch)",
"kind": "theory",
"source": "Kirsch, Zeitschrift des VDI 42 (1898) 797–807; Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §35",
"quantities": [
{
"id": "kt",
"quantity": "σ_xx at the top of the hole (0, 1) over the remote stress",
"measure": {
"command": "solve.probe",
"params": {
"step": "Tension",
"at": [
[
0,
1.0,
0
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 3.0,
"tolerance": {
"relative": 0.02
},
"reason": "the reference is the infinite plate; the finite plate (W = 60a, loaded ends 30a away) raises the peak by a few tenths of a percent, and the stress extrapolated to the hole surface adds up to about 1%"
},
{
"id": "side",
"quantity": "σ_yy at the side of the hole (1, 0) over the remote stress",
"measure": {
"command": "solve.probe",
"params": {
"step": "Tension",
"at": [
[
1.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": -1.0,
"tolerance": {
"relative": 0.03
},
"reason": "infinite-plate value −S; finite width and extrapolation as for Kt, on a smaller value"
}
]
}
@@ -0,0 +1,13 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"kt": {
"band": 3.0028789592374985e-9,
"value": 3.0028789592374983
},
"side": {
"band": 1.0018737796236792e-9,
"value": -1.0018737796236792
}
}
}
@@ -0,0 +1,15 @@
[
{"command": "mesh.block", "params": {"body": "Plate", "kind": "quad8", "corners": [[1.0, 0, 0], [30.0, 0, 0], [30.0, 30.0, 0], [0.7071067811865476, 0.7071067811865476, 0]], "divisions": [40, 16], "bias": [40, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [1, 2], "name": "y0"}, {"corners": [2, 3], "name": "load"}]}},
{"command": "mesh.block", "params": {"body": "Plate", "kind": "quad8", "corners": [[0.7071067811865476, 0.7071067811865476, 0], [30.0, 30.0, 0], [0, 30.0, 0], [0, 1.0, 0]], "divisions": [40, 16], "bias": [40, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [3, 4], "name": "x0"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Plate", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Plate", "edge": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Plate", "edge": "y0"}]}},
{"command": "model.set.create", "params": {"name": "load", "geometry": [{"body": "Plate", "edge": "load"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "plate", "set": "all", "material": "Mat", "kind": {"type": "plane_stress", "thickness": 0.1}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "S", "type": "traction", "set": "load", "vector": [1, 0, 0]}},
{"command": "model.step.create", "params": {"name": "Tension", "procedure": {"type": "static"}, "boundary_conditions": ["sx", "sy"], "loads": ["S"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,5 @@
# Thick-walled cylinder under internal pressure, axisymmetric (Lamé)
The same cylinder as an axisymmetric slice r ∈ [10, 20], 0 ≤ y ≤ 1 (y is the axis), held axially
on both faces so ε_z = 0 (the plane strain state of a long cylinder); one quad8 patch of 8 × 1
elements.
@@ -0,0 +1,99 @@
{
"title": "Thick-walled cylinder under internal pressure, axisymmetric (Lamé)",
"kind": "theory",
"source": "Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28",
"quantities": [
{
"id": "ur_a",
"quantity": "radial displacement at the bore (r = 10)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.00907936507936508,
"tolerance": {
"relative": 0.001
},
"reason": "quadratic elements on 8 radial divisions resolve u_r = A r + B/r to well under 0.1%"
},
{
"id": "ur_b",
"quantity": "radial displacement outside (r = 20)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
20.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.005777777777777778,
"tolerance": {
"relative": 0.001
},
"reason": "as at the bore"
},
{
"id": "hoop_a",
"quantity": "hoop stress σ_θ at the bore (stress component 3 of an axisymmetric element)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 166.66666666666666,
"tolerance": {
"relative": 0.01
},
"reason": "stress extrapolated to the bore surface: about 0.5%"
},
{
"id": "axial",
"quantity": "axial stress σ_z = 2νA at the bore (held ends)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 20.0,
"tolerance": {
"relative": 0.01
},
"reason": "as for the hoop stress"
}
]
}
@@ -0,0 +1,21 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"axial": {
"band": 2.0083926981151736e-8,
"value": 20.083926981151734
},
"hoop_a": {
"band": 1.6666666666666668e-7,
"value": 165.98051836613928
},
"ur_a": {
"band": 9.07936507936508e-12,
"value": 0.009079327300818625
},
"ur_b": {
"band": 5.777777777777779e-12,
"value": 0.005777758888504408
}
}
}
@@ -0,0 +1,12 @@
[
{"command": "mesh.block", "params": {"body": "Pipe", "kind": "quad8", "corners": [[10.0, 0, 0], [20.0, 0, 0], [20.0, 1, 0], [10.0, 1, 0]], "divisions": [8, 1], "bias": [1, 1], "edges": [{"corners": [1, 4], "name": "bore"}, {"corners": [1, 2], "name": "bottom"}, {"corners": [3, 4], "name": "top"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Pipe", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "bore", "geometry": [{"body": "Pipe", "edge": "bore"}]}},
{"command": "model.set.create", "params": {"name": "ends", "geometry": [{"body": "Pipe", "edge": "bottom"}, {"body": "Pipe", "edge": "top"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 210000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "pipe", "set": "all", "material": "Steel", "kind": {"type": "axisymmetric"}}},
{"command": "model.boundary_condition.create", "params": {"name": "ends", "type": "symmetry", "target": {"set": "ends"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "bore", "magnitude": 100.0}},
{"command": "model.step.create", "params": {"name": "Pressure", "procedure": {"type": "static"}, "boundary_conditions": ["ends"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,5 @@
# Thick-walled cylinder under internal pressure, 2D plane strain (Lamé)
The cylinder of `lame-cylinder` (a = 10, b = 20, p = 100, E = 210000, ν = 0.3) as a 2D plane
strain quarter: one quad8 patch (8 × 16) with mid-side nodes on the arcs, symmetry on x = 0 and
y = 0.
@@ -0,0 +1,76 @@
{
"title": "Thick-walled cylinder under internal pressure, 2D plane strain (Lamé)",
"kind": "theory",
"source": "Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28",
"quantities": [
{
"id": "ur_a",
"quantity": "radial displacement at the bore (10, 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.00907936507936508,
"tolerance": {
"relative": 0.001
},
"reason": "quadratic elements on 8 radial divisions resolve u_r = A r + B/r to well under 0.1%"
},
{
"id": "hoop_a",
"quantity": "hoop stress σ_θ = σ_yy at the bore (10, 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 166.66666666666666,
"tolerance": {
"relative": 0.01
},
"reason": "stress extrapolated to the bore surface and averaged over two elements: about 0.5%"
},
{
"id": "szz",
"quantity": "axial stress σ_zz = 2νA at the bore (plane strain)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 20.0,
"tolerance": {
"relative": 0.01
},
"reason": "σ_zz = ν(σ_r + σ_θ) follows the in-plane stresses, extrapolated as they are"
}
]
}
@@ -0,0 +1,17 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"hoop_a": {
"band": 1.6666666666666668e-7,
"value": 166.36121907829184
},
"szz": {
"band": 2.0083065355856494e-8,
"value": 20.083065355856494
},
"ur_a": {
"band": 9.07936507936508e-12,
"value": 0.009079340794556473
}
}
}
@@ -0,0 +1,14 @@
[
{"command": "mesh.block", "params": {"body": "Pipe", "kind": "quad8", "corners": [[10.0, 0, 0], [20.0, 0, 0], [0, 20.0, 0], [0, 10.0, 0]], "divisions": [8, 16], "edges": [{"corners": [2, 3], "arc": {"center": [0, 0, 0]}}, {"corners": [1, 4], "arc": {"center": [0, 0, 0]}, "name": "bore"}, {"corners": [1, 2], "name": "y0"}, {"corners": [3, 4], "name": "x0"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Pipe", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "bore", "geometry": [{"body": "Pipe", "edge": "bore"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Pipe", "edge": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Pipe", "edge": "y0"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 210000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "pipe", "set": "all", "material": "Steel", "kind": {"type": "plane_strain", "thickness": 1.0}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "bore", "magnitude": 100.0}},
{"command": "model.step.create", "params": {"name": "Pressure", "procedure": {"type": "static"}, "boundary_conditions": ["sx", "sy"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -1,3 +1,4 @@
# NAFEMS LE1 elliptic membrane with 2D plane stress elements
# NAFEMS LE1 elliptic membrane with 2D plane stress elements (quad8)
The membrane of `nafems-le1` meshed with plane stress quadrilaterals.
The membrane of `nafems-le1` with plane stress quad8 elements (thickness 0.1): one patch between the
two ellipses, 24 × 48 elements graded 4 : 1 towards the hole, mid-side nodes on the ellipses.
@@ -1,14 +1,30 @@
{
"title": "NAFEMS LE1 elliptic membrane with 2D plane stress elements",
"title": "NAFEMS LE1 elliptic membrane with 2D plane stress elements (quad8)",
"kind": "benchmark",
"source": "NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE1",
"status": "pending",
"requires": "2D plane stress elements (docs/elements.md)",
"source": "NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE1 (target σ_yy = 92.7 MPa at D); as reproduced in the Abaqus 2017 Benchmarks Guide, 'LE1: Plane stress elements—elliptic membrane'",
"quantities": [
{
"id": "syy_D",
"quantity": "σ_yy at D (2, 0)",
"value": 92.7
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
2,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 92.7,
"tolerance": {
"relative": 0.01
},
"reason": "the target is published to three figures; the stress extrapolated to the edge on a converged mesh adds a few tenths of a percent"
}
]
}
@@ -0,0 +1,9 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"syy_D": {
"band": 9.27e-8,
"value": 92.64813637353794
}
}
}
@@ -0,0 +1,14 @@
[
{"command": "mesh.block", "params": {"body": "Membrane", "kind": "quad8", "corners": [[2, 0, 0], [3.25, 0, 0], [0, 2.75, 0], [0, 1, 0]], "divisions": [24, 48], "bias": [4, 1], "edges": [{"corners": [1, 4], "ellipse": {"center": [0, 0, 0], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [2, 3], "ellipse": {"center": [0, 0, 0], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}, "name": "BC"}, {"corners": [1, 2], "name": "CD"}, {"corners": [3, 4], "name": "AB"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Membrane", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "AB", "geometry": [{"body": "Membrane", "edge": "AB"}]}},
{"command": "model.set.create", "params": {"name": "CD", "geometry": [{"body": "Membrane", "edge": "CD"}]}},
{"command": "model.set.create", "params": {"name": "BC", "geometry": [{"body": "Membrane", "edge": "BC"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 210000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "membrane", "set": "all", "material": "Steel", "kind": {"type": "plane_stress", "thickness": 0.1}}},
{"command": "model.boundary_condition.create", "params": {"name": "ab", "type": "symmetry", "target": {"set": "AB"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "cd", "type": "symmetry", "target": {"set": "CD"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "BC", "magnitude": -10.0}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["ab", "cd"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -3,7 +3,7 @@
"kind": "theory",
"source": "Hill, The Mathematical Theory of Plasticity, Oxford 1950, ch. V §2: plane strain von Mises collapse pressure p = (2/√3)σ_y ln(b/a)",
"status": "pending",
"requires": "J2 plasticity (M8/M10 X2)",
"requires": "implicit (static) J2 plasticity: explicit J2 is in, a collapse load needs the static solver",
"quantities": [
{
"id": "p_collapse",
@@ -0,0 +1,5 @@
# Long rotating solid cylinder, axisymmetric
A solid cylinder of radius 1 (E = 1000, ν = 0.3, ρ = 10⁻³) spinning at 30 rad/s about its axis y,
as an axisymmetric slice 0 ≤ y ≤ 0.2 held axially on both faces (ε_z = 0): one quad8 patch of
16 × 2. σ_r = (3 − 2ν)/(8(1 − ν)) ρω²(b² − r²), σ_θ = ρω²/(8(1 − ν)) ((3 − 2ν)b² − (1 + 2ν)r²).
@@ -0,0 +1,53 @@
{
"title": "Long rotating solid cylinder, axisymmetric",
"kind": "theory",
"source": "Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (long rotating cylinder, ε_z = 0)",
"quantities": [
{
"id": "radial_axis",
"quantity": "radial stress σ_r on the axis (r = 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Spin",
"at": [
[
0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 0.3857142857142857,
"tolerance": {
"relative": 0.01
},
"reason": "stress extrapolated to the axis, where σ_r = σ_θ: under 1% with sixteen quadratic elements across"
},
{
"id": "hoop_rim",
"quantity": "hoop stress σ_θ at the surface (r = 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Spin",
"at": [
[
1.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 0.12857142857142853,
"tolerance": {
"relative": 0.01
},
"reason": "stress extrapolated to the surface: under 1%"
}
]
}
@@ -0,0 +1,13 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"hoop_rim": {
"band": 1.2872894568377547e-10,
"value": 0.12872894568377546
},
"radial_axis": {
"band": 3.8608385213197527e-10,
"value": 0.38608385213197527
}
}
}
@@ -0,0 +1,11 @@
[
{"command": "mesh.block", "params": {"body": "Shaft", "kind": "quad8", "corners": [[0, 0, 0], [1.0, 0, 0], [1.0, 0.2, 0], [0, 0.2, 0]], "divisions": [16, 2], "edges": [{"corners": [1, 2], "name": "bottom"}, {"corners": [3, 4], "name": "top"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Shaft", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "ends", "geometry": [{"body": "Shaft", "edge": "bottom"}, {"body": "Shaft", "edge": "top"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.3}, "density": 0.001}},
{"command": "model.section.create", "params": {"name": "shaft", "set": "all", "material": "Mat", "kind": {"type": "axisymmetric"}}},
{"command": "model.boundary_condition.create", "params": {"name": "ends", "type": "symmetry", "target": {"set": "ends"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "spin", "type": "centrifugal", "angular_velocity": 30.0, "point": [0, 0, 0], "axis": [0, 1, 0]}},
{"command": "model.step.create", "params": {"name": "Spin", "procedure": {"type": "static"}, "boundary_conditions": ["ends"], "loads": ["spin"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,7 @@
# Rotating disc with a central hole, plane stress
A thin disc, inner radius 20, outer 100 (E = 210000, ν = 0.3, ρ = 7.85e-9: mm, t, s, MPa),
spinning at 1000 rad/s about z: a quarter, one quad8 patch (16 × 32, graded 4 : 1 towards the
bore, where the hoop stress is steepest) with mid-side nodes on the arcs, symmetry on x = 0 and y = 0, a centrifugal load. Timoshenko and Goodier:
σ_r = (3 + ν)/8 ρω² (b² + a² − a²b²/r² − r²),
σ_θ = (3 + ν)/8 ρω² (b² + a² + a²b²/r² − (1 + 3ν)/(3 + ν) r²).
@@ -0,0 +1,76 @@
{
"title": "Rotating disc with a central hole, plane stress",
"kind": "theory",
"source": "Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (rotating disc of uniform thickness with a hole)",
"quantities": [
{
"id": "hoop_bore",
"quantity": "hoop stress σ_θ = σ_yy at the bore (20, 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Spin",
"at": [
[
20.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 65.312,
"tolerance": {
"relative": 0.01
},
"reason": "stress extrapolated to the bore surface, where the a²b²/r² term is steepest: 16 radial quadratic elements graded towards the bore leave about 0.2% (8 uniform: −2.4%; 32 graded: −0.05%)"
},
{
"id": "radial_max",
"quantity": "radial stress σ_r = σ_xx at r = √(ab), its maximum",
"measure": {
"command": "solve.probe",
"params": {
"step": "Spin",
"at": [
[
44.721359549995796,
0,
0
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 20.724,
"tolerance": {
"relative": 0.01
},
"reason": "the nearest node to √(ab) is within half an element of it, where σ_r is stationary (an error of order (h/r)², under 0.5%), and nodal averaging adds a few tenths of a percent"
},
{
"id": "hoop_rim",
"quantity": "hoop stress σ_θ = σ_yy at the rim (100, 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Spin",
"at": [
[
100.0,
0,
0
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 16.328,
"tolerance": {
"relative": 0.01
},
"reason": "as at the bore"
}
]
}
@@ -0,0 +1,17 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"hoop_bore": {
"band": 6.5312e-8,
"value": 65.18766671256753
},
"hoop_rim": {
"band": 1.6352371809556562e-8,
"value": 16.352371809556562
},
"radial_max": {
"band": 2.0724e-8,
"value": 20.682642297503843
}
}
}
@@ -0,0 +1,13 @@
[
{"command": "mesh.block", "params": {"body": "Disc", "kind": "quad8", "corners": [[20.0, 0, 0], [100.0, 0, 0], [0, 100.0, 0], [0, 20.0, 0]], "divisions": [16, 32], "bias": [4, 1], "edges": [{"corners": [2, 3], "arc": {"center": [0, 0, 0]}}, {"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [1, 2], "name": "y0"}, {"corners": [3, 4], "name": "x0"}]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Disc", "face": "area"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Disc", "edge": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Disc", "edge": "y0"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 210000.0, "poisson": 0.3}, "density": 7.85e-09}},
{"command": "model.section.create", "params": {"name": "disc", "set": "all", "material": "Steel", "kind": {"type": "plane_stress", "thickness": 5.0}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "spin", "type": "centrifugal", "angular_velocity": 1000.0, "point": [0, 0, 0], "axis": [0, 0, 1]}},
{"command": "model.step.create", "params": {"name": "Spin", "procedure": {"type": "static"}, "boundary_conditions": ["sx", "sy"], "loads": ["spin"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+1 -1
View File
@@ -3,7 +3,7 @@
"kind": "experiment",
"source": "Wilkins and Guinan, 'Impact of cylinders on a rigid boundary', Journal of Applied Physics 44 (1973) 1200–1206 (final length and mushroom diameter vs impact speed)",
"status": "pending",
"requires": "large-deformation plasticity and contact (M10 X2/X3)",
"requires": "the measured final shapes, to be transcribed from the paper (explicit Johnson–Cook plasticity is in)",
"quantities": [
{
"id": "final_length",