What does a negative time stepping mean? (Adaptive time stepping)

196 Views Asked by At

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.

Full Code: https://bitbucket.org/fenics-apps/fenics-solid-mechanics/src/0f813a2e8726821a08d112809421517aab9dd24e/demo/square/main.cpp?at=master&fileviewer=file-view-default

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++;
1

There are 1 best solutions below

0
On

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.