Skip to content

Commit 73b5c23

Browse files
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

File tree

src/TimeStepping/TimeSteppingSolve.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ bool TimeStepping::solve(FECell &t_FECell,
114114
t_SolnSystem,
115115
t_EqSystem.m_AMATRIX,
116116
t_EqSystem.m_RHS);
117-
117+
// commit the converged qpoint material state as the new "old" state, so that
118+
// history-dependent materials (e.g. plasticity) carry their state to the next step.
119+
// Without this the old state stays frozen at its initial value, which only happens
120+
// to give the right answer for monotonic loading.
121+
t_SolnSystem.updateMaterialsSolution();
118122

119123
if(t_FECtrlInfo.CurrentStep%t_Output.getIntervalNum()==0){
120124
t_ProjSystem.executeProjection(t_FECell,t_DofHandler,t_ElmtSystem,t_MateSystem,t_FE,t_SolnSystem,t_FECtrlInfo);

0 commit comments

Comments
 (0)