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 here

Because 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.

🤖 Generated with Claude Code

Merge request reports

Loading
Loading