Commit 73b5c23
committed
Commit the converged material state each time step
History-dependent materials (e.g. J2 plasticity) read their previous converged
state from the "old" qpoint material arrays, but those arrays were only ever
written once, at INITMATERIAL. SolutionSystem::updateMaterialsSolution() (which
copies current -> old) existed but was never called, and formBulkFE(UPDATEMATERIAL)
falls into the generic branch that writes the *current* arrays, not the old ones.
As a result the old material state stayed frozen at its initial value for the
whole simulation.
This is wrong for any non-monotonic/cyclic loading (the material forgets it ever
yielded: no residual plastic strain on unload, no Bauschinger effect); it only
happens to give the right answer for monotonic loading because incremental and
single-step return mapping then coincide. Verified directly: the old plastic
strain read 0 every step while the current grew to 2.3e-2.
Fix: call updateMaterialsSolution() after the step's material update so the
converged state becomes the next step's old state. Non-history materials are
unaffected (their old arrays are never read) - transient diffusion output is
byte-identical and shows no runtime change; plasticity now carries its history
(costs one extra per-step state copy).1 parent eaeab2a commit 73b5c23
1 file changed
Lines changed: 5 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
117 | | - | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
118 | 122 | | |
119 | 123 | | |
120 | 124 | | |
| |||
0 commit comments