Fix kinematic/combined hardening back-stress accumulation
Summary
Fixes back-stress accumulation in von Mises kinematic (HARDEN=KINEMATIC) and combined (HARDEN=COMBINED) hardening, which were sub-step dependent and degraded toward perfect plasticity as the number of sub-steps increased.
Root cause
In fistr1/src/lib/physics/Elastoplastic.f90, BackwardEuler_VM loads the previous back stress from fstat(8:13) and then immediately zeroes it:
KH = 0.d0; KK=0.d0; betan=0.d0; back(:)=0.d0 ! back reset hereBecause back is then 0, the stored update fstat(2:7) = back + (KK-betan)*devia/eqvs keeps only the current sub-step increment (history lost), and stress(:) = stress(:) + back(:) adds 0 instead of restoring the accumulated back stress. The back stress therefore did not accumulate across sub-steps.
Symptom (1-element uniaxial, E=1e5, σy0=1000, C=1e5, ε=0.03)
| SUBSTEPS | 1 | 6 | 30 |
|---|---|---|---|
| before (σxx) | 1977.8 | 1260.8 | 1052.0 |
| after (σxx) | 1977.8 | 1974.8 | 1974.2 |
Rate-independent plasticity must be sub-step independent; isotropic hardening already was, kinematic/combined were not.
Fix
Keep the loaded back stress for the kinematic case (so it accumulates at the fstat update and is restored into the stress); only zero it for the non-kinematic case. Isotropic-hardening behaviour is unchanged.
Tests
Adds two minimal uniaxial strain-controlled cyclic regression tests under tests/lib/physics/Elastoplastic/:
kinematic— reverse loading reaches σxx ≈ 0 at ε=0.01 (isotropic would give ≈ −1000): the Bauschinger effect is now quantitatively correct.combined— isotropic + linear kinematic; reverse-yield span = 2·σy_current.
Both are hand-verified and sub-step independent.