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

@@ -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",