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 <noreply@anthropic.com>
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,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"}
]