verification: a nearly incompressible hybrid block under prescribed stretch

nl-hybrid-incompressible: 27 hybrid hex8 at ν = 0.4999 pulled to λ = 2 by a prescribed
displacement, against the compressible neo-Hookean closed form (1.4·10⁻⁹); its first
iterations need the LDLᵀ factorization. ROADMAP and parity updated, docs/oracle.md regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 12:42:12 -04:00
1 parent c09ccc8a59
commit 9ba6224bb7
7 files changed
+96 -3

No files matched your search

@@ -0,0 +1,8 @@
# Nearly incompressible hybrid block under prescribed stretch
A unit cube of 3 × 3 × 3 hybrid hex8 elements on three symmetry planes, neo-Hookean with E = 3,
ν = 0.4999 (κ/μ ≈ 5000), pulled to λ = 2 by a prescribed displacement in a nonlinear static
step. The first iterations of an increment strain only the elements next to the moving face,
whose mixed tangents are then indefinite: the step relies on the LDLᵀ factorization (before it,
every increment was cut back until the step hit its cap). The reference is the compressible
decoupled energy's uniaxial stress with the lateral stretch found by bisection so σ_yy = 0.
@@ -0,0 +1,53 @@
{
"title": "Nearly incompressible hybrid block under prescribed stretch",
"kind": "theory",
"source": "Uniaxial stress of the decoupled compressible neo-Hookean energy W = μ/2 (Ī₁ − 3) + κ/2 (J − 1)² (P. J. Flory, Trans. Faraday Soc. 57:829–838, 1961): σ = μ J^(−5/3) (λ² − I₁/3) + κ (J − 1) with the lateral stretch found so σ_yy = 0 (bisection; E = 3, ν = 0.4999: μ = 1.0000667, κ = 5000)",
"quantities": [
{
"id": "sigma",
"quantity": "axial Cauchy stress, stretch λ = 2, ν = 0.4999",
"measure": {
"command": "solve.probe",
"params": {
"step": "Uniaxial",
"at": [
[
1,
1,
1
]
]
},
"pointer": "/nodes/0/stress/0"
},
"value": 3.498756466061613,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation every hybrid hex8 represents exactly; the 27-element mesh makes the global mixed tangent indefinite in the first iterations (LDLᵀ): 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.29281075714096483,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation every hybrid hex8 represents exactly; the 27-element mesh makes the global mixed tangent indefinite in the first iterations (LDLᵀ): 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.9281075714096485e-10,
"value": -0.29281075714062965
},
"sigma": {
"band": 3.4987564707960495e-9,
"value": 3.4987564707960495
}
}
}
@@ -0,0 +1,16 @@
[
{"command": "mesh.block", "params": {"body": "Cube", "kind": "hex8", "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": [3, 3, 3], "faces": {"6": "x0", "3": "y0", "1": "z0", "4": "x1"}}},
{"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.4999}, "hyperelastic": {"type": "neo_hookean"}}},
{"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"}
]