verification: implicit plasticity oracle cases and documentation

Four cases, each against its closed form: uniaxial tension of a J2 cube to a
logarithmic strain of 0.2 (Kirchhoff stress exact; 0.13 % from the explicit
solver's hypoelastic Cauchy stress, the elastic volume change between the two
laws), the Bauschinger effect of linear kinematic hardening on a load path
back to zero strain (exact), Hill's elastic-perfectly plastic thick cylinder
(bore displacement at a plastic radius of 1.5a within 0.009 %, collapse
pressure within 2e-8; the pending case is now active) and a cantilever's
plastic collapse, converged 3.1 % above beam theory's hinge, the bound a
continuum exceeds. docs/fem.md, the literature, ROADMAP (M15), parity and the
oracle page follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 06:03:36 -04:00
1 parent 17b2c837f2
commit 7a69fe5e2f
21 files changed
+414 -25

No files matched your search

+16
View File
@@ -0,0 +1,16 @@
# Uniaxial tension of a J2 bilinear-hardening cube to large strain (implicit)
The cube of `j2-uniaxial-explicit` solved by the implicit nonlinear solver: one fully integrated
hex8, E = 200000, ν = 0.3, σ_y = 250, H = 2000 (isotropic), held by symmetry on three faces and
stretched on the fourth to λ = e^0.2 in a nonlinear static step, lateral faces free.
Simo's exponential return map integrates this proportional path exactly in the logarithmic
strain, so the Kirchhoff stress is the small-strain curve τ = σ_y + E_t (ε − σ_y/E) = 643.564 at
ε = 0.2 and the equivalent plastic strain (τ − σ_y)/H = 0.196782. The Cauchy stress is
σ = τ/J with Hencky's volume law ln J = τ/(3K): 642.737.
Cross-check with the explicit solver: `j2-uniaxial-explicit` reaches 643.57 for the Cauchy stress
with the same plastic strain. Its hypoelastic update takes the logarithmic strain rate against
the Cauchy stress, while the implicit model is hyperelastic in the Kirchhoff stress: the two
laws differ by the factor J = 1.0013 (the elastic volume change), which is the 0.13 % between
them; both meet the closed form of their own law.
+45
View File
@@ -0,0 +1,45 @@
{
"title": "Uniaxial tension of a J2 bilinear-hardening cube to large strain (implicit, finite strain)",
"kind": "theory",
"source": "J2 plasticity with linear isotropic hardening in uniaxial stress (Simo and Hughes, Computational Inelasticity, Springer 1998, §2.3) in the logarithmic strain, which Simo's exponential return map (CMAME 99:61–112, 1992) integrates exactly on a proportional path: Kirchhoff stress τ = σ_y + E_t (ε − σ_y/E), Cauchy stress σ = τ/J with ln J = τ/(3K) (Hencky's volume law)",
"quantities": [
{
"id": "sigma",
"quantity": "axial Cauchy stress at a logarithmic strain of 0.2",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pull",
"elements": [
1
]
},
"pointer": "/elements/0/stress/0/0"
},
"value": 642.7365391418857,
"tolerance": {
"relative": 1e-06
},
"reason": "a homogeneous deformation the element represents exactly, reached on a proportional path: the tolerance only admits the Newton tolerance and rounding"
},
{
"id": "plastic_strain",
"quantity": "equivalent plastic strain",
"measure": {
"command": "solve.probe",
"params": {
"step": "Pull",
"elements": [
1
]
},
"pointer": "/elements/0/plastic_strain/0"
},
"value": 0.19678217821782182,
"tolerance": {
"relative": 1e-06
},
"reason": "ε_p = (τ − σ_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": 1.9678217821795454e-10,
"value": 0.19678217821795452
},
"sigma": {
"band": 6.427365391418857e-7,
"value": 642.7365390754569
}
}
}
+16
View File
@@ -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": [1, 1, 1], "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": "Steel", "elastic": {"type": "isotropic", "young": 200000.0, "poisson": 0.3}, "plastic": {"type": "bilinear", "yield_stress": 250.0, "hardening_modulus": 2000.0, "hardening": "isotropic"}}},
{"command": "model.section.create", "params": {"name": "cube", "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": "sz", "type": "symmetry", "target": {"set": "z0"}, "plane": "z"}},
{"command": "model.boundary_condition.create", "params": {"name": "pull", "type": "displacement", "target": {"set": "x1"}, "values": [0.22140275816016985, null, null, null, null, null]}},
{"command": "model.step.create", "params": {"name": "Pull", "procedure": {"type": "nonlinear_static"}, "boundary_conditions": ["sx", "sy", "sz", "pull"], "loads": []}},
{"command": "solve.nonlinear", "params": {"step": "Pull"}, "id": "solve"}
]