verification: hyperelastic and thermal oracle cases and documentation

Five cases against closed forms: a Mooney-Rivlin block in Treloar's
uniaxial, equibiaxial and pure-shear modes and a Yeoh block in uniaxial
tension (the compressible energy's stresses, exact); a stretched
Mooney-Rivlin tube inflated by a follower pressure (Rivlin's incompressible
solution, 0.6 % at nu = 0.4995); free and fully held thermal expansion at a
thermal stretch of 1.2 (exact); a bar held at its ends heated past yield
(exact). docs/fem.md, the literature, ROADMAP (M15, M17), parity and the
oracle page follow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 07:23:06 -04:00
1 parent 3f9e9e30d8
commit d586d84859
25 files changed
+648 -16

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
# A heated bar held at its ends past yield
A steel bar 4 × 1 × 1 of 4 hex8 elements (E = 200000, ν = 0.3, σ_y = 250, H = 2000 isotropic,
α = 1.2·10⁻⁵ from 20 degrees) on symmetry planes at x = 0, y = 0, z = 0 and held at x = 4 (its
axial strain is zero; the lateral faces are free), heated uniformly to 320 by a temperature load
in a nonlinear static step without nonlinear geometry. The mechanical strain is −α ΔT = −0.0036,
2.9 times the yield strain, so the bar yields in compression: σ = −(σ_y + E_t (α ΔT − σ_y/E)) =
−254.653 with E_t = E H/(E + H), and ε_p = (|σ| − σ_y)/H.
+45
View File
@@ -0,0 +1,45 @@
{
"title": "A steel bar held at its ends and heated past yield (small strain)",
"kind": "theory",
"source": "Uniaxial J2 plasticity with linear hardening (Simo and Hughes, Computational Inelasticity, Springer 1998, §2.3) with the additive thermal strain: the bar's total axial strain is held at zero, so its mechanical strain is −α ΔT and σ = −(σ_y + E_t (α ΔT − σ_y/E)) once α ΔT exceeds σ_y/E",
"quantities": [
{
"id": "sigma",
"quantity": "axial stress, ΔT = 300 (α ΔT = 3.6·10⁻³, 2.9 times the yield strain)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Heat",
"elements": [
2
]
},
"pointer": "/elements/0/stress/0/0"
},
"value": -254.65346534653466,
"tolerance": {
"relative": 1e-08
},
"reason": "a homogeneous uniaxial state the elements represent exactly"
},
{
"id": "plastic_strain",
"quantity": "equivalent plastic strain",
"measure": {
"command": "solve.probe",
"params": {
"step": "Heat",
"elements": [
2
]
},
"pointer": "/elements/0/plastic_strain/0"
},
"value": 0.0023267326732673297,
"tolerance": {
"relative": 1e-07
},
"reason": "(|σ| − σ_y)/H, as for the stress"
}
]
}
+13
View File
@@ -0,0 +1,13 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"plastic_strain": {
"band": 2.3267326732675587e-12,
"value": 0.0023267326732675587
},
"sigma": {
"band": 2.5465346534653467e-7,
"value": -254.6534653464418
}
}
}
+17
View File
@@ -0,0 +1,17 @@
[
{"command": "mesh.block", "params": {"body": "Bar", "kind": "hex8", "corners": [[0, 0, 0], [4, 0, 0], [4, 1, 0], [0, 1, 0], [0, 0, 1], [4, 0, 1], [4, 1, 1], [0, 1, 1]], "divisions": [4, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0", "4": "x1"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Bar"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Bar", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Bar", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Bar", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "x1", "geometry": [{"body": "Bar", "face": "x1"}]}},
{"command": "model.material.create", "params": {"name": "Steel", "elastic": {"type": "isotropic", "young": 200000.0, "poisson": 0.3}, "plastic": {"type": "bilinear", "yield_stress": 250.0, "hardening_modulus": 2000.0}, "thermal": {"expansion": 1.2e-05, "reference_temperature": 20.0}}},
{"command": "model.section.create", "params": {"name": "bar", "set": "all", "material": "Steel", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx0", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy0", "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": "sx1", "type": "symmetry", "target": {"set": "x1"}, "plane": "x"}},
{"command": "model.load.create", "params": {"name": "heat", "type": "temperature", "target": {"set": "all"}, "value": 320.0}},
{"command": "model.step.create", "params": {"name": "Heat", "procedure": {"type": "nonlinear_static", "nonlinear_geometry": false}, "boundary_conditions": ["sx0", "sy0", "sz0", "sx1"], "loads": ["heat"]}},
{"command": "solve.nonlinear", "params": {"step": "Heat"}, "id": "solve"}
]
@@ -0,0 +1,14 @@
# Mooney–Rivlin block in Treloar's three modes
One hybrid hex20 unit cube on three symmetry planes, E = 3, ν = 0.49 (μ = 1.006711,
κ = 50), Mooney–Rivlin with C₀₁ = 0.2 (C₁₀ = μ/2 − C₀₁ = 0.303356), in three nonlinear
static steps:
- **Uniaxial**: the face x = 1 pulled to λ = 2, the others free.
- **Equibiaxial**: x = 1 and y = 1 pulled to λ = 1.5, z free.
- **Pure shear**: x = 1 pulled to λ = 2, y = 1 held (λ_y = 1), z free.
The references are the compressible decoupled energy's principal Cauchy stresses
σᵢ = (λᵢ/J) ∂W/∂λᵢ, by differences of W alone, with the free stretch found by bisection so the
free faces carry no stress. The deformation is homogeneous, so the element represents it
exactly.
@@ -0,0 +1,122 @@
{
"title": "Mooney–Rivlin block in uniaxial, equibiaxial and pure-shear tension",
"kind": "theory",
"source": "Treloar's homogeneous modes of rubber testing (L. R. G. Treloar, The Physics of Rubber Elasticity, 3rd ed., Oxford 1975, ch. 10) for the decoupled compressible energy W = C₁₀ (Ī₁ − 3) + C₀₁ (Ī₂ − 3) + κ/2 (J − 1)²: principal Cauchy stresses σᵢ = (λᵢ/J) ∂W/∂λᵢ with the free stretch found so the free faces carry no stress (bisection; E = 3, ν = 0.49, C₀₁ = 0.2, C₁₀ = μ/2 − C₀₁)",
"quantities": [
{
"id": "uniaxial",
"quantity": "axial Cauchy stress, uniaxial stretch λ = 2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Uniaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 2.736633402084229,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
},
{
"id": "uniaxial_lateral",
"quantity": "lateral displacement at (1, 1, 1), uniaxial: l − 1",
"measure": {
"command": "solve.probe",
"params": {
"step": "Uniaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": -0.28647206688129256,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
},
{
"id": "equibiaxial",
"quantity": "in-plane Cauchy stress, equibiaxial stretch λ = 1.5",
"measure": {
"command": "solve.probe",
"params": {
"step": "Equibiaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 2.842734818108988,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
},
{
"id": "shear_xx",
"quantity": "Cauchy stress along the stretch, pure shear λ = 2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Shear",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 3.526124960232999,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
},
{
"id": "shear_yy",
"quantity": "Cauchy stress across, in the held direction, pure shear λ = 2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Shear",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/1"
},
"value": 1.506681177907714,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
}
]
}
@@ -0,0 +1,25 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"equibiaxial": {
"band": 2.8427348183579755e-9,
"value": 2.8427348183579753
},
"shear_xx": {
"band": 3.5261249603786212e-9,
"value": 3.526124960378621
},
"shear_yy": {
"band": 1.5066811779077142e-9,
"value": 1.5066811778673217
},
"uniaxial": {
"band": 2.736633402109491e-9,
"value": 2.736633402109491
},
"uniaxial_lateral": {
"band": 2.8647206688145424e-10,
"value": -0.2864720668814542
}
}
}
@@ -0,0 +1,25 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0", "4": "x1", "5": "y1"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Cube"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Cube", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.material.create", "params": {"name": "Rubber", "elastic": {"type": "isotropic", "young": 3.0, "poisson": 0.49}, "hyperelastic": {"type": "mooney_rivlin", "c01": 0.2}}},
{"command": "model.section.create", "params": {"name": "cube", "set": "all", "material": "Rubber", "kind": {"type": "solid"}, "formulation": {"hybrid": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sz", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "pull_u", "type": "displacement", "target": {"set": "x1"}, "values": [1.0, null, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "pull_e", "type": "displacement", "target": {"set": "x1"}, "values": [0.5, null, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "pull_ey", "type": "displacement", "target": {"set": "y1"}, "values": [null, 0.5, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "pull_s", "type": "displacement", "target": {"set": "x1"}, "values": [1.0, null, null, null, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "hold_y", "type": "displacement", "target": {"set": "y1"}, "values": [null, 0.0, null, null, null, null]}},
{"command": "model.step.create", "params": {"name": "Uniaxial", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz", "pull_u"], "loads": []}},
{"command": "model.step.create", "params": {"name": "Equibiaxial", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz", "pull_e", "pull_ey"], "loads": []}},
{"command": "model.step.create", "params": {"name": "Shear", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz", "pull_s", "hold_y"], "loads": []}},
{"command": "solve.nonlinear", "params": {"step": "Uniaxial"}, "id": "uniaxial"},
{"command": "solve.nonlinear", "params": {"step": "Equibiaxial"}, "id": "equibiaxial"},
{"command": "solve.nonlinear", "params": {"step": "Shear"}, "id": "shear"}
]
@@ -0,0 +1,10 @@
# Inflation of a stretched Mooney–Rivlin tube
The quarter tube of `nl-cylinder-inflation` (A = 10, B = 20, one unit long, 6 × 16 hybrid
hex20), now Mooney–Rivlin (E = 3, ν = 0.4995, so μ = 1.000333; C₀₁ = 0.2, C₁₀ = μ/2 − C₀₁) and
stretched axially by its end face (u_z = 0.5 at z = 1: λ_z = 1.5) while a follower pressure
p = 0.540850 inflates the bore. In plane strain (λ_z = 1) Mooney–Rivlin is neo-Hookean with
μ = 2(C₁₀ + C₀₁), since Ī₁ = Ī₂ there; the axial stretch makes the second invariant's share
count: σ_θ − σ_r = 2(λ_θ² − λ_r²)(C₁₀ + C₀₁ λ_z²). Integrated through the incompressible wall,
r² = a² + (R² − A²)/λ_z, that pressure puts the bore at a = 15 and the outer wall at
b = 20.615528.
@@ -0,0 +1,53 @@
{
"title": "Inflation of a stretched Mooney–Rivlin tube (follower pressure)",
"kind": "theory",
"source": "Finite inflation and extension of an incompressible Mooney–Rivlin tube (R. S. Rivlin, Large elastic deformations of isotropic materials VI, Phil. Trans. R. Soc. A 242:173–195, 1949; R. W. Ogden, Non-Linear Elastic Deformations, Dover 1997, §5.3): at axial stretch λ_z, r² = a² + (R² − A²)/λ_z, σ_θ − σ_r = 2 (λ_θ² − λ_r²)(C₁₀ + C₀₁ λ_z²) with λ_θ = r/R, λ_r = 1/(λ_θ λ_z), integrated through the wall: p = ∫ (σ_θ − σ_r) dr/r (Simpson, 2·10⁵ intervals)",
"quantities": [
{
"id": "ua",
"quantity": "radial displacement of the bore (10, 0, 0) at the pressure that inflates it to a = 15 at λ_z = 1.5",
"measure": {
"command": "solve.probe",
"params": {
"step": "Inflate",
"at": [
[
10.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 5.0,
"tolerance": {
"relative": 0.01
},
"reason": "16 × 6 hybrid hex20 around the quarter; ν = 0.4995 stands in for incompressibility (a volume change of order p/κ ≈ 10⁻³ shifts the radii by about 0.1 %), and the tube is stretched axially by its ends, which a nearly incompressible solid takes with larger pressures than the plane-strain neo-Hookean tube"
},
{
"id": "ub",
"quantity": "radial displacement of the outer wall (20, 0, 0): b − B, a small difference of radii",
"measure": {
"command": "solve.probe",
"params": {
"step": "Inflate",
"at": [
[
20.0,
0,
0
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.6155281280883038,
"tolerance": {
"absolute": 0.04
},
"reason": "0.2 % of the outer radius b = 20.616: the same volume change of order 10⁻³ moves b by about 0.03, which is 4.5 % of b − B; the incompressible kinematics r² = a² + (R² − A²)/λ_z amplify it there"
}
]
}
@@ -0,0 +1,13 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"ua": {
"band": 5.031118164303424e-9,
"value": 5.0311181643034235
},
"ub": {
"band": 0.00004000064339064634,
"value": 0.64339064633861
}
}
}
@@ -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": [6, 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": "Rubber", "elastic": {"type": "isotropic", "young": 3.0, "poisson": 0.4995}, "hyperelastic": {"type": "mooney_rivlin", "c01": 0.2}}},
{"command": "model.section.create", "params": {"name": "pipe", "set": "all", "material": "Rubber", "kind": {"type": "solid"}, "formulation": {"hybrid": true}}},
{"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": "stretch", "type": "displacement", "target": {"set": "z1"}, "values": [null, null, 0.5, null, null, null]}},
{"command": "model.load.create", "params": {"name": "p", "type": "pressure", "set": "bore", "magnitude": 0.5408503415684837}},
{"command": "model.step.create", "params": {"name": "Inflate", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz0", "stretch"], "loads": ["p"]}},
{"command": "solve.nonlinear", "params": {"step": "Inflate"}, "id": "solve"}
]
@@ -0,0 +1,8 @@
# Free and constrained thermal expansion at finite strain
A unit cube of 2 × 2 × 2 hex20, compressible neo-Hookean (E = 10, ν = 0.3) with an expansion
coefficient α = 10⁻³ from 20 degrees, heated to 220 by a temperature load in two nonlinear static
steps: **Free** (three symmetry planes) and **Held** (symmetry planes on all six faces). The
thermal stretch is ϑ = 1 + α ΔT = 1.2. Free, the cube grows to 1.2 along every edge without
stress; held, F = I, the material's mechanical part is F_m = ϑ⁻¹ I and its stress the neo-Hookean
pressure κ (J_m − 1) with J_m = ϑ⁻³: −3.510802.
@@ -0,0 +1,76 @@
{
"title": "Free and fully constrained thermal expansion at finite strain",
"kind": "theory",
"source": "The multiplicative split F = F_m F_θ with F_θ = (1 + α ΔT) I (V. A. Lubarda, Appl. Mech. Rev. 57(2):95–108, 2004): a free body follows F = F_θ stress-free; held on every face, F = I and F_m = ϑ⁻¹ I, so the compressible neo-Hookean material carries the pressure of its volume ratio, σ = κ (ϑ⁻³ − 1)",
"quantities": [
{
"id": "free_u",
"quantity": "displacement of the corner (1, 1, 1) along x, free, α ΔT = 0.2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Free",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/0"
},
"value": 0.2,
"tolerance": {
"relative": 1e-08
},
"reason": "a homogeneous stretch every element represents exactly"
},
{
"id": "free_stress",
"quantity": "stress of the free body (σ_xx at the corner)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Free",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 0.0,
"tolerance": {
"absolute": 1e-08
},
"reason": "rounding only"
},
{
"id": "held_stress",
"quantity": "stress of the held block, σ_xx (hydrostatic)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Held",
"at": [
[
0.5,
0.5,
0.5
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": -3.5108024691358017,
"tolerance": {
"relative": 1e-08
},
"reason": "a homogeneous state; E = 10, ν = 0.3 (κ = 8.3333), ϑ = 1.2"
}
]
}
@@ -0,0 +1,17 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"free_stress": {
"band": 1e-8,
"value": -1.0882345665298319e-14
},
"free_u": {
"band": 2.0000000000000037e-10,
"value": 0.20000000000000034
},
"held_stress": {
"band": 3.510802469135803e-9,
"value": -3.5108024691358026
}
}
}
@@ -0,0 +1,23 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], "divisions": [2, 2, 2], "faces": {"6": "x0", "3": "y0", "1": "z0", "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": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.set.create", "params": {"name": "y1", "geometry": [{"body": "Cube", "face": "y1"}]}},
{"command": "model.set.create", "params": {"name": "z1", "geometry": [{"body": "Cube", "face": "z1"}]}},
{"command": "model.material.create", "params": {"name": "Rubber", "elastic": {"type": "isotropic", "young": 10.0, "poisson": 0.3}, "hyperelastic": {"type": "neo_hookean"}, "thermal": {"expansion": 0.001, "reference_temperature": 20.0}}},
{"command": "model.section.create", "params": {"name": "cube", "set": "all", "material": "Rubber", "kind": {"type": "solid"}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx0", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy0", "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": "sx1", "type": "symmetry", "target": {"set": "x1"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy1", "type": "symmetry", "target": {"set": "y1"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sz1", "type": "symmetry", "target": {"set": "z1"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "heat", "type": "temperature", "target": {"set": "all"}, "value": 220.0}},
{"command": "model.step.create", "params": {"name": "Free", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx0", "sy0", "sz0"], "loads": ["heat"]}},
{"command": "model.step.create", "params": {"name": "Held", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx0", "sy0", "sz0", "sx1", "sy1", "sz1"], "loads": ["heat"]}},
{"command": "solve.nonlinear", "params": {"step": "Free"}, "id": "free"},
{"command": "solve.nonlinear", "params": {"step": "Held"}, "id": "held"}
]
+6
View File
@@ -0,0 +1,6 @@
# Yeoh block in uniaxial tension
One hybrid hex20 unit cube on three symmetry planes, E = 3, ν = 0.49, Yeoh with C₁₀ = μ/2,
C₂₀ = −0.02 and C₃₀ = 0.004, pulled to λ = 2 in a nonlinear static step. The reference is the
compressible decoupled energy's axial Cauchy stress σ = (λ/J) ∂W/∂λ with the lateral stretch
found by bisection so σ_yy = 0.
@@ -0,0 +1,53 @@
{
"title": "Yeoh block in uniaxial tension",
"kind": "theory",
"source": "Uniaxial tension of the decoupled compressible Yeoh energy W = C₁₀ (Ī₁ − 3) + C₂₀ (Ī₁ − 3)² + C₃₀ (Ī₁ − 3)³ + κ/2 (J − 1)² (O. H. Yeoh, Rubber Chem. Technol. 66(5):754–771, 1993): σ = (λ/J) ∂W/∂λ with the lateral stretch found so σ_yy = 0 (bisection; E = 3, ν = 0.49, C₁₀ = μ/2, C₂₀ = −0.02, C₃₀ = 0.004)",
"quantities": [
{
"id": "sigma",
"quantity": "axial Cauchy stress, stretch λ = 2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Uniaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 3.174263919393508,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
},
{
"id": "lateral",
"quantity": "lateral displacement at (1, 1, 1): l − 1",
"measure": {
"command": "solve.probe",
"params": {
"step": "Uniaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/displacement/1"
},
"value": -0.2854505757255106,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the hybrid hex20 represents exactly: the tolerance admits the Newton tolerance and rounding"
}
]
}
@@ -0,0 +1,13 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"lateral": {
"band": 2.854505757255106e-10,
"value": -0.285450575725269
},
"sigma": {
"band": 3.174263919404631e-9,
"value": 3.1742639194046305
}
}
}
+16
View File
@@ -0,0 +1,16 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex20", "corners": [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], "divisions": [1, 1, 1], "faces": {"6": "x0", "3": "y0", "1": "z0", "4": "x1", "5": "y1"}}},
{"command": "model.set.create", "params": {"name": "all", "geometry": [{"body": "Cube"}]}},
{"command": "model.set.create", "params": {"name": "x0", "geometry": [{"body": "Cube", "face": "x0"}]}},
{"command": "model.set.create", "params": {"name": "y0", "geometry": [{"body": "Cube", "face": "y0"}]}},
{"command": "model.set.create", "params": {"name": "z0", "geometry": [{"body": "Cube", "face": "z0"}]}},
{"command": "model.set.create", "params": {"name": "x1", "geometry": [{"body": "Cube", "face": "x1"}]}},
{"command": "model.material.create", "params": {"name": "Rubber", "elastic": {"type": "isotropic", "young": 3.0, "poisson": 0.49}, "hyperelastic": {"type": "yeoh", "c20": -0.02, "c30": 0.004}}},
{"command": "model.section.create", "params": {"name": "cube", "set": "all", "material": "Rubber", "kind": {"type": "solid"}, "formulation": {"hybrid": true}}},
{"command": "model.boundary_condition.create", "params": {"name": "sx", "type": "symmetry", "target": {"set": "x0"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "sy", "type": "symmetry", "target": {"set": "y0"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "sz", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "pull", "type": "displacement", "target": {"set": "x1"}, "values": [1.0, null, null, null, null, null]}},
{"command": "model.step.create", "params": {"name": "Uniaxial", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz", "pull"], "loads": []}},
{"command": "solve.nonlinear", "params": {"step": "Uniaxial"}, "id": "solve"}
]