forked from 1b-agent/fieldcraft-upstream
Verification oracle: tests/oracle cases, cargo xtask oracle, fixtures, docs/oracle.md, CI job
The oracle binary (modelcraft-testkit) runs each case's recipe through the command engine, measures its quantities by JSON pointers into step outputs or commands, compares them with the cited references and the frozen fixtures, and writes docs/oracle.md. 20 theory cases (patch tests of every solid element, Timoshenko cantilevers, Lame, Kirsch, beam frequencies, torsion and bending through couplings, explicit waves and impact, CDT invariants), 8 published benchmarks (MacNeal-Harder patch, straight and curved cantilevers, thick cylinder, Scordelis-Lo with solids, NAFEMS LE1, LE10, FV32) and 10 pending cases with citations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
1 parent
a3cb6d749b
commit
6d9452ad84
144 files changed
+5162
-74
No files matched your search
@@ -0,0 +1,7 @@
|
||||
# Plate with a circular hole in tension (Kirsch)
|
||||
|
||||
A quarter of a square plate of half-width 30 with a hole of radius 1 (W = 60a, so the infinite
|
||||
plate's solution applies to a few tenths of a percent), thin (free faces, plane stress), with
|
||||
symmetry on x = 0, y = 0 and the mid-plane, pulled by a traction of 1 on x = 30. Two hex20 blocks
|
||||
around the hole (40 × 16 each), graded 40 : 1 towards it. Kirsch: σ_θ = 3S at the top of
|
||||
the hole, −S at its side.
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"title": "Plate with a circular hole in tension (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, 0) 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, 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%"
|
||||
},
|
||||
{
|
||||
"id": "side",
|
||||
"quantity": "σ_yy at the side of the hole (1, 0, 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.0120654194508524e-9,
|
||||
"value": 3.012065419450852
|
||||
},
|
||||
"side": {
|
||||
"band": 1.0110362570446956e-9,
|
||||
"value": -1.0110362570446956
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[1.0, 0, 0], [30.0, 0, 0], [30.0, 30.0, 0], [0.7071067811865476, 0.7071067811865476, 0], [1.0, 0, 0.1], [30.0, 0, 0.1], [30.0, 30.0, 0.1], [0.7071067811865476, 0.7071067811865476, 0.1]], "divisions": [40, 16, 1], "bias": [40, 1, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 0.1]}}], "faces": {"6": "hole", "3": "y0", "4": "load", "1": "z0"}}},
|
||||
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[0.7071067811865476, 0.7071067811865476, 0], [30.0, 30.0, 0], [0, 30.0, 0], [0, 1.0, 0], [0.7071067811865476, 0.7071067811865476, 0.1], [30.0, 30.0, 0.1], [0, 30.0, 0.1], [0, 1.0, 0.1]], "divisions": [40, 16, 1], "bias": [40, 1, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 0.1]}}], "faces": {"6": "hole", "5": "x0", "1": "z0"}}},
|
||||
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Plate"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Plate", "face": "x0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Plate", "face": "y0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Plate", "face": "z0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "load", "geometry": [{"body": "Plate", "face": "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": "solid"}}},
|
||||
{"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.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", "sz"], "loads": ["S"]}},
|
||||
{"command": "solve.static", "params": {}, "id": "solve"}
|
||||
]
|
||||
Reference in new issue
Block a user