diff --git a/docs/oracle.md b/docs/oracle.md index 062d8ba..bbbd8bc 100644 --- a/docs/oracle.md +++ b/docs/oracle.md @@ -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) | diff --git a/tests/oracle/j2-uniaxial-explicit/README.md b/tests/oracle/j2-uniaxial-explicit/README.md new file mode 100644 index 0000000..d0d53a3 --- /dev/null +++ b/tests/oracle/j2-uniaxial-explicit/README.md @@ -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. diff --git a/tests/oracle/j2-uniaxial-explicit/expected.json b/tests/oracle/j2-uniaxial-explicit/expected.json new file mode 100644 index 0000000..2c18c41 --- /dev/null +++ b/tests/oracle/j2-uniaxial-explicit/expected.json @@ -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" + } + ] +} diff --git a/tests/oracle/j2-uniaxial-explicit/fixture.json b/tests/oracle/j2-uniaxial-explicit/fixture.json new file mode 100644 index 0000000..8df922f --- /dev/null +++ b/tests/oracle/j2-uniaxial-explicit/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/j2-uniaxial-explicit/recipe.json b/tests/oracle/j2-uniaxial-explicit/recipe.json new file mode 100644 index 0000000..c2f4061 --- /dev/null +++ b/tests/oracle/j2-uniaxial-explicit/recipe.json @@ -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"} +] diff --git a/tests/oracle/kirsch-plate-plane-stress/README.md b/tests/oracle/kirsch-plate-plane-stress/README.md new file mode 100644 index 0000000..97a202b --- /dev/null +++ b/tests/oracle/kirsch-plate-plane-stress/README.md @@ -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. diff --git a/tests/oracle/kirsch-plate-plane-stress/expected.json b/tests/oracle/kirsch-plate-plane-stress/expected.json new file mode 100644 index 0000000..5a0d61c --- /dev/null +++ b/tests/oracle/kirsch-plate-plane-stress/expected.json @@ -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" + } + ] +} diff --git a/tests/oracle/kirsch-plate-plane-stress/fixture.json b/tests/oracle/kirsch-plate-plane-stress/fixture.json new file mode 100644 index 0000000..9b0b3ec --- /dev/null +++ b/tests/oracle/kirsch-plate-plane-stress/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/kirsch-plate-plane-stress/recipe.json b/tests/oracle/kirsch-plate-plane-stress/recipe.json new file mode 100644 index 0000000..e6feb65 --- /dev/null +++ b/tests/oracle/kirsch-plate-plane-stress/recipe.json @@ -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"} +] diff --git a/tests/oracle/lame-cylinder-axisymmetric/README.md b/tests/oracle/lame-cylinder-axisymmetric/README.md new file mode 100644 index 0000000..ab015b7 --- /dev/null +++ b/tests/oracle/lame-cylinder-axisymmetric/README.md @@ -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. diff --git a/tests/oracle/lame-cylinder-axisymmetric/expected.json b/tests/oracle/lame-cylinder-axisymmetric/expected.json new file mode 100644 index 0000000..66d9e5d --- /dev/null +++ b/tests/oracle/lame-cylinder-axisymmetric/expected.json @@ -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" + } + ] +} diff --git a/tests/oracle/lame-cylinder-axisymmetric/fixture.json b/tests/oracle/lame-cylinder-axisymmetric/fixture.json new file mode 100644 index 0000000..1c59329 --- /dev/null +++ b/tests/oracle/lame-cylinder-axisymmetric/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/lame-cylinder-axisymmetric/recipe.json b/tests/oracle/lame-cylinder-axisymmetric/recipe.json new file mode 100644 index 0000000..bf13209 --- /dev/null +++ b/tests/oracle/lame-cylinder-axisymmetric/recipe.json @@ -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"} +] diff --git a/tests/oracle/lame-cylinder-plane-strain/README.md b/tests/oracle/lame-cylinder-plane-strain/README.md new file mode 100644 index 0000000..af37836 --- /dev/null +++ b/tests/oracle/lame-cylinder-plane-strain/README.md @@ -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. diff --git a/tests/oracle/lame-cylinder-plane-strain/expected.json b/tests/oracle/lame-cylinder-plane-strain/expected.json new file mode 100644 index 0000000..a8980ca --- /dev/null +++ b/tests/oracle/lame-cylinder-plane-strain/expected.json @@ -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" + } + ] +} diff --git a/tests/oracle/lame-cylinder-plane-strain/fixture.json b/tests/oracle/lame-cylinder-plane-strain/fixture.json new file mode 100644 index 0000000..95125cf --- /dev/null +++ b/tests/oracle/lame-cylinder-plane-strain/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/lame-cylinder-plane-strain/recipe.json b/tests/oracle/lame-cylinder-plane-strain/recipe.json new file mode 100644 index 0000000..6af9e7c --- /dev/null +++ b/tests/oracle/lame-cylinder-plane-strain/recipe.json @@ -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"} +] diff --git a/tests/oracle/nafems-le1-plane-stress/README.md b/tests/oracle/nafems-le1-plane-stress/README.md index 75f2bdb..831188b 100644 --- a/tests/oracle/nafems-le1-plane-stress/README.md +++ b/tests/oracle/nafems-le1-plane-stress/README.md @@ -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. diff --git a/tests/oracle/nafems-le1-plane-stress/expected.json b/tests/oracle/nafems-le1-plane-stress/expected.json index 9db2e1d..fc1f7d7 100644 --- a/tests/oracle/nafems-le1-plane-stress/expected.json +++ b/tests/oracle/nafems-le1-plane-stress/expected.json @@ -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" } ] } diff --git a/tests/oracle/nafems-le1-plane-stress/fixture.json b/tests/oracle/nafems-le1-plane-stress/fixture.json new file mode 100644 index 0000000..c9527d4 --- /dev/null +++ b/tests/oracle/nafems-le1-plane-stress/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/nafems-le1-plane-stress/recipe.json b/tests/oracle/nafems-le1-plane-stress/recipe.json new file mode 100644 index 0000000..42d8618 --- /dev/null +++ b/tests/oracle/nafems-le1-plane-stress/recipe.json @@ -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"} +] diff --git a/tests/oracle/plastic-thick-cylinder/expected.json b/tests/oracle/plastic-thick-cylinder/expected.json index 0b84b94..6d74b98 100644 --- a/tests/oracle/plastic-thick-cylinder/expected.json +++ b/tests/oracle/plastic-thick-cylinder/expected.json @@ -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", diff --git a/tests/oracle/rotating-cylinder-axisymmetric/README.md b/tests/oracle/rotating-cylinder-axisymmetric/README.md new file mode 100644 index 0000000..a60e934 --- /dev/null +++ b/tests/oracle/rotating-cylinder-axisymmetric/README.md @@ -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²). diff --git a/tests/oracle/rotating-cylinder-axisymmetric/expected.json b/tests/oracle/rotating-cylinder-axisymmetric/expected.json new file mode 100644 index 0000000..1a256b6 --- /dev/null +++ b/tests/oracle/rotating-cylinder-axisymmetric/expected.json @@ -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%" + } + ] +} diff --git a/tests/oracle/rotating-cylinder-axisymmetric/fixture.json b/tests/oracle/rotating-cylinder-axisymmetric/fixture.json new file mode 100644 index 0000000..a2f4fe3 --- /dev/null +++ b/tests/oracle/rotating-cylinder-axisymmetric/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/rotating-cylinder-axisymmetric/recipe.json b/tests/oracle/rotating-cylinder-axisymmetric/recipe.json new file mode 100644 index 0000000..205d3ea --- /dev/null +++ b/tests/oracle/rotating-cylinder-axisymmetric/recipe.json @@ -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"} +] diff --git a/tests/oracle/rotating-disc-plane-stress/README.md b/tests/oracle/rotating-disc-plane-stress/README.md new file mode 100644 index 0000000..873796d --- /dev/null +++ b/tests/oracle/rotating-disc-plane-stress/README.md @@ -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²). diff --git a/tests/oracle/rotating-disc-plane-stress/expected.json b/tests/oracle/rotating-disc-plane-stress/expected.json new file mode 100644 index 0000000..9df46be --- /dev/null +++ b/tests/oracle/rotating-disc-plane-stress/expected.json @@ -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" + } + ] +} diff --git a/tests/oracle/rotating-disc-plane-stress/fixture.json b/tests/oracle/rotating-disc-plane-stress/fixture.json new file mode 100644 index 0000000..188a02a --- /dev/null +++ b/tests/oracle/rotating-disc-plane-stress/fixture.json @@ -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 + } + } +} diff --git a/tests/oracle/rotating-disc-plane-stress/recipe.json b/tests/oracle/rotating-disc-plane-stress/recipe.json new file mode 100644 index 0000000..6034c92 --- /dev/null +++ b/tests/oracle/rotating-disc-plane-stress/recipe.json @@ -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"} +] diff --git a/tests/oracle/taylor-bar/expected.json b/tests/oracle/taylor-bar/expected.json index 3d565e8..fbb4c08 100644 --- a/tests/oracle/taylor-bar/expected.json +++ b/tests/oracle/taylor-bar/expected.json @@ -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",