forked from 1b-agent/fieldcraft-upstream
explicit: hyperelastic materials on the shared finite-strain material point
Neo-Hookean, Mooney–Rivlin and Yeoh materials in explicit dynamics, in total form from the deformation gradient (objective by construction): the one-point hex8 takes its mean F over the undeformed element and the stress τ/J; tet4 takes the isochoric stress of its own F with the average nodal pressure of the decoupled volumetric energy (Bonet–Burton at finite strain). Each element's frequency bound follows the tangent's largest normal stiffness. Small-displacement steps and thermal strain of hyperelastic elements are refused by name. Verified by uniaxial strain to λ = 1.5 of all three laws on hex8 and tet4 against the material point (to rounding), and the oracle case explicit-neo-hookean-implicit: a quasi-static explicit pull against the implicit nonlinear solver (lateral contraction to 0.09%, stress to 0.03%). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
1 parent
94f7e8533a
commit
ce8e23d05b
9 files changed
+600
-10
No files matched your search
@@ -0,0 +1,8 @@
|
||||
# Neo-Hookean cube: explicit against implicit (quasi-static)
|
||||
|
||||
A unit cube of 2 × 2 × 2 cells of tet4 (six per cell) of a compressible neo-Hookean material
|
||||
(E = 10, ν = 0.3, ρ = 1), quarter symmetric (symmetry planes x = 0, y = 0, z = 0), pulled on
|
||||
x = 1 to λ = 1.5 in uniaxial stress. The same model is solved by the implicit nonlinear solver
|
||||
and by explicit dynamics with the pull applied over 100 time units (a few hundred wave transits):
|
||||
the lateral contraction and the axial stress must agree, both coming from the shared
|
||||
finite-strain material point.
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"title": "Neo-Hookean cube stretched to λ = 1.5: explicit dynamics, loaded slowly, against the implicit nonlinear solver",
|
||||
"kind": "theory",
|
||||
"source": "Uniaxial stress of a compressible neo-Hookean solid (Holzapfel, Nonlinear Solid Mechanics, Wiley 2000, §6.5): a homogeneous state that a quasi-static explicit run must share with the implicit Newton solution on the same material point; the implicit solver is itself checked against the closed form by nl-neo-hookean-uniaxial",
|
||||
"quantities": [
|
||||
{"id": "lateral", "quantity": "lateral displacement of the corner (1, 1, 1) along y, explicit over implicit",
|
||||
"measure": {"command": "solve.probe", "params": {"step": "Dynamic", "at": [[1, 1, 1]]}, "pointer": "/nodes/0/displacement/1",
|
||||
"over": {"command": "solve.probe", "params": {"step": "Static", "at": [[1, 1, 1]]}, "pointer": "/nodes/0/displacement/1"}},
|
||||
"value": 1.0, "tolerance": {"relative": 0.005},
|
||||
"reason": "the same material point and a homogeneous state; the explicit run is pulled over a few hundred wave transits, and what is left of its waves is a fraction of a percent"},
|
||||
{"id": "stress", "quantity": "σ_xx of element 1, explicit, over σ_xx at the node at (0, 0, 0), implicit",
|
||||
"measure": {"command": "solve.probe", "params": {"step": "Dynamic", "elements": [1]}, "pointer": "/elements/0/stress/0",
|
||||
"over": {"command": "solve.probe", "params": {"step": "Static", "at": [[0, 0, 0]]}, "pointer": "/nodes/0/stress/0"}},
|
||||
"value": 1.0, "tolerance": {"relative": 0.005},
|
||||
"reason": "as for the displacement"}
|
||||
]
|
||||
}
|
||||
@@ -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": 1e-9,
|
||||
"value": 0.9990781754549147
|
||||
},
|
||||
"stress": {
|
||||
"band": 1.0002554925493198e-9,
|
||||
"value": 1.0002554925493197
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
[
|
||||
{
|
||||
"command": "mesh.block",
|
||||
"params": {
|
||||
"body": "Cube",
|
||||
"kind": "tet4",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": 10.0,
|
||||
"poisson": 0.3
|
||||
},
|
||||
"density": 1.0,
|
||||
"hyperelastic": {
|
||||
"type": "neo_hookean"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "model.section.create",
|
||||
"params": {
|
||||
"name": "cube",
|
||||
"set": "all",
|
||||
"material": "Rubber",
|
||||
"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.boundary_condition.create",
|
||||
"params": {
|
||||
"name": "pull",
|
||||
"type": "displacement",
|
||||
"target": {
|
||||
"set": "x1"
|
||||
},
|
||||
"values": [
|
||||
0.5,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "model.step.create",
|
||||
"params": {
|
||||
"name": "Static",
|
||||
"procedure": {
|
||||
"type": "nonlinear_static"
|
||||
},
|
||||
"boundary_conditions": [
|
||||
"sx",
|
||||
"sy",
|
||||
"sz",
|
||||
"pull"
|
||||
],
|
||||
"loads": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "model.step.create",
|
||||
"params": {
|
||||
"name": "Dynamic",
|
||||
"procedure": {
|
||||
"type": "explicit_dynamic",
|
||||
"end_time": 100.0
|
||||
},
|
||||
"boundary_conditions": [
|
||||
"sx",
|
||||
"sy",
|
||||
"sz",
|
||||
"pull"
|
||||
],
|
||||
"loads": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "solve.nonlinear",
|
||||
"params": {
|
||||
"step": "Static"
|
||||
},
|
||||
"id": "implicit"
|
||||
},
|
||||
{
|
||||
"command": "solve.explicit",
|
||||
"params": {
|
||||
"step": "Dynamic"
|
||||
},
|
||||
"id": "explicit"
|
||||
}
|
||||
]
|
||||
Reference in new issue
Block a user