forked from 1b-agent/fieldcraft-upstream
Verification oracle: tests/oracle cases, cargo xtask oracle, fixtures, docs/oracle.md, CI job
The oracle binary (modelcraft-testkit) runs each case's recipe through the command engine, measures its quantities by JSON pointers into step outputs or commands, compares them with the cited references and the frozen fixtures, and writes docs/oracle.md. 20 theory cases (patch tests of every solid element, Timoshenko cantilevers, Lame, Kirsch, beam frequencies, torsion and bending through couplings, explicit waves and impact, CDT invariants), 8 published benchmarks (MacNeal-Harder patch, straight and curved cantilevers, thick cylinder, Scordelis-Lo with solids, NAFEMS LE1, LE10, FV32) and 10 pending cases with citations. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
1 parent
a3cb6d749b
commit
6d9452ad84
144 files changed
+5162
-74
No files matched your search
@@ -0,0 +1,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"}
|
||||
]
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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.
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"commands": [
|
||||
{
|
||||
"command": "solid.cylinder",
|
||||
"params": {
|
||||
"radius": 10.0,
|
||||
"height": 20.0,
|
||||
"body_name": "Cylinder"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
[
|
||||
{"command": "mesh.tet.generate", "params": {"body": "Cylinder", "tolerance": 0.05}, "id": "tet"}
|
||||
]
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
# Plate with a circular hole in tension (Kirsch)
|
||||
|
||||
A quarter of a square plate of half-width 30 with a hole of radius 1 (W = 60a, so the infinite
|
||||
plate's solution applies to a few tenths of a percent), thin (free faces, plane stress), with
|
||||
symmetry on x = 0, y = 0 and the mid-plane, pulled by a traction of 1 on x = 30. Two hex20 blocks
|
||||
around the hole (40 × 16 each), graded 40 : 1 towards it. Kirsch: σ_θ = 3S at the top of
|
||||
the hole, −S at its side.
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"title": "Plate with a circular hole in tension (Kirsch)",
|
||||
"kind": "theory",
|
||||
"source": "Kirsch, Zeitschrift des VDI 42 (1898) 797–807; Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §35",
|
||||
"quantities": [
|
||||
{
|
||||
"id": "kt",
|
||||
"quantity": "σ_xx at the top of the hole (0, 1, 0) over the remote stress",
|
||||
"measure": {
|
||||
"command": "solve.probe",
|
||||
"params": {
|
||||
"step": "Tension",
|
||||
"at": [
|
||||
[
|
||||
0,
|
||||
1.0,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"pointer": "/nodes/0/stress/0"
|
||||
},
|
||||
"value": 3.0,
|
||||
"tolerance": {
|
||||
"relative": 0.02
|
||||
},
|
||||
"reason": "the reference is the infinite plate; the finite plate (W = 60a, Heywood's width correction about +0.1%, and the loaded ends 30a away) raises the peak by a few tenths of a percent, and the stress extrapolated to the hole surface adds up to about 1%"
|
||||
},
|
||||
{
|
||||
"id": "side",
|
||||
"quantity": "σ_yy at the side of the hole (1, 0, 0) over the remote stress",
|
||||
"measure": {
|
||||
"command": "solve.probe",
|
||||
"params": {
|
||||
"step": "Tension",
|
||||
"at": [
|
||||
[
|
||||
1.0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
]
|
||||
},
|
||||
"pointer": "/nodes/0/stress/1"
|
||||
},
|
||||
"value": -1.0,
|
||||
"tolerance": {
|
||||
"relative": 0.03
|
||||
},
|
||||
"reason": "infinite-plate value −S; finite width and extrapolation as for Kt, on a smaller value"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"note": "ModelCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
|
||||
"values": {
|
||||
"kt": {
|
||||
"band": 3.0120654194508524e-9,
|
||||
"value": 3.012065419450852
|
||||
},
|
||||
"side": {
|
||||
"band": 1.0110362570446956e-9,
|
||||
"value": -1.0110362570446956
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[1.0, 0, 0], [30.0, 0, 0], [30.0, 30.0, 0], [0.7071067811865476, 0.7071067811865476, 0], [1.0, 0, 0.1], [30.0, 0, 0.1], [30.0, 30.0, 0.1], [0.7071067811865476, 0.7071067811865476, 0.1]], "divisions": [40, 16, 1], "bias": [40, 1, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 0.1]}}], "faces": {"6": "hole", "3": "y0", "4": "load", "1": "z0"}}},
|
||||
{"command": "mesh.block", "params": {"body": "Plate", "kind": "hex20", "corners": [[0.7071067811865476, 0.7071067811865476, 0], [30.0, 30.0, 0], [0, 30.0, 0], [0, 1.0, 0], [0.7071067811865476, 0.7071067811865476, 0.1], [30.0, 30.0, 0.1], [0, 30.0, 0.1], [0, 1.0, 0.1]], "divisions": [40, 16, 1], "bias": [40, 1, 1], "edges": [{"corners": [1, 4], "arc": {"center": [0, 0, 0]}}, {"corners": [5, 8], "arc": {"center": [0, 0, 0.1]}}], "faces": {"6": "hole", "5": "x0", "1": "z0"}}},
|
||||
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Plate"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Plate", "face": "x0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Plate", "face": "y0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Plate", "face": "z0"}]}},
|
||||
{"command": "model.set.create", "params": {"name": "load", "geometry": [{"body": "Plate", "face": "load"}]}},
|
||||
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 1000.0, "poisson": 0.3}}},
|
||||
{"command": "model.section.create", "params": {"name": "plate", "set": "all", "material": "Mat", "kind": {"type": "solid"}}},
|
||||
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
|
||||
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
|
||||
{"command": "model.boundary_condition.create", "params": {"name": "sz", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
|
||||
{"command": "model.load.create", "params": {"name": "S", "type": "traction", "set": "load", "vector": [1, 0, 0]}},
|
||||
{"command": "model.step.create", "params": {"name": "Tension", "procedure": {"type": "static"}, "boundary_conditions": ["sx", "sy", "sz"], "loads": ["S"]}},
|
||||
{"command": "solve.static", "params": {}, "id": "solve"}
|
||||
]
|
||||
@@ -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²).
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}}
|
||||
]
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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%"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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%).
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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).
|
||||
@@ -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)"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1,3 @@
|
||||
# NAFEMS LE11 solid cylinder/taper/sphere under a temperature field
|
||||
|
||||
Thermal expansion under a linear temperature field; needs temperature loads.
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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.
|
||||
@@ -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)"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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.
|
||||
@@ -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)"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
Reference in new issue
Block a user