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:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-13 21:42:19 -04:00
1 parent a3cb6d749b
commit 6d9452ad84
144 files changed
+5162 -74

No files matched your search

+4
View File
@@ -0,0 +1,4 @@
# Elastic wave in a bar from a pressure step (explicit)
A bar 10 × 0.1 × 0.1 of 200 one-point hex8 elements (E = 10⁴, ρ = 1, ν = 0, so c = 100) with a
pressure step of 1 on its end x = 10, solved explicitly to t = 0.06 (the front has travelled 6).
@@ -0,0 +1,66 @@
{
"title": "Elastic wave in a bar from a pressure step (explicit)",
"kind": "theory",
"source": "d'Alembert's solution of the one-dimensional wave equation: c = √(E/ρ), particle velocity v = p/(ρc); Graff, Wave Motion in Elastic Solids, Dover 1991, §2.1",
"quantities": [
{
"id": "u_end",
"quantity": "displacement of the loaded end at t = 0.06",
"measure": {
"command": "solve.probe",
"params": {
"step": "Wave",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": -0.0006,
"tolerance": {
"relative": 0.01
},
"reason": "the end moves at the particle velocity p/(ρc) from the start; the discrete wave's ringing behind the front changes the end's displacement by well under 1%"
},
{
"id": "v_mid",
"quantity": "particle velocity at x = 5, 20 elements behind the front, at t = 0.06",
"measure": {
"command": "solve.probe",
"params": {
"step": "Wave",
"at": [
[
5.0,
0,
0
]
]
},
"pointer": "/nodes/0/velocity/0"
},
"value": -0.01,
"tolerance": {
"relative": 0.02
},
"reason": "central differences ring behind a step front (dispersion); bulk viscosity damps it within a few elements, leaving about 1% twenty elements behind"
},
{
"id": "balance",
"quantity": "energy balance error",
"measure": {
"from": "solve",
"pointer": "/energy_balance"
},
"value": 0.0,
"tolerance": {
"absolute": 0.01
},
"reason": "external work = kinetic + internal + dissipated energy; the solver warns above 1%"
}
]
}
@@ -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": {
"balance": {
"band": 0.00001000000152706151,
"value": 0.001527061509461723
},
"u_end": {
"band": 6e-13,
"value": -0.0005998107000086691
},
"v_mid": {
"band": 1.0000000000000001e-11,
"value": -0.00985543917252298
}
}
}
@@ -0,0 +1,10 @@
[
{"command": "mesh.block", "params": {"body": "Bar", "kind": "hex8", "corners": [[0, 0, 0], [10.0, 0, 0], [10.0, 0.1, 0], [0, 0.1, 0], [0, 0, 0.1], [10.0, 0, 0.1], [10.0, 0.1, 0.1], [0, 0.1, 0.1]], "divisions": [200, 1, 1], "faces": {"4": "end"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Bar"}]}},
{"command": "model.set.create", "params": {"name": "end", "geometry": [{"body": "Bar", "face": "end"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 10000.0, "poisson": 0.0}, "density": 1.0}},
{"command": "model.section.create", "params": {"name": "bar", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"integration": "reduced"}}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "end", "magnitude": 1.0}},
{"command": "model.step.create", "params": {"name": "Wave", "procedure": {"type": "explicit_dynamic", "end_time": 0.06}, "boundary_conditions": [], "loads": ["p"]}},
{"command": "solve.explicit", "params": {"step": "Wave"}, "id": "solve"}
]
@@ -0,0 +1,5 @@
# Elastic bar striking a rigid wall (explicit)
A bar 10 × 0.1 × 0.1 of 200 one-point hex8 elements (E = 10⁴, ρ = 1, ν = 0, c = 100) moving at
v₀ = 0.1 towards a frictionless rigid wall at x = 0 (its end face is the contact set); linear bulk
viscosity off. Solved to t = 0.3: in contact from 0 to 2L/c = 0.2, then free at +v₀.
@@ -0,0 +1,67 @@
{
"title": "Elastic bar striking a rigid wall (explicit)",
"kind": "theory",
"source": "One-dimensional elastic impact on a rigid wall: contact time 2L/c, rebound at the impact speed, contact stress ρcv₀; Graff, Wave Motion in Elastic Solids, Dover 1991, §2.3; Johnson, Impact Strength of Materials, Arnold 1972, §1.6",
"quantities": [
{
"id": "u_front",
"quantity": "displacement of the struck end at t = 0.3 (in contact until 2L/c = 0.2, then leaving at v₀)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Impact",
"at": [
[
0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.009999999999999998,
"tolerance": {
"relative": 0.03
},
"reason": "the contact ends at 2L/c in the elastic theory; the discrete release front is spread over a few elements, a few tenths of a percent of the time, and the rebound speed is v₀ to about 1%"
},
{
"id": "u_back",
"quantity": "displacement of the far end at t = 0.3 (−v₀L/c, then +v₀ after the reflection)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Impact",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.01,
"tolerance": {
"relative": 0.03
},
"reason": "as for the struck end"
},
{
"id": "ke",
"quantity": "kinetic energy after the rebound over the initial ½mv₀²",
"measure": {
"from": "solve",
"pointer": "/energy/kinetic",
"scale": 1999.9999999999995
},
"value": 1.0,
"tolerance": {
"relative": 0.02
},
"reason": "an elastic impact keeps the kinetic energy; quadratic bulk viscosity in the compression front and the vibration left in the bar take about 1%"
}
]
}
@@ -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": {
"ke": {
"band": 1e-9,
"value": 0.9946927802814477
},
"u_back": {
"band": 1.0000000000000001e-11,
"value": 0.009946347263883909
},
"u_front": {
"band": 1e-11,
"value": 0.009949683285107395
}
}
}
@@ -0,0 +1,9 @@
[
{"command": "mesh.block", "params": {"body": "Bar", "kind": "hex8", "corners": [[0, 0, 0], [10.0, 0, 0], [10.0, 0.1, 0], [0, 0.1, 0], [0, 0, 0.1], [10.0, 0, 0.1], [10.0, 0.1, 0.1], [0, 0.1, 0.1]], "divisions": [200, 1, 1], "faces": {"6": "front"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Bar"}]}},
{"command": "model.set.create", "params": {"name": "front", "geometry": [{"body": "Bar", "face": "front"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 10000.0, "poisson": 0.0}, "density": 1.0}},
{"command": "model.section.create", "params": {"name": "bar", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"integration": "reduced"}}},
{"command": "model.step.create", "params": {"name": "Impact", "procedure": {"type": "explicit_dynamic", "end_time": 0.3, "initial_velocities": [{"set": "all", "velocity": [-0.1, 0, 0]}], "rigid_walls": [{"set": "front", "point": [0, 0, 0], "normal": [1, 0, 0]}], "bulk_viscosity": {"linear": 0.0, "quadratic": 1.5}}, "boundary_conditions": [], "loads": []}},
{"command": "solve.explicit", "params": {"step": "Impact"}, "id": "solve"}
]
@@ -0,0 +1,4 @@
# Natural frequencies of a cantilever (Euler–Bernoulli)
A 20 × 1 × 1 bar of 20 × 2 × 2 hex20 elements clamped at x = 0 (E = 1000, ν = 0, ρ = 1), consistent
mass. Euler–Bernoulli frequencies of a clamped–free beam.
@@ -0,0 +1,46 @@
{
"title": "Natural frequencies of a cantilever (Euler–Bernoulli)",
"kind": "theory",
"source": "Euler–Bernoulli beam: f_n = (β_n L)²/(2π L²)·√(EI/ρA), β₁L = 1.8751, β₂L = 4.6941; Timoshenko, Young and Weaver, Vibration Problems in Engineering, 4th ed., Wiley 1974, §5.3",
"quantities": [
{
"id": "f1",
"quantity": "first bending frequency (modes 1 and 2 are the y and z pair)",
"measure": {
"from": "modes",
"pointer": "/modes/0/frequency"
},
"value": 0.012770863695053732,
"tolerance": {
"relative": 0.01
},
"reason": "Euler–Bernoulli neglects shear and rotary inertia, which lower f1 by about 0.2% at L/h = 20"
},
{
"id": "f1_pair",
"quantity": "the other first bending frequency",
"measure": {
"from": "modes",
"pointer": "/modes/1/frequency"
},
"value": 0.012770863695053732,
"tolerance": {
"relative": 0.01
},
"reason": "as f1: a square section bends alike in y and z"
},
{
"id": "f2",
"quantity": "second bending frequency",
"measure": {
"from": "modes",
"pointer": "/modes/2/frequency"
},
"value": 0.08003363662360005,
"tolerance": {
"relative": 0.02
},
"reason": "shear and rotary inertia lower the second mode by about 1% at L/h = 20 (Timoshenko)"
}
]
}
@@ -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": {
"f1": {
"band": 1.2770863695053732e-11,
"value": 0.012750678058109033
},
"f1_pair": {
"band": 1.2770863695053732e-11,
"value": 0.012750678058529053
},
"f2": {
"band": 8.003363662360005e-11,
"value": 0.07916657526441415
}
}
}
@@ -0,0 +1,10 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex20", "corners": [[0, 0, 0], [20.0, 0, 0], [20.0, 1.0, 0], [0, 1.0, 0], [0, 0, 1.0], [20.0, 0, 1.0], [20.0, 1.0, 1.0], [0, 1.0, 1.0]], "divisions": [20, 2, 2], "faces": {"6": "root"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.0}, "density": 1.0}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.step.create", "params": {"name": "Modes", "procedure": {"type": "frequency", "modes": 4}, "boundary_conditions": ["clamp"], "loads": []}},
{"command": "solve.frequency", "params": {"step": "Modes"}, "id": "modes"}
]
+5
View File
@@ -0,0 +1,5 @@
# Cantilever under a tip load, Timoshenko deflection (hex20)
A 10 × 1 × 1 bar of hex20 elements (20 × 2 × 2) clamped at x = 0 with a total
force of 1 in −z spread over the free end (E = 1000, ν = 0, so no Poisson coupling at the clamp).
Timoshenko beam theory gives δ = PL³/(3EI) + PL/(κGA) = 4 + 0.024 = 4.024.
@@ -0,0 +1,43 @@
{
"title": "Cantilever under a tip load, Timoshenko deflection (hex20)",
"kind": "theory",
"source": "Timoshenko and Gere, Mechanics of Materials (beam with shear deformation: δ = PL³/3EI + PL/κGA, κ = 5/6 for a rectangle); Cowper, J. Appl. Mech. 33 (1966) 335–340 for the shear coefficient",
"quantities": [
{
"id": "tip_uz",
"quantity": "tip deflection u_z at (10, 0.5, 0.5)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Bend",
"at": [
[
10.0,
0.5,
0.5
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": -4.024,
"tolerance": {
"relative": 0.005
},
"reason": "beam theory vs 3D elasticity: the shear coefficient and the fully clamped end change the tip deflection by a few tenths of a percent at L/h = 10"
},
{
"id": "reaction",
"quantity": "total reaction z",
"measure": {
"from": "solve",
"pointer": "/reaction_total/2"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "equilibrium holds to rounding"
}
]
}
@@ -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": {
"reaction": {
"band": 1.0000000000401866e-9,
"value": 1.0000000000401865
},
"tip_uz": {
"band": 4.024e-9,
"value": -4.023474075811461
}
}
}
+12
View File
@@ -0,0 +1,12 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex20", "corners": [[0, 0, 0], [10.0, 0, 0], [10.0, 1.0, 0], [0, 1.0, 0], [0, 0, 1.0], [10.0, 0, 1.0], [10.0, 1.0, 1.0], [0, 1.0, 1.0]], "divisions": [20, 2, 2], "faces": {"6": "root", "4": "tip"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "tip", "geometry": [{"body": "Beam", "face": "tip"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.0}}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.load.create", "params": {"name": "P", "type": "force", "target": {"set": "tip"}, "vector": [0, 0, -1]}},
{"command": "model.step.create", "params": {"name": "Bend", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["P"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,5 @@
# Cantilever under a tip load, Timoshenko deflection (hex8-incompatible)
A 10 × 1 × 1 bar of hex8-incompatible elements (20 × 2 × 2) clamped at x = 0 with a total
force of 1 in −z spread over the free end (E = 1000, ν = 0, so no Poisson coupling at the clamp).
Timoshenko beam theory gives δ = PL³/(3EI) + PL/(κGA) = 4 + 0.024 = 4.024.
@@ -0,0 +1,43 @@
{
"title": "Cantilever under a tip load, Timoshenko deflection (hex8-incompatible)",
"kind": "theory",
"source": "Timoshenko and Gere, Mechanics of Materials (beam with shear deformation: δ = PL³/3EI + PL/κGA, κ = 5/6 for a rectangle); Cowper, J. Appl. Mech. 33 (1966) 335–340 for the shear coefficient",
"quantities": [
{
"id": "tip_uz",
"quantity": "tip deflection u_z at (10, 0.5, 0.5)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Bend",
"at": [
[
10.0,
0.5,
0.5
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": -4.024,
"tolerance": {
"relative": 0.005
},
"reason": "beam theory vs 3D elasticity (a few tenths of a percent at L/h = 10); incompatible modes represent the bending exactly in the constant-moment part"
},
{
"id": "reaction",
"quantity": "total reaction z",
"measure": {
"from": "solve",
"pointer": "/reaction_total/2"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "equilibrium holds to rounding"
}
]
}
@@ -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": {
"reaction": {
"band": 1e-9,
"value": 0.9999999999883957
},
"tip_uz": {
"band": 4.024e-9,
"value": -4.017499999970641
}
}
}
@@ -0,0 +1,12 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex8", "corners": [[0, 0, 0], [10.0, 0, 0], [10.0, 1.0, 0], [0, 1.0, 0], [0, 0, 1.0], [10.0, 0, 1.0], [10.0, 1.0, 1.0], [0, 1.0, 1.0]], "divisions": [20, 2, 2], "faces": {"6": "root", "4": "tip"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "tip", "geometry": [{"body": "Beam", "face": "tip"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.0}}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.load.create", "params": {"name": "P", "type": "force", "target": {"set": "tip"}, "vector": [0, 0, -1]}},
{"command": "model.step.create", "params": {"name": "Bend", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["P"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+5
View File
@@ -0,0 +1,5 @@
# Cantilever under a tip load, Timoshenko deflection (tet10)
A 10 × 1 × 1 bar of tet10 elements (20 × 2 × 2) clamped at x = 0 with a total
force of 1 in −z spread over the free end (E = 1000, ν = 0, so no Poisson coupling at the clamp).
Timoshenko beam theory gives δ = PL³/(3EI) + PL/(κGA) = 4 + 0.024 = 4.024.
@@ -0,0 +1,43 @@
{
"title": "Cantilever under a tip load, Timoshenko deflection (tet10)",
"kind": "theory",
"source": "Timoshenko and Gere, Mechanics of Materials (beam with shear deformation: δ = PL³/3EI + PL/κGA, κ = 5/6 for a rectangle); Cowper, J. Appl. Mech. 33 (1966) 335–340 for the shear coefficient",
"quantities": [
{
"id": "tip_uz",
"quantity": "tip deflection u_z at (10, 0.5, 0.5)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Bend",
"at": [
[
10.0,
0.5,
0.5
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": -4.024,
"tolerance": {
"relative": 0.005
},
"reason": "beam theory vs 3D elasticity (a few tenths of a percent at L/h = 10); quadratic tetrahedra are converged on this mesh"
},
{
"id": "reaction",
"quantity": "total reaction z",
"measure": {
"from": "solve",
"pointer": "/reaction_total/2"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "equilibrium holds to rounding"
}
]
}
@@ -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": {
"reaction": {
"band": 1.0000000000174362e-9,
"value": 1.000000000017436
},
"tip_uz": {
"band": 4.024e-9,
"value": -4.0232748685235595
}
}
}
+12
View File
@@ -0,0 +1,12 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "tet10", "corners": [[0, 0, 0], [10.0, 0, 0], [10.0, 1.0, 0], [0, 1.0, 0], [0, 0, 1.0], [10.0, 0, 1.0], [10.0, 1.0, 1.0], [0, 1.0, 1.0]], "divisions": [20, 2, 2], "faces": {"6": "root", "4": "tip"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "tip", "geometry": [{"body": "Beam", "face": "tip"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.0}}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.load.create", "params": {"name": "P", "type": "force", "target": {"set": "tip"}, "vector": [0, 0, -1]}},
{"command": "model.step.create", "params": {"name": "Bend", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["P"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+5
View File
@@ -0,0 +1,5 @@
# Constrained Delaunay mesh of a cylinder: volume within the chordal bound, valid elements
A cylinder R = 10, H = 20 built with SolidCraft from `design.json`, tessellated within 0.05 and
tetrahedralized by `mesh.tet.generate`. The mesh fills the inscribed polyhedron, whose volume lies
between (1 − 2s/R)πR²H and πR²H.
+12
View File
@@ -0,0 +1,12 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 10.0,
"height": 20.0,
"body_name": "Cylinder"
}
}
]
}
+33
View File
@@ -0,0 +1,33 @@
{
"title": "Constrained Delaunay mesh of a cylinder: volume within the chordal bound, valid elements",
"kind": "theory",
"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",
"quantities": [
{
"id": "volume",
"quantity": "volume of the tetrahedra",
"measure": {
"from": "tet",
"pointer": "/volume"
},
"value": 6267.477343911638,
"tolerance": {
"relative": 0.0025
},
"reason": "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"
},
{
"id": "invalid",
"quantity": "elements that fail the certified Jacobian check",
"measure": {
"command": "mesh.quality",
"pointer": "/invalid/count"
},
"value": 0.0,
"tolerance": {
"exact": true
},
"reason": "every element of a valid mesh has positive volume"
}
]
}
+13
View File
@@ -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": {
"invalid": {
"band": 0.0,
"value": 0.0
},
"volume": {
"band": 6.267477343911638e-6,
"value": 6266.527341942973
}
}
}
+3
View File
@@ -0,0 +1,3 @@
[
{"command": "mesh.tet.generate", "params": {"body": "Cylinder", "tolerance": 0.05}, "id": "tet"}
]
+5
View File
@@ -0,0 +1,5 @@
# Constrained Delaunay mesh of a stepped block: exact volume, valid elements
The corpus part `stepped-block` (three boxes, a pocket cut through), built with SolidCraft from
`design.json`, tetrahedralized by `mesh.tet.generate`. Every boundary face is planar, so the
tessellation is exact and the mesh's volume must equal 47000 to rounding.
@@ -0,0 +1,69 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"corner": [
0,
0,
0
],
"length": 60,
"width": 40,
"height": 10,
"body_name": "Steps"
}
},
{
"command": "solid.box",
"params": {
"corner": [
0,
0,
10
],
"length": 40,
"width": 40,
"height": 10,
"operation": "join",
"targets": [
"Steps"
]
}
},
{
"command": "solid.box",
"params": {
"corner": [
0,
0,
20
],
"length": 20,
"width": 40,
"height": 10,
"operation": "join",
"targets": [
"Steps"
]
}
},
{
"command": "solid.box",
"params": {
"corner": [
45,
15,
0
],
"length": 10,
"width": 10,
"height": 10,
"operation": "cut",
"targets": [
"Steps"
]
}
}
]
}
@@ -0,0 +1,46 @@
{
"title": "Constrained Delaunay mesh of a stepped block: exact volume, valid elements",
"kind": "theory",
"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",
"quantities": [
{
"id": "volume",
"quantity": "volume of the tetrahedra",
"measure": {
"from": "tet",
"pointer": "/volume"
},
"value": 47000.0,
"tolerance": {
"relative": 1e-12
},
"reason": "a planar boundary is tessellated exactly and the constrained Delaunay mesh fills it exactly: only rounding"
},
{
"id": "invalid",
"quantity": "elements that fail the certified Jacobian check",
"measure": {
"command": "mesh.quality",
"pointer": "/invalid/count"
},
"value": 0.0,
"tolerance": {
"exact": true
},
"reason": "every element of a valid mesh has positive volume"
},
{
"id": "undetermined",
"quantity": "elements the Jacobian check could not decide",
"measure": {
"command": "mesh.quality",
"pointer": "/undetermined/count"
},
"value": 0.0,
"tolerance": {
"exact": true
},
"reason": "a linear tetrahedron's sign is exact"
}
]
}
@@ -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": {
"invalid": {
"band": 0.0,
"value": 0.0
},
"undetermined": {
"band": 0.0,
"value": 0.0
},
"volume": {
"band": 0.000047000000000000004,
"value": 47000.0
}
}
}
@@ -0,0 +1,3 @@
[
{"command": "mesh.tet.generate", "params": {"body": "Steps", "tolerance": 0.05}, "id": "tet"}
]
@@ -0,0 +1,3 @@
# Flow around a cylinder, steady 2D-1 (Re = 20)
Channel 2.2 × 0.41 with a cylinder of diameter 0.1, parabolic inflow, Re = 20.
@@ -0,0 +1,19 @@
{
"title": "Flow around a cylinder, steady 2D-1 (Re = 20)",
"kind": "benchmark",
"source": "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)",
"status": "pending",
"requires": "lattice Boltzmann CFD (M12)",
"quantities": [
{
"id": "cd",
"quantity": "drag coefficient (published interval 5.57–5.59)",
"value": 5.58
},
{
"id": "cl",
"quantity": "lift coefficient (interval 0.0104–0.0110)",
"value": 0.0107
}
]
}
@@ -0,0 +1,4 @@
# Natural frequencies of a free beam: rigid-body modes and the first bending mode
The same bar with no support: six rigid-body modes at zero, then the first bending pair at the
free–free Euler–Bernoulli frequency.
@@ -0,0 +1,46 @@
{
"title": "Natural frequencies of a free beam: rigid-body modes and the first bending mode",
"kind": "theory",
"source": "Euler–Bernoulli free–free beam, β₁L = 4.7300; Timoshenko, Young and Weaver, Vibration Problems in Engineering, 4th ed., Wiley 1974, §5.3",
"quantities": [
{
"id": "rigid_6",
"quantity": "sixth frequency (the last rigid-body mode)",
"measure": {
"from": "modes",
"pointer": "/modes/5/frequency"
},
"value": 0.0,
"tolerance": {
"absolute": 8.1264203095911e-05
},
"reason": "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"
},
{
"id": "f7",
"quantity": "first free–free bending frequency (mode 7)",
"measure": {
"from": "modes",
"pointer": "/modes/6/frequency"
},
"value": 0.08126420309591101,
"tolerance": {
"relative": 0.015
},
"reason": "Euler–Bernoulli neglects shear and rotary inertia, about 0.8% at L/h = 20 for the free–free mode"
},
{
"id": "mass",
"quantity": "total mass",
"measure": {
"from": "modes",
"pointer": "/total_mass"
},
"value": 20.0,
"tolerance": {
"relative": 1e-12
},
"reason": "the mass matrix integrates the density exactly"
}
]
}
@@ -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": {
"f7": {
"band": 8.126420309591101e-11,
"value": 0.08061820502077137
},
"mass": {
"band": 2e-8,
"value": 19.999999999992152
},
"rigid_6": {
"band": 8.126420325076649e-8,
"value": 1.5485547377408235e-7
}
}
}
@@ -0,0 +1,8 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex20", "corners": [[0, 0, 0], [20.0, 0, 0], [20.0, 1.0, 0], [0, 1.0, 0], [0, 0, 1.0], [20.0, 0, 1.0], [20.0, 1.0, 1.0], [0, 1.0, 1.0]], "divisions": [20, 2, 2]}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.0}, "density": 1.0}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.step.create", "params": {"name": "Modes", "procedure": {"type": "frequency", "modes": 8}, "boundary_conditions": [], "loads": []}},
{"command": "solve.frequency", "params": {"step": "Modes"}, "id": "modes"}
]
+7
View File
@@ -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.
+53
View File
@@ -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"
}
]
}
+13
View File
@@ -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
}
}
}
+17
View File
@@ -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"}
]
+6
View File
@@ -0,0 +1,6 @@
# Thick-walled cylinder under internal pressure, plane strain (Lamé)
A quarter of a cylinder a = 10, b = 20, one unit long, with symmetry planes x = 0 and y = 0 and
u_z = 0 on both ends (plane strain), and internal pressure p = 100 (E = 210000, ν = 0.3);
8 × 16 hex20 elements with mid-side nodes on the arcs. Lamé: u_r = (1 + ν)a²p/(E(b² − a²))
((1 − 2ν)r + b²/r), σ_θ(a) = p(b² + a²)/(b² − a²).
+76
View File
@@ -0,0 +1,76 @@
{
"title": "Thick-walled cylinder under internal pressure, plane strain (Lamé)",
"kind": "theory",
"source": "Lamé's solution, Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §28 (thick-walled cylinder)",
"quantities": [
{
"id": "ur_a",
"quantity": "radial displacement at the bore (10, 0, 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": "ur_b",
"quantity": "radial displacement outside (20, 0, 0)",
"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 for the bore"
},
{
"id": "hoop_a",
"quantity": "hoop stress σ_θ = σ_yy at the bore (10, 0, 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 from the integration points to the bore surface and averaged over two elements: about 0.5% at the steepest gradient"
}
]
}
+17
View File
@@ -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.36121907829693
},
"ur_a": {
"band": 9.07936507936508e-12,
"value": 0.009079340794555735
},
"ur_b": {
"band": 5.777777777777779e-12,
"value": 0.0057777604134337515
}
}
}
+18
View File
@@ -0,0 +1,18 @@
[
{"command": "mesh.block", "params": {"body": "Pipe", "kind": "hex20", "corners": [[10.0, 0, 0], [20.0, 0, 0], [0, 20.0, 0], [0, 10.0, 0], [10.0, 0, 1], [20.0, 0, 1], [0, 20.0, 1], [0, 10.0, 1]], "divisions": [8, 16, 1], "edges": [{"corners": [2, 3], "arc": {"center": [0, 0, 0]}}, {"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1]}}], "faces": {"6": "bore", "3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Pipe"}]}},
{"command": "model.set.create", "params": {"name": "bore", "geometry": [{"body": "Pipe", "face": "bore"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Pipe", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Pipe", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Pipe", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Pipe", "face": "z1"}]}},
{"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": "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": "sz0", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "sz1", "type": "symmetry", "target": {"set": "z1"}, "plane": "z"}},
{"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", "sz0", "sz1"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,3 @@
# Lid-driven cavity, Re = 100
The square cavity with a moving lid at Re = 100.
@@ -0,0 +1,14 @@
{
"title": "Lid-driven cavity, Re = 100",
"kind": "benchmark",
"source": "Ghia, Ghia and Shin, Journal of Computational Physics 48 (1982) 387–411, Table I (u along the vertical centreline)",
"status": "pending",
"requires": "lattice Boltzmann CFD (M12)",
"quantities": [
{
"id": "u_min",
"quantity": "u/U at y = 0.4531 on the vertical centreline",
"value": -0.2109
}
]
}
@@ -0,0 +1,6 @@
# MacNeal–Harder curved cantilever, hex8 with incompatible modes
Our model of the published problem: a quarter ring, inner radius 4.12, outer 4.32, thickness 0.1
(E = 10⁷, ν = 0.25), of the prescribed 6 × 1 elements (hex8 with incompatible modes, corners on
the arcs), clamped at one end; a unit force at the free end, in the plane across the beam and out
of the plane, each a separate step.
@@ -0,0 +1,55 @@
{
"title": "MacNeal–Harder curved cantilever, hex8 with incompatible modes",
"kind": "benchmark",
"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",
"quantities": [
{
"id": "in_plane",
"quantity": "tip displacement along the in-plane load",
"measure": {
"command": "solve.probe",
"params": {
"step": "In_plane",
"at": [
[
0,
4.12,
0
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.08734,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)",
"known_failure": "0.880 of the theory, grade C: straight-sided hex8 on six elements over 90° (MacNeal–Harder's HEXA(8): 0.880, Table 9 p. 15)"
},
{
"id": "out_of_plane",
"quantity": "tip displacement along the out-of-plane load",
"measure": {
"command": "solve.probe",
"params": {
"step": "Out_of_plane",
"at": [
[
0,
4.12,
0
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.5022,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)",
"known_failure": "0.798 of the theory, grade D: out-of-plane bending with torsion on one element across (MacNeal–Harder's HEXA(8): 0.849)"
}
]
}
@@ -0,0 +1,4 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {}
}
@@ -0,0 +1,15 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex8", "corners": [[4.12, 0, 0], [4.32, 0, 0], [0, 4.32, 0], [0, 4.12, 0], [4.12, 0, 0.1], [4.32, 0, 0.1], [0, 4.32, 0.1], [0, 4.12, 0.1]], "divisions": [1, 6, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 0.1]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 0.1]}}], "faces": {"3": "root", "5": "tip"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "tip", "geometry": [{"body": "Beam", "face": "tip"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 10000000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.load.create", "params": {"name": "in_plane", "type": "force", "target": {"set": "tip"}, "vector": [0, 1, 0]}},
{"command": "model.load.create", "params": {"name": "out_of_plane", "type": "force", "target": {"set": "tip"}, "vector": [0, 0, 1]}},
{"command": "model.step.create", "params": {"name": "In_plane", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["in_plane"]}},
{"command": "model.step.create", "params": {"name": "Out_of_plane", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["out_of_plane"]}},
{"command": "solve.static", "params": {"step": "In_plane"}},
{"command": "solve.static", "params": {"step": "Out_of_plane"}}
]
+6
View File
@@ -0,0 +1,6 @@
# MacNeal–Harder patch test for solids (hex8 with incompatible modes)
Our model of the published problem: a unit cube cut into seven hexahedra around an irregular inner
hexahedron (inner node coordinates from Fig. 3), E = 10⁶, ν = 0.25, with the linear displacement
field of Table 2(c) prescribed at the eight corners. The published solution is the uniform strain
10⁻³ with σ_x = σ_y = σ_z = 2000 and τ = 400.
+168
View File
@@ -0,0 +1,168 @@
{
"title": "MacNeal–Harder patch test for solids (hex8 with incompatible modes)",
"kind": "benchmark",
"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",
"quantities": [
{
"id": "sxx",
"quantity": "σ_xx at inner node 7 (0.788, 0.693, 0.644)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 2000.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "syy",
"quantity": "σ_yy at inner node 7 (0.788, 0.693, 0.644)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 2000.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "szz",
"quantity": "σ_zz at inner node 7 (0.788, 0.693, 0.644)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 2000.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "txy",
"quantity": "τ_xy at inner node 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/3"
},
"value": 400.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "txz",
"quantity": "τ_xz at inner node 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/4"
},
"value": 400.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "tyz",
"quantity": "τ_yz at inner node 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/stress/5"
},
"value": 400.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "u7",
"quantity": "u_x at inner node 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Patch",
"at": [
[
0.788,
0.693,
0.644
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.0014565000000000001,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
}
]
}
+33
View File
@@ -0,0 +1,33 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"sxx": {
"band": 2.000000000000001e-6,
"value": 2000.000000000001
},
"syy": {
"band": 2.000000000000003e-6,
"value": 2000.0000000000027
},
"szz": {
"band": 2.000000000000003e-6,
"value": 2000.0000000000027
},
"txy": {
"band": 4.00000000000001e-7,
"value": 400.00000000000097
},
"txz": {
"band": 4.0000000000000003e-7,
"value": 399.99999999999994
},
"tyz": {
"band": 4.0000000000000003e-7,
"value": 399.9999999999994
},
"u7": {
"band": 1.4565000000000005e-12,
"value": 0.0014565000000000003
}
}
}
+46
View File
@@ -0,0 +1,46 @@
[
{"command": "mesh.node.add", "params": {"label": 1, "xyz": [0, 0, 0]}},
{"command": "mesh.node.add", "params": {"label": 2, "xyz": [1, 0, 0]}},
{"command": "mesh.node.add", "params": {"label": 3, "xyz": [1, 1, 0]}},
{"command": "mesh.node.add", "params": {"label": 4, "xyz": [0, 1, 0]}},
{"command": "mesh.node.add", "params": {"label": 5, "xyz": [0, 0, 1]}},
{"command": "mesh.node.add", "params": {"label": 6, "xyz": [1, 0, 1]}},
{"command": "mesh.node.add", "params": {"label": 7, "xyz": [1, 1, 1]}},
{"command": "mesh.node.add", "params": {"label": 8, "xyz": [0, 1, 1]}},
{"command": "mesh.node.add", "params": {"label": 9, "xyz": [0.249, 0.342, 0.192]}},
{"command": "mesh.node.add", "params": {"label": 10, "xyz": [0.826, 0.288, 0.288]}},
{"command": "mesh.node.add", "params": {"label": 11, "xyz": [0.85, 0.649, 0.263]}},
{"command": "mesh.node.add", "params": {"label": 12, "xyz": [0.273, 0.75, 0.23]}},
{"command": "mesh.node.add", "params": {"label": 13, "xyz": [0.32, 0.186, 0.643]}},
{"command": "mesh.node.add", "params": {"label": 14, "xyz": [0.677, 0.305, 0.683]}},
{"command": "mesh.node.add", "params": {"label": 15, "xyz": [0.788, 0.693, 0.644]}},
{"command": "mesh.node.add", "params": {"label": 16, "xyz": [0.165, 0.745, 0.702]}},
{"command": "mesh.element.add", "params": {"label": 1, "kind": "hex8", "nodes": [9, 10, 11, 12, 13, 14, 15, 16]}},
{"command": "mesh.element.add", "params": {"label": 2, "kind": "hex8", "nodes": [1, 2, 3, 4, 9, 10, 11, 12]}},
{"command": "mesh.element.add", "params": {"label": 3, "kind": "hex8", "nodes": [13, 14, 15, 16, 5, 6, 7, 8]}},
{"command": "mesh.element.add", "params": {"label": 4, "kind": "hex8", "nodes": [1, 2, 10, 9, 5, 6, 14, 13]}},
{"command": "mesh.element.add", "params": {"label": 5, "kind": "hex8", "nodes": [12, 11, 3, 4, 16, 15, 7, 8]}},
{"command": "mesh.element.add", "params": {"label": 6, "kind": "hex8", "nodes": [1, 9, 12, 4, 5, 13, 16, 8]}},
{"command": "mesh.element.add", "params": {"label": 7, "kind": "hex8", "nodes": [10, 2, 3, 11, 14, 6, 7, 15]}},
{"command": "model.set.create", "params": {"name": "all", "elements": [1, 2, 3, 4, 5, 6, 7]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "cube", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.set.create", "params": {"name": "corner1", "nodes": [1]}},
{"command": "model.boundary_condition.create", "params": {"name": "u1", "type": "displacement", "target": {"set": "corner1"}, "values": [0.0, 0.0, 0.0, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner2", "nodes": [2]}},
{"command": "model.boundary_condition.create", "params": {"name": "u2", "type": "displacement", "target": {"set": "corner2"}, "values": [0.001, 0.0005, 0.0005, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner3", "nodes": [3]}},
{"command": "model.boundary_condition.create", "params": {"name": "u3", "type": "displacement", "target": {"set": "corner3"}, "values": [0.0015, 0.0015, 0.001, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner4", "nodes": [4]}},
{"command": "model.boundary_condition.create", "params": {"name": "u4", "type": "displacement", "target": {"set": "corner4"}, "values": [0.0005, 0.001, 0.0005, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner5", "nodes": [5]}},
{"command": "model.boundary_condition.create", "params": {"name": "u5", "type": "displacement", "target": {"set": "corner5"}, "values": [0.0005, 0.0005, 0.001, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner6", "nodes": [6]}},
{"command": "model.boundary_condition.create", "params": {"name": "u6", "type": "displacement", "target": {"set": "corner6"}, "values": [0.0015, 0.001, 0.0015, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner7", "nodes": [7]}},
{"command": "model.boundary_condition.create", "params": {"name": "u7", "type": "displacement", "target": {"set": "corner7"}, "values": [0.002, 0.002, 0.002, null, null, null]}},
{"command": "model.set.create", "params": {"name": "corner8", "nodes": [8]}},
{"command": "model.boundary_condition.create", "params": {"name": "u8", "type": "displacement", "target": {"set": "corner8"}, "values": [0.001, 0.0015, 0.0015, null, null, null]}},
{"command": "model.step.create", "params": {"name": "Patch", "procedure": {"type": "static"}, "boundary_conditions": ["u1", "u2", "u3", "u4", "u5", "u6", "u7", "u8"], "loads": []}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,7 @@
# MacNeal–Harder straight cantilever, regular hex8 mesh with incompatible modes
Our model of the published problem: a beam 6.0 long, 0.2 wide, 0.1 deep (E = 10⁷, ν = 0.3) of the
prescribed 6 × 1 regular elements, here hex8 with incompatible modes, clamped at one end; unit
forces at the free end along the beam, across its width and across its depth (spread over the end
face by area), and a unit twisting moment through a distributing coupling, each a separate step.
Displacements are read at a corner of the free end.
@@ -0,0 +1,92 @@
{
"title": "MacNeal–Harder straight cantilever, regular hex8 mesh with incompatible modes",
"kind": "benchmark",
"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",
"quantities": [
{
"id": "extension",
"quantity": "tip displacement along the load, extension",
"measure": {
"command": "solve.probe",
"params": {
"step": "Extension",
"at": [
[
6.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 3e-05,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)"
},
{
"id": "in_plane",
"quantity": "tip displacement along the load, in-plane shear (width 0.2)",
"measure": {
"command": "solve.probe",
"params": {
"step": "In_plane",
"at": [
[
6.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.1081,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)",
"known_failure": "0.978 of the theory, grade B: one hex8 with incompatible modes through the depth of the prescribed mesh (MacNeal–Harder's HEXA(8): 0.981, Table 8(a) p. 15); refined meshes converge (cantilever-hex8-incompatible)"
},
{
"id": "out_of_plane",
"quantity": "tip displacement along the load, out-of-plane shear (depth 0.1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Out_of_plane",
"at": [
[
6.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.4321,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)",
"known_failure": "0.973 of the theory, grade B, as for in-plane shear (MacNeal–Harder's HEXA(8): 0.981)"
},
{
"id": "twist",
"quantity": "tip rotation under a unit twisting moment",
"measure": {
"from": "twist",
"pointer": "/reference_points/0/displacement/3"
},
"value": 0.03208,
"tolerance": {
"relative": 0.02
},
"reason": "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",
"known_failure": "0.892 of the theory, grade C: one element across the section cannot represent the torsion warping (MacNeal–Harder's HEXA(8): 0.910, HEX20: 0.904)"
}
]
}
@@ -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": {
"extension": {
"band": 3.0000000000000005e-14,
"value": 0.00002962884635719957
}
}
}
@@ -0,0 +1,23 @@
[
{"command": "mesh.block", "params": {"body": "Beam", "kind": "hex8", "corners": [[0, 0, 0], [6.0, 0, 0], [6.0, 0.2, 0], [0, 0.2, 0], [0, 0, 0.1], [6.0, 0, 0.1], [6.0, 0.2, 0.1], [0, 0.2, 0.1]], "divisions": [6, 1, 1], "faces": {"6": "root", "4": "tip"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Beam"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Beam", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "tip", "geometry": [{"body": "Beam", "face": "tip"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 10000000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "beam", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "clamp", "type": "fixed", "target": {"set": "root"}}},
{"command": "model.reference_point.create", "params": {"name": "RP", "xyz": [6.0, 0.1, 0.05]}},
{"command": "model.coupling.create", "params": {"name": "end", "reference_point": "RP", "set": "tip", "kind": "distributing"}},
{"command": "model.load.create", "params": {"name": "extension", "type": "force", "target": {"set": "tip"}, "vector": [1, 0, 0]}},
{"command": "model.load.create", "params": {"name": "in_plane", "type": "force", "target": {"set": "tip"}, "vector": [0, 1, 0]}},
{"command": "model.load.create", "params": {"name": "out_of_plane", "type": "force", "target": {"set": "tip"}, "vector": [0, 0, 1]}},
{"command": "model.load.create", "params": {"name": "twist", "type": "moment", "target": {"reference_point": "RP"}, "vector": [1, 0, 0]}},
{"command": "model.step.create", "params": {"name": "Extension", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["extension"]}},
{"command": "model.step.create", "params": {"name": "In_plane", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["in_plane"]}},
{"command": "model.step.create", "params": {"name": "Out_of_plane", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["out_of_plane"]}},
{"command": "model.step.create", "params": {"name": "Twist", "procedure": {"type": "static"}, "boundary_conditions": ["clamp"], "loads": ["twist"]}},
{"command": "solve.static", "params": {"step": "Extension"}, "id": "extension"},
{"command": "solve.static", "params": {"step": "In_plane"}, "id": "in_plane"},
{"command": "solve.static", "params": {"step": "Out_of_plane"}, "id": "out_of_plane"},
{"command": "solve.static", "params": {"step": "Twist"}, "id": "twist"}
]
+7
View File
@@ -0,0 +1,7 @@
# MacNeal–Harder thick-walled cylinder, nearly incompressible (hex8 with incompatible modes)
Our model of the published problem: inner radius 3, outer 9, thickness 1, E = 1000, plane strain,
unit internal pressure, ν = 0.49, 0.499 and 0.4999 (three separate bodies in one model, solved
together). The radial element boundaries are those of Fig. 10 (3.0, 3.5, 4.2, 5.2, 6.75, 9.0);
we model a quarter with symmetry planes (nine 10° elements around) instead of one 10° slice,
which needs no skew support and is the same axisymmetric problem.
@@ -0,0 +1,76 @@
{
"title": "MacNeal–Harder thick-walled cylinder, nearly incompressible (hex8 with incompatible modes)",
"kind": "benchmark",
"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",
"quantities": [
{
"id": "ur_1",
"quantity": "radial displacement at the inner radius, ν = 0.49",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
3.0,
0,
0.0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.0050399,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)"
},
{
"id": "ur_2",
"quantity": "radial displacement at the inner radius, ν = 0.499",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
3.0,
0,
2.0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.0050602,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)"
},
{
"id": "ur_3",
"quantity": "radial displacement at the inner radius, ν = 0.4999",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pressure",
"at": [
[
3.0,
0,
4.0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.0050623,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14)"
}
]
}
@@ -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": {
"ur_1": {
"band": 5.0399e-12,
"value": 0.0049705467068696585
},
"ur_2": {
"band": 5.0602000000000006e-12,
"value": 0.004989212096414709
},
"ur_3": {
"band": 5.0622999999999995e-12,
"value": 0.004991068698509793
}
}
}
@@ -0,0 +1,58 @@
[
{"command": "mesh.block", "params": {"body": "Cylinder1", "kind": "hex8", "corners": [[3.0, 0, 0.0], [3.5, 0, 0.0], [0, 3.5, 0.0], [0, 3.0, 0.0], [3.0, 0, 1.0], [3.5, 0, 1.0], [0, 3.5, 1.0], [0, 3.0, 1.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1", "6": "bore"}}},
{"command": "mesh.block", "params": {"body": "Cylinder1", "kind": "hex8", "corners": [[3.5, 0, 0.0], [4.2, 0, 0.0], [0, 4.2, 0.0], [0, 3.5, 0.0], [3.5, 0, 1.0], [4.2, 0, 1.0], [0, 4.2, 1.0], [0, 3.5, 1.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder1", "kind": "hex8", "corners": [[4.2, 0, 0.0], [5.2, 0, 0.0], [0, 5.2, 0.0], [0, 4.2, 0.0], [4.2, 0, 1.0], [5.2, 0, 1.0], [0, 5.2, 1.0], [0, 4.2, 1.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder1", "kind": "hex8", "corners": [[5.2, 0, 0.0], [6.75, 0, 0.0], [0, 6.75, 0.0], [0, 5.2, 0.0], [5.2, 0, 1.0], [6.75, 0, 1.0], [0, 6.75, 1.0], [0, 5.2, 1.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder1", "kind": "hex8", "corners": [[6.75, 0, 0.0], [9.0, 0, 0.0], [0, 9.0, 0.0], [0, 6.75, 0.0], [6.75, 0, 1.0], [9.0, 0, 1.0], [0, 9.0, 1.0], [0, 6.75, 1.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 0.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 1.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 1.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "model.set.create", "params": {"name": "all1", "geometry": [{"body": "Cylinder1"}]}},
{"command": "model.set.create", "params": {"name": "x01", "geometry": [{"body": "Cylinder1", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y01", "geometry": [{"body": "Cylinder1", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z01", "geometry": [{"body": "Cylinder1", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z11", "geometry": [{"body": "Cylinder1", "face": "z1"}]}},
{"command": "model.set.create", "params": {"name": "bore1", "geometry": [{"body": "Cylinder1", "face": "bore"}]}},
{"command": "model.material.create", "params": {"name": "Mat1", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.49}}},
{"command": "model.section.create", "params": {"name": "s1", "set": "all1", "material": "Mat1", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx1", "type": "symmetry", "target": {"set": "x01"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy1", "type": "symmetry", "target": {"set": "y01"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sza1", "type": "symmetry", "target": {"set": "z01"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "szb1", "type": "symmetry", "target": {"set": "z11"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "p1", "type": "pressure", "set": "bore1", "magnitude": 1.0}},
{"command": "mesh.block", "params": {"body": "Cylinder2", "kind": "hex8", "corners": [[3.0, 0, 2.0], [3.5, 0, 2.0], [0, 3.5, 2.0], [0, 3.0, 2.0], [3.0, 0, 3.0], [3.5, 0, 3.0], [0, 3.5, 3.0], [0, 3.0, 3.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 2.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 2.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 3.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 3.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1", "6": "bore"}}},
{"command": "mesh.block", "params": {"body": "Cylinder2", "kind": "hex8", "corners": [[3.5, 0, 2.0], [4.2, 0, 2.0], [0, 4.2, 2.0], [0, 3.5, 2.0], [3.5, 0, 3.0], [4.2, 0, 3.0], [0, 4.2, 3.0], [0, 3.5, 3.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 2.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 2.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 3.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 3.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder2", "kind": "hex8", "corners": [[4.2, 0, 2.0], [5.2, 0, 2.0], [0, 5.2, 2.0], [0, 4.2, 2.0], [4.2, 0, 3.0], [5.2, 0, 3.0], [0, 5.2, 3.0], [0, 4.2, 3.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 2.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 2.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 3.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 3.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder2", "kind": "hex8", "corners": [[5.2, 0, 2.0], [6.75, 0, 2.0], [0, 6.75, 2.0], [0, 5.2, 2.0], [5.2, 0, 3.0], [6.75, 0, 3.0], [0, 6.75, 3.0], [0, 5.2, 3.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 2.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 2.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 3.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 3.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder2", "kind": "hex8", "corners": [[6.75, 0, 2.0], [9.0, 0, 2.0], [0, 9.0, 2.0], [0, 6.75, 2.0], [6.75, 0, 3.0], [9.0, 0, 3.0], [0, 9.0, 3.0], [0, 6.75, 3.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 2.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 2.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 3.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 3.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "model.set.create", "params": {"name": "all2", "geometry": [{"body": "Cylinder2"}]}},
{"command": "model.set.create", "params": {"name": "x02", "geometry": [{"body": "Cylinder2", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y02", "geometry": [{"body": "Cylinder2", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z02", "geometry": [{"body": "Cylinder2", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z12", "geometry": [{"body": "Cylinder2", "face": "z1"}]}},
{"command": "model.set.create", "params": {"name": "bore2", "geometry": [{"body": "Cylinder2", "face": "bore"}]}},
{"command": "model.material.create", "params": {"name": "Mat2", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.499}}},
{"command": "model.section.create", "params": {"name": "s2", "set": "all2", "material": "Mat2", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx2", "type": "symmetry", "target": {"set": "x02"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy2", "type": "symmetry", "target": {"set": "y02"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sza2", "type": "symmetry", "target": {"set": "z02"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "szb2", "type": "symmetry", "target": {"set": "z12"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "p2", "type": "pressure", "set": "bore2", "magnitude": 1.0}},
{"command": "mesh.block", "params": {"body": "Cylinder3", "kind": "hex8", "corners": [[3.0, 0, 4.0], [3.5, 0, 4.0], [0, 3.5, 4.0], [0, 3.0, 4.0], [3.0, 0, 5.0], [3.5, 0, 5.0], [0, 3.5, 5.0], [0, 3.0, 5.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 4.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 4.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 5.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 5.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1", "6": "bore"}}},
{"command": "mesh.block", "params": {"body": "Cylinder3", "kind": "hex8", "corners": [[3.5, 0, 4.0], [4.2, 0, 4.0], [0, 4.2, 4.0], [0, 3.5, 4.0], [3.5, 0, 5.0], [4.2, 0, 5.0], [0, 4.2, 5.0], [0, 3.5, 5.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 4.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 4.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 5.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 5.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder3", "kind": "hex8", "corners": [[4.2, 0, 4.0], [5.2, 0, 4.0], [0, 5.2, 4.0], [0, 4.2, 4.0], [4.2, 0, 5.0], [5.2, 0, 5.0], [0, 5.2, 5.0], [0, 4.2, 5.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 4.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 4.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 5.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 5.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder3", "kind": "hex8", "corners": [[5.2, 0, 4.0], [6.75, 0, 4.0], [0, 6.75, 4.0], [0, 5.2, 4.0], [5.2, 0, 5.0], [6.75, 0, 5.0], [0, 6.75, 5.0], [0, 5.2, 5.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 4.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 4.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 5.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 5.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cylinder3", "kind": "hex8", "corners": [[6.75, 0, 4.0], [9.0, 0, 4.0], [0, 9.0, 4.0], [0, 6.75, 4.0], [6.75, 0, 5.0], [9.0, 0, 5.0], [0, 9.0, 5.0], [0, 6.75, 5.0]], "divisions": [1, 9, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 4.0]}}, {"corners": [2, 3], "arc": {"center": [0, 0, 4.0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 5.0]}}, {"corners": [6, 7], "arc": {"center": [0, 0, 5.0]}}], "faces": {"3": "y0", "5": "x0", "1": "z0", "2": "z1"}}},
{"command": "model.set.create", "params": {"name": "all3", "geometry": [{"body": "Cylinder3"}]}},
{"command": "model.set.create", "params": {"name": "x03", "geometry": [{"body": "Cylinder3", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y03", "geometry": [{"body": "Cylinder3", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z03", "geometry": [{"body": "Cylinder3", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z13", "geometry": [{"body": "Cylinder3", "face": "z1"}]}},
{"command": "model.set.create", "params": {"name": "bore3", "geometry": [{"body": "Cylinder3", "face": "bore"}]}},
{"command": "model.material.create", "params": {"name": "Mat3", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.4999}}},
{"command": "model.section.create", "params": {"name": "s3", "set": "all3", "material": "Mat3", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx3", "type": "symmetry", "target": {"set": "x03"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy3", "type": "symmetry", "target": {"set": "y03"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sza3", "type": "symmetry", "target": {"set": "z03"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "szb3", "type": "symmetry", "target": {"set": "z13"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "p3", "type": "pressure", "set": "bore3", "magnitude": 1.0}},
{"command": "model.step.create", "params": {"name": "Pressure", "procedure": {"type": "static"}, "boundary_conditions": ["sx1", "sy1", "sza1", "szb1", "sx2", "sy2", "sza2", "szb2", "sx3", "sy3", "sza3", "szb3"], "loads": ["p1", "p2", "p3"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+3
View File
@@ -0,0 +1,3 @@
# MacNeal–Harder twisted beam
Length 12, width 1.1, depth 0.32, twisted 90° root to tip, E = 29 × 10⁶, ν = 0.22, mesh 12 × 2, unit tip forces.
@@ -0,0 +1,19 @@
{
"title": "MacNeal–Harder twisted beam",
"kind": "benchmark",
"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. 6 (p. 8), Table 3 (p. 10)",
"status": "pending",
"requires": "shell elements (M8) or mapped blocks with helical edges",
"quantities": [
{
"id": "in_plane",
"quantity": "tip displacement along the in-plane load",
"value": 0.005424
},
{
"id": "out_of_plane",
"quantity": "tip displacement along the out-of-plane load",
"value": 0.001754
}
]
}
+6
View File
@@ -0,0 +1,6 @@
# NAFEMS FV32 cantilevered tapered membrane, free vibration (hex20 plane stress layer)
Our model of the published problem: a membrane 10 m long tapering symmetrically from 5 m at the
clamped edge to 1 m at the free end, 0.05 m thick, E = 200 GPa, ν = 0.3, ρ = 8000 kg/m³;
u_x = u_y = 0 on the root. In-plane (plane stress) vibration is modelled by half the thickness of
hex20 elements (16 × 8 × 1) with u_z = 0 on the mid-surface and the other face free.
+85
View File
@@ -0,0 +1,85 @@
{
"title": "NAFEMS FV32 cantilevered tapered membrane, free vibration (hex20 plane stress layer)",
"kind": "benchmark",
"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'",
"quantities": [
{
"id": "f1",
"quantity": "frequency of mode 1 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/0/frequency"
},
"value": 44.623,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
},
{
"id": "f2",
"quantity": "frequency of mode 2 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/1/frequency"
},
"value": 130.03,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
},
{
"id": "f3",
"quantity": "frequency of mode 3 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/2/frequency"
},
"value": 162.7,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
},
{
"id": "f4",
"quantity": "frequency of mode 4 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/3/frequency"
},
"value": 246.05,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
},
{
"id": "f5",
"quantity": "frequency of mode 5 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/4/frequency"
},
"value": 379.9,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
},
{
"id": "f6",
"quantity": "frequency of mode 6 (Hz)",
"measure": {
"from": "modes",
"pointer": "/modes/5/frequency"
},
"value": 391.44,
"tolerance": {
"relative": 0.01
},
"reason": "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%"
}
]
}
+29
View File
@@ -0,0 +1,29 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"f1": {
"band": 4.4623e-8,
"value": 44.62290209745542
},
"f2": {
"band": 1.3003463312585388e-7,
"value": 130.03463312585387
},
"f3": {
"band": 1.627e-7,
"value": 162.69825051149476
},
"f4": {
"band": 2.460539171824971e-7,
"value": 246.0539171824971
},
"f5": {
"band": 3.7990069011853704e-7,
"value": 379.900690118537
},
"f6": {
"band": 3.9144e-7,
"value": 391.4352970715355
}
}
}
+12
View File
@@ -0,0 +1,12 @@
[
{"command": "mesh.block", "params": {"body": "Membrane", "kind": "hex20", "corners": [[0, 0, 0], [10, 2, 0], [10, 3, 0], [0, 5, 0], [0, 0, 0.025], [10, 2, 0.025], [10, 3, 0.025], [0, 5, 0.025]], "divisions": [16, 8, 1], "faces": {"6": "root", "1": "mid"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Membrane"}]}},
{"command": "model.set.create", "params": {"name": "root", "geometry": [{"body": "Membrane", "face": "root"}]}},
{"command": "model.set.create", "params": {"name": "mid", "geometry": [{"body": "Membrane", "face": "mid"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 200000000000.0, "poisson": 0.3}, "density": 8000.0}},
{"command": "model.section.create", "params": {"name": "membrane", "set": "all", "material": "Steel", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "root", "type": "displacement", "target": {"set": "root"}, "values": [0, 0, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "mid", "type": "symmetry", "target": {"set": "mid"}, "plane": "z"}},
{"command": "model.step.create", "params": {"name": "Modes", "procedure": {"type": "frequency", "modes": 6}, "boundary_conditions": ["root", "mid"], "loads": []}},
{"command": "solve.frequency", "params": {"step": "Modes"}, "id": "modes"}
]
@@ -0,0 +1,3 @@
# NAFEMS LE1 elliptic membrane with 2D plane stress elements
The membrane of `nafems-le1` meshed with plane stress quadrilaterals.
@@ -0,0 +1,14 @@
{
"title": "NAFEMS LE1 elliptic membrane with 2D plane stress elements",
"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)",
"quantities": [
{
"id": "syy_D",
"quantity": "σ_yy at D (2, 0)",
"value": 92.7
}
]
}
+8
View File
@@ -0,0 +1,8 @@
# NAFEMS LE1 elliptic membrane (hex20 plane stress layer)
Our model of the published problem: the quarter membrane between the ellipses (x/2)² + y² = 1 and
(x/3.25)² + (y/2.75)² = 1, thickness 0.1, E = 210 GPa, ν = 0.3 (MPa and m), u_x = 0 on AB (x = 0),
u_y = 0 on CD (y = 0), an outward pressure of 10 MPa on the outer edge BC. Plane stress is
modelled by half the thickness of hex20 elements with a symmetry plane at the mid-surface and the
other face free: 24 × 48 elements graded 4 : 1 towards the hole, converged at D (32 × 64 with
the same grading changes σ_yy there by 0.003%).
+30
View File
@@ -0,0 +1,30 @@
{
"title": "NAFEMS LE1 elliptic membrane (hex20 plane stress layer)",
"kind": "benchmark",
"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)",
"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; plane stress modelled by a thin solid layer and the stress extrapolated to the edge add a few tenths of a percent"
}
]
}
+9
View File
@@ -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.286850287265874e-8,
"value": 92.86850287265874
}
}
}
+16
View File
@@ -0,0 +1,16 @@
[
{"command": "mesh.block", "params": {"body": "Membrane", "kind": "hex20", "corners": [[2, 0, 0], [3.25, 0, 0], [0, 2.75, 0], [0, 1, 0], [2, 0, 0.05], [3.25, 0, 0.05], [0, 2.75, 0.05], [0, 1, 0.05]], "divisions": [24, 48, 1], "bias": [4, 1, 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]]}}, {"corners": [5, 8], "ellipse": {"center": [0, 0, 0.05], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [6, 7], "ellipse": {"center": [0, 0, 0.05], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}}], "faces": {"5": "AB", "3": "CD", "4": "BC", "1": "mid"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Membrane"}]}},
{"command": "model.set.create", "params": {"name": "AB", "geometry": [{"body": "Membrane", "face": "AB"}]}},
{"command": "model.set.create", "params": {"name": "CD", "geometry": [{"body": "Membrane", "face": "CD"}]}},
{"command": "model.set.create", "params": {"name": "BC", "geometry": [{"body": "Membrane", "face": "BC"}]}},
{"command": "model.set.create", "params": {"name": "mid", "geometry": [{"body": "Membrane", "face": "mid"}]}},
{"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": "solid"}}},
{"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.boundary_condition.create", "params": {"name": "mid", "type": "symmetry", "target": {"set": "mid"}, "plane": "z"}},
{"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", "mid"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+6
View File
@@ -0,0 +1,6 @@
# NAFEMS LE10 thick plate under pressure (hex20)
Our model of the published problem: the elliptic plate of LE1 (inner (x/2)² + y² = 1, outer
(x/3.25)² + (y/2.75)² = 1), 0.6 thick, E = 210 GPa, ν = 0.3, 1 MPa pressure on the upper face;
u_y = 0 on y = 0, u_x = 0 on x = 0, u_x = u_y = 0 on the outer curved face, u_z = 0 on the line
where the outer face meets the mid-surface. Two layers of hex20 blocks (8 × 16 × 3 each).
+30
View File
@@ -0,0 +1,30 @@
{
"title": "NAFEMS LE10 thick plate under pressure (hex20)",
"kind": "benchmark",
"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'",
"quantities": [
{
"id": "syy_D",
"quantity": "σ_yy at D (2, 0, 0.3) on the loaded face",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
2,
0,
0.3
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": -5.38,
"tolerance": {
"relative": 0.02
},
"reason": "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)"
}
]
}
+9
View File
@@ -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": 5.38e-9,
"value": -5.333890516372018
}
}
}
+19
View File
@@ -0,0 +1,19 @@
[
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[2, 0, -0.3], [3.25, 0, -0.3], [0, 2.75, -0.3], [0, 1, -0.3], [2, 0, 0.0], [3.25, 0, 0.0], [0, 2.75, 0.0], [0, 1, 0.0]], "divisions": [8, 16, 3], "edges": [{"corners": [1, 4], "ellipse": {"center": [0, 0, -0.3], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [2, 3], "ellipse": {"center": [0, 0, -0.3], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}}, {"corners": [5, 8], "ellipse": {"center": [0, 0, 0.0], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [6, 7], "ellipse": {"center": [0, 0, 0.0], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}, "name": "EE"}], "faces": {"5": "AB", "3": "CD", "4": "BC"}}},
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[2, 0, 0.0], [3.25, 0, 0.0], [0, 2.75, 0.0], [0, 1, 0.0], [2, 0, 0.3], [3.25, 0, 0.3], [0, 2.75, 0.3], [0, 1, 0.3]], "divisions": [8, 16, 3], "edges": [{"corners": [1, 4], "ellipse": {"center": [0, 0, 0.0], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [2, 3], "ellipse": {"center": [0, 0, 0.0], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}}, {"corners": [5, 8], "ellipse": {"center": [0, 0, 0.3], "axes": [[2, 0, 0], [0, 1, 0]]}}, {"corners": [6, 7], "ellipse": {"center": [0, 0, 0.3], "axes": [[3.25, 0, 0], [0, 2.75, 0]]}}], "faces": {"5": "AB", "3": "CD", "4": "BC", "2": "top"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Plate"}]}},
{"command": "model.set.create", "params": {"name": "AB", "geometry": [{"body": "Plate", "face": "AB"}]}},
{"command": "model.set.create", "params": {"name": "CD", "geometry": [{"body": "Plate", "face": "CD"}]}},
{"command": "model.set.create", "params": {"name": "BC", "geometry": [{"body": "Plate", "face": "BC"}]}},
{"command": "model.set.create", "params": {"name": "top", "geometry": [{"body": "Plate", "face": "top"}]}},
{"command": "model.set.create", "params": {"name": "EE", "geometry": [{"body": "Plate", "edge": "EE"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 210000.0, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "plate", "set": "all", "material": "Steel", "kind": {"type": "solid"}}},
{"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.boundary_condition.create", "params": {"name": "bc", "type": "displacement", "target": {"set": "BC"}, "values": [0, 0, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "ee", "type": "displacement", "target": {"set": "EE"}, "values": [null, null, 0, null, null, null]}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "top", "magnitude": 1.0}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["ab", "cd", "bc", "ee"], "loads": ["p"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+3
View File
@@ -0,0 +1,3 @@
# NAFEMS LE11 solid cylinder/taper/sphere under a temperature field
Thermal expansion under a linear temperature field; needs temperature loads.
+14
View File
@@ -0,0 +1,14 @@
{
"title": "NAFEMS LE11 solid cylinder/taper/sphere under a temperature field",
"kind": "benchmark",
"source": "NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE11 (target σ_zz = −105 MPa at A)",
"status": "pending",
"requires": "thermal loads (M8 heat transfer)",
"quantities": [
{
"id": "szz_A",
"quantity": "σ_zz at A",
"value": -105.0
}
]
}
@@ -0,0 +1,8 @@
# Constant-stress patch test, hex20-reduced
A unit cube of eight hex20-reduced cells whose shared points are moved off the regular grid (every
face, edge and centre point; the corners stay), so every element is distorted (one mesh.block per cell). Symmetry on the
faces x = 0, y = 0 and z = 0; tractions 1, 2 and 3 on the faces x = 1, y = 1 and z = 1
(E = 1000, ν = 0.25). The exact solution is the uniform stress diag(1, 2, 3) with strains
ε_i = (σ_i − ν(σ_j + σ_k))/E, which every conforming element of a convergent formulation
reproduces exactly on any mesh.
@@ -0,0 +1,168 @@
{
"title": "Constant-stress patch test, hex20-reduced",
"kind": "theory",
"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",
"quantities": [
{
"id": "ux",
"quantity": "u_x at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": -0.00025,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uy",
"quantity": "u_y at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.001,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uz",
"quantity": "u_z at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.00225,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxx",
"quantity": "σ_xx at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "syy",
"quantity": "σ_yy at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 2.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "szz",
"quantity": "σ_zz at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 3.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxy",
"quantity": "σ_xy at the inner node",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/3"
},
"value": 0.0,
"tolerance": {
"absolute": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)"
}
]
}
@@ -0,0 +1,33 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"sxx": {
"band": 1.0000000000000003e-9,
"value": 1.0000000000000002
},
"sxy": {
"band": 1.000000000000374e-12,
"value": -3.738573156315291e-16
},
"syy": {
"band": 2.0000000000000026e-9,
"value": 2.0000000000000027
},
"szz": {
"band": 3.000000000000002e-9,
"value": 3.0000000000000018
},
"ux": {
"band": 2.5000000000000005e-13,
"value": -0.0002499999999999936
},
"uy": {
"band": 1.0000000000000002e-12,
"value": 0.0009999999999999957
},
"uz": {
"band": 2.25e-12,
"value": 0.0022499999999999964
}
}
}
@@ -0,0 +1,27 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.0, 0.0], [0.46, 0.0, 0.0], [0.55, 0.47, 0.0], [0.0, 0.46, 0.0], [0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.46, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.55, 0.0], [0.55, 0.47, 0.0], [0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.46, 0.0], [0.55, 0.47, 0.0], [0.56, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.55, 0.47, 0.0], [1.0, 0.55, 0.0], [1.0, 1.0, 0.0], [0.56, 1.0, 0.0], [0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54], [0.0, 0.0, 1.0], [0.55, 0.0, 1.0], [0.56, 0.46, 1.0], [0.0, 0.55, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53], [0.55, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 0.47, 1.0], [0.56, 0.46, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45], [0.0, 0.55, 1.0], [0.56, 0.46, 1.0], [0.46, 1.0, 1.0], [0.0, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54], [0.56, 0.46, 1.0], [1.0, 0.47, 1.0], [1.0, 1.0, 1.0], [0.46, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "2": "z1"}}},
{"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": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Cube", "face": "z1"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "solid", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"integration": "reduced"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_x", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_y", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_z", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "tx", "type": "traction", "set": "x1", "vector": [1.0, 0, 0]}},
{"command": "model.load.create", "params": {"name": "ty", "type": "traction", "set": "y1", "vector": [0, 2.0, 0]}},
{"command": "model.load.create", "params": {"name": "tz", "type": "traction", "set": "z1", "vector": [0, 0, 3.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["sym_x", "sym_y", "sym_z"], "loads": ["tx", "ty", "tz"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+8
View File
@@ -0,0 +1,8 @@
# Constant-stress patch test, hex20
A unit cube of eight hex20 cells whose shared points are moved off the regular grid (every
face, edge and centre point; the corners stay), so every element is distorted (one mesh.block per cell). Symmetry on the
faces x = 0, y = 0 and z = 0; tractions 1, 2 and 3 on the faces x = 1, y = 1 and z = 1
(E = 1000, ν = 0.25). The exact solution is the uniform stress diag(1, 2, 3) with strains
ε_i = (σ_i − ν(σ_j + σ_k))/E, which every conforming element of a convergent formulation
reproduces exactly on any mesh.
+168
View File
@@ -0,0 +1,168 @@
{
"title": "Constant-stress patch test, hex20",
"kind": "theory",
"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",
"quantities": [
{
"id": "ux",
"quantity": "u_x at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": -0.00025,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uy",
"quantity": "u_y at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.001,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uz",
"quantity": "u_z at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.00225,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxx",
"quantity": "σ_xx at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "syy",
"quantity": "σ_yy at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 2.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "szz",
"quantity": "σ_zz at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 3.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxy",
"quantity": "σ_xy at the inner node",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/3"
},
"value": 0.0,
"tolerance": {
"absolute": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)"
}
]
}
+33
View File
@@ -0,0 +1,33 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"sxx": {
"band": 1.0000000000000034e-9,
"value": 1.0000000000000033
},
"sxy": {
"band": 1.0000000000005828e-12,
"value": 5.826462044860843e-16
},
"syy": {
"band": 2.0000000000000026e-9,
"value": 2.0000000000000027
},
"szz": {
"band": 3.0000000000000025e-9,
"value": 3.000000000000002
},
"ux": {
"band": 2.500000000000003e-13,
"value": -0.0002500000000000003
},
"uy": {
"band": 1.000000000000001e-12,
"value": 0.0010000000000000009
},
"uz": {
"band": 2.2500000000000027e-12,
"value": 0.0022500000000000024
}
}
}
+27
View File
@@ -0,0 +1,27 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.0, 0.0], [0.46, 0.0, 0.0], [0.55, 0.47, 0.0], [0.0, 0.46, 0.0], [0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.46, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.55, 0.0], [0.55, 0.47, 0.0], [0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.46, 0.0], [0.55, 0.47, 0.0], [0.56, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.55, 0.47, 0.0], [1.0, 0.55, 0.0], [1.0, 1.0, 0.0], [0.56, 1.0, 0.0], [0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54], [0.0, 0.0, 1.0], [0.55, 0.0, 1.0], [0.56, 0.46, 1.0], [0.0, 0.55, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53], [0.55, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 0.47, 1.0], [0.56, 0.46, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45], [0.0, 0.55, 1.0], [0.56, 0.46, 1.0], [0.46, 1.0, 1.0], [0.0, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54], [0.56, 0.46, 1.0], [1.0, 0.47, 1.0], [1.0, 1.0, 1.0], [0.46, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "2": "z1"}}},
{"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": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Cube", "face": "z1"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "solid", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_x", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_y", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_z", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "tx", "type": "traction", "set": "x1", "vector": [1.0, 0, 0]}},
{"command": "model.load.create", "params": {"name": "ty", "type": "traction", "set": "y1", "vector": [0, 2.0, 0]}},
{"command": "model.load.create", "params": {"name": "tz", "type": "traction", "set": "z1", "vector": [0, 0, 3.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["sym_x", "sym_y", "sym_z"], "loads": ["tx", "ty", "tz"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
@@ -0,0 +1,8 @@
# Constant-stress patch test, hex8-incompatible
A unit cube of eight hex8-incompatible cells whose shared points are moved off the regular grid (every
face, edge and centre point; the corners stay), so every element is distorted (one mesh.block per cell). Symmetry on the
faces x = 0, y = 0 and z = 0; tractions 1, 2 and 3 on the faces x = 1, y = 1 and z = 1
(E = 1000, ν = 0.25). The exact solution is the uniform stress diag(1, 2, 3) with strains
ε_i = (σ_i − ν(σ_j + σ_k))/E, which every conforming element of a convergent formulation
reproduces exactly on any mesh.
@@ -0,0 +1,168 @@
{
"title": "Constant-stress patch test, hex8-incompatible",
"kind": "theory",
"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",
"quantities": [
{
"id": "ux",
"quantity": "u_x at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": -0.00025,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uy",
"quantity": "u_y at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.001,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uz",
"quantity": "u_z at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.00225,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxx",
"quantity": "σ_xx at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "syy",
"quantity": "σ_yy at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 2.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "szz",
"quantity": "σ_zz at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 3.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxy",
"quantity": "σ_xy at the inner node",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/3"
},
"value": 0.0,
"tolerance": {
"absolute": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)"
}
]
}
@@ -0,0 +1,33 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"sxx": {
"band": 1.0000000000000005e-9,
"value": 1.0000000000000004
},
"sxy": {
"band": 1.000000000000215e-12,
"value": -2.1490555370965863e-16
},
"syy": {
"band": 2.0000000000000018e-9,
"value": 2.0000000000000018
},
"szz": {
"band": 3.0000000000000025e-9,
"value": 3.000000000000002
},
"ux": {
"band": 2.5000000000000005e-13,
"value": -0.0002499999999999985
},
"uy": {
"band": 1.0000000000000002e-12,
"value": 0.001
},
"uz": {
"band": 2.25e-12,
"value": 0.0022499999999999985
}
}
}
@@ -0,0 +1,27 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.0, 0.0], [0.46, 0.0, 0.0], [0.55, 0.47, 0.0], [0.0, 0.46, 0.0], [0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.46, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.55, 0.0], [0.55, 0.47, 0.0], [0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.46, 0.0], [0.55, 0.47, 0.0], [0.56, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.55, 0.47, 0.0], [1.0, 0.55, 0.0], [1.0, 1.0, 0.0], [0.56, 1.0, 0.0], [0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54], [0.0, 0.0, 1.0], [0.55, 0.0, 1.0], [0.56, 0.46, 1.0], [0.0, 0.55, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53], [0.55, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 0.47, 1.0], [0.56, 0.46, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45], [0.0, 0.55, 1.0], [0.56, 0.46, 1.0], [0.46, 1.0, 1.0], [0.0, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54], [0.56, 0.46, 1.0], [1.0, 0.47, 1.0], [1.0, 1.0, 1.0], [0.46, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "2": "z1"}}},
{"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": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Cube", "face": "z1"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "solid", "set": "all", "material": "Mat", "kind": {"type": "solid"}, "formulation": {"incompatible_modes": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_x", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_y", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_z", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "tx", "type": "traction", "set": "x1", "vector": [1.0, 0, 0]}},
{"command": "model.load.create", "params": {"name": "ty", "type": "traction", "set": "y1", "vector": [0, 2.0, 0]}},
{"command": "model.load.create", "params": {"name": "tz", "type": "traction", "set": "z1", "vector": [0, 0, 3.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["sym_x", "sym_y", "sym_z"], "loads": ["tx", "ty", "tz"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
+8
View File
@@ -0,0 +1,8 @@
# Constant-stress patch test, hex8
A unit cube of eight hex8 cells whose shared points are moved off the regular grid (every
face, edge and centre point; the corners stay), so every element is distorted (one mesh.block per cell). Symmetry on the
faces x = 0, y = 0 and z = 0; tractions 1, 2 and 3 on the faces x = 1, y = 1 and z = 1
(E = 1000, ν = 0.25). The exact solution is the uniform stress diag(1, 2, 3) with strains
ε_i = (σ_i − ν(σ_j + σ_k))/E, which every conforming element of a convergent formulation
reproduces exactly on any mesh.
+168
View File
@@ -0,0 +1,168 @@
{
"title": "Constant-stress patch test, hex8",
"kind": "theory",
"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",
"quantities": [
{
"id": "ux",
"quantity": "u_x at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": -0.00025,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uy",
"quantity": "u_y at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": 0.001,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "uz",
"quantity": "u_z at the corner (1, 1, 1)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": 0.00225,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxx",
"quantity": "σ_xx at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 1.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "syy",
"quantity": "σ_yy at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 2.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "szz",
"quantity": "σ_zz at the inner node (0.46, 0.55, 0.53)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/2"
},
"value": 3.0,
"tolerance": {
"relative": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding"
},
{
"id": "sxy",
"quantity": "σ_xy at the inner node",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0.46,
0.55,
0.53
]
]
},
"pointer": "/nodes/0/stress/3"
},
"value": 0.0,
"tolerance": {
"absolute": 1e-09
},
"reason": "a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)"
}
]
}
+33
View File
@@ -0,0 +1,33 @@
{
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"sxx": {
"band": 1e-9,
"value": 0.9999999999999999
},
"sxy": {
"band": 1.0000000000001601e-12,
"value": -1.5987023023967256e-16
},
"syy": {
"band": 2.000000000000001e-9,
"value": 2.000000000000001
},
"szz": {
"band": 3.0000000000000004e-9,
"value": 2.9999999999999987
},
"ux": {
"band": 2.5000000000000005e-13,
"value": -0.00024999999999999865
},
"uy": {
"band": 1.0000000000000002e-12,
"value": 0.0009999999999999998
},
"uz": {
"band": 2.25e-12,
"value": 0.0022499999999999977
}
}
}
+27
View File
@@ -0,0 +1,27 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.0, 0.0], [0.46, 0.0, 0.0], [0.55, 0.47, 0.0], [0.0, 0.46, 0.0], [0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.46, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.55, 0.0], [0.55, 0.47, 0.0], [0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.46, 0.0], [0.55, 0.47, 0.0], [0.56, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.55, 0.47, 0.0], [1.0, 0.55, 0.0], [1.0, 1.0, 0.0], [0.56, 1.0, 0.0], [0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "1": "z0"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.0, 0.53], [0.56, 0.0, 0.45], [0.46, 0.55, 0.53], [0.0, 0.47, 0.54], [0.0, 0.0, 1.0], [0.55, 0.0, 1.0], [0.56, 0.46, 1.0], [0.0, 0.55, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.56, 0.0, 0.45], [1.0, 0.0, 0.54], [1.0, 0.46, 0.45], [0.46, 0.55, 0.53], [0.55, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 0.47, 1.0], [0.56, 0.46, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "3": "y0", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.0, 0.47, 0.54], [0.46, 0.55, 0.53], [0.55, 1.0, 0.54], [0.0, 1.0, 0.45], [0.0, 0.55, 1.0], [0.56, 0.46, 1.0], [0.46, 1.0, 1.0], [0.0, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"6": "x0", "5": "y1", "2": "z1"}}},
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "corners": [[0.46, 0.55, 0.53], [1.0, 0.46, 0.45], [1.0, 1.0, 0.53], [0.55, 1.0, 0.54], [0.56, 0.46, 1.0], [1.0, 0.47, 1.0], [1.0, 1.0, 1.0], [0.46, 1.0, 1.0]], "divisions": [1, 1, 1], "faces": {"4": "x1", "5": "y1", "2": "z1"}}},
{"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": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Cube", "face": "z1"}]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.25}}},
{"command": "model.section.create", "params": {"name": "solid", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_x", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_y", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sym_z", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "tx", "type": "traction", "set": "x1", "vector": [1.0, 0, 0]}},
{"command": "model.load.create", "params": {"name": "ty", "type": "traction", "set": "y1", "vector": [0, 2.0, 0]}},
{"command": "model.load.create", "params": {"name": "tz", "type": "traction", "set": "z1", "vector": [0, 0, 3.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["sym_x", "sym_y", "sym_z"], "loads": ["tx", "ty", "tz"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]
Loaded 100 of 144 files, more files were not shown because too many files have changed in this diff. Show more