Summary behind the problem: The following code aims at solving a static elasto-plastic problem. Like a 2D square mesh based on an elasto-plastic constitutive model like Von-Mises or Drucker-Prager with isotropic hardening. It is a demo from open source fem solver Fenics - Solid Mechanics App. They use a return mapping algorithm called 'Closest-point projection' (Simo and Hughes 1998) with Newton method to solve the non-linear problem.
The problem: In the c++ demo, they use the following time stepping which I have never seen before. There are multiple time steps 'dt0', 'dt1'..etc. One of them is even NEGATIVE. They are defined in comments as 'load regions'. I don't understand what this means physically and mathematically. Can anyone offer a simple explanation about what could be the possible intention? I am not a math student so I' ll be grateful if you could take that into consideration in your reply.
// Elastic time step, always one step.
double Edt = 0.0095;
// Load region 0, time step and number of steps
double dt0 = 0.001;
unsigned int dt0_steps = 3;
// Load region 1, time step and number of steps
double dt1 = -0.002;
unsigned int dt1_steps = 1;
// Load region 2, time step and number of steps
double dt2 = 0.001;
unsigned int dt2_steps = 4;
// Load-disp info
unsigned int step = 0;
unsigned int steps = dt0_steps + dt1_steps + dt2_steps + 1;
while (step < steps)
{
// Use elastic tangent for first time step
if (step == 0)
t += Edt;
else if (step < 1 + dt0_steps)
t += dt0;
else if (step < 1 + dt0_steps + dt1_steps)
t += dt1;
else if (step < 1 + dt0_steps + dt1_steps + dt2_steps)
t += dt2;
step++;
Partial answer: I've never encountered a negative time step.
For cutbacks in non-linear (NR, Modified NR, etc) solvers due to lack of convergence, you typically abandon the whole increment and start afresh. In any case, the code section seems to have no if condition related to convergence at all. So it does not look like some weirdly clever way to achieve cutback.
That leaves us with two possibilities:
(1) A simple typo. They wish to use different time steps in different load regions, and there is no reason for one of the time increments to be negative.
(2) It is a REALLY ugly hack
In any case, their code is awfully opaque, especially when one considers that it is meant to be an example problem. A simple array specifying the time increment per load region would be a far cleaner way of going about it.