AdaptiveSubstepperExplicit.h
Go to the documentation of this file.
1 /* ---------------------------------------------------------------------
2  * _
3  * _ __ ___ __ _ _ __ _ __ ___ ___ | |_
4  * | '_ ` _ \ / _` | '__| '_ ` _ \ / _ \| __|
5  * | | | | | | (_| | | | | | | | | (_) | |_
6  * |_| |_| |_|\__,_|_| |_| |_| |_|\___/ \__|
7  *
8  * Unit of Strength of Materials and Structural Analysis
9  * University of Innsbruck,
10  * 2020 - today
11  *
12  * festigkeitslehre@uibk.ac.at
13  *
14  * Matthias Neuner matthias.neuner@uibk.ac.at
15  *
16  * This file is part of the MAteRialMOdellingToolbox (marmot).
17  *
18  * This library is free software; you can redistribute it and/or
19  * modify it under the terms of the GNU Lesser General Public
20  * License as published by the Free Software Foundation; either
21  * version 2.1 of the License, or (at your option) any later version.
22  *
23  * The full text of the license can be found in the file LICENSE.md at
24  * the top level directory of marmot.
25  * ---------------------------------------------------------------------
26  */
27 
28 #pragma once
29 #include "Marmot/MarmotJournal.h"
30 #include "Marmot/MarmotTypedefs.h"
31 
33 
34  template < size_t materialTangentSize, size_t nIntegrationDependentStateVars >
36  /* Adaptive Substepper, employing an error estimation and
37  * Richardson Extrapolation for an (semi)-Explicit Return Mapping algorithm
38  *
39  * Matthias Neuner (2016), developed within the DK-CIM collaboration
40  * */
41  public:
43  typedef Eigen::Matrix< double, materialTangentSize, materialTangentSize > TangentSizedMatrix;
44  typedef Eigen::Matrix< double, materialTangentSize, 6 > MatrixStateStrain;
45  typedef Eigen::Matrix< double, nIntegrationDependentStateVars, 1 > IntegrationStateVector;
46 
48  double minimumStepSize,
49  double maxScaleUpFactor,
50  double scaleDownFactor,
53  const Matrix6d& Cel );
55  void setConvergedProgress( const Marmot::Vector6d& stressOld, const IntegrationStateVector& stateVarsOld );
57  bool isFinished();
59  double getNextSubstep();
61  int getNumberOfSubsteps();
65  bool finishSubstep( const Marmot::Vector6d& resultStress,
66  const TangentSizedMatrix& dXdY,
67  const TangentSizedMatrix& dYdXOld,
68  const IntegrationStateVector& stateVars );
70  void finishElasticSubstep( const Marmot::Vector6d& resultStress );
72  bool discardSubstep();
74  bool repeatSubstep( double decrementationFactor );
75 
81  void getResults( Marmot::Vector6d& stress, Matrix6d& consistentTangent, IntegrationStateVector& stateVars );
82 
83  private:
85  const int nPassesToIncrease;
87 
88  const Matrix6d& Cel;
94 
101 
108 
109  const TangentSizedMatrix& IXX();
110  const MatrixStateStrain& IX6();
111 
114 
116  bool splitCurrentSubstep();
117  };
118 
119 } // namespace Marmot::NumericalAlgorithms
120 
121 namespace Marmot::NumericalAlgorithms {
122 
123  template < size_t n, size_t nState >
125  double minimumStepSize,
126  double maxScaleUpFactor,
127  double scaleDownFactor,
128  double integrationErrorTolerance,
129  int nPassesToIncrease,
130  const Matrix6d& Cel )
131  : initialStepSize( initialStepSize ),
132  minimumStepSize( minimumStepSize ),
133  maxScaleUpFactor( maxScaleUpFactor ),
134  scaleDownFactor( scaleDownFactor ),
135  integrationErrorTolerance( integrationErrorTolerance ),
136  nPassesToIncrease( nPassesToIncrease ),
137  ignoreErrorToleranceOnMinimumStepSize( true ),
138  Cel( Cel ),
139  currentProgress( 0.0 ),
140  currentSubstepSize( initialStepSize ),
141  passedSubsteps( 0 ),
142  substepIndex( -1 ),
143  discardedDueToError( 0 )
144  {
145  consistentTangentProgress = MatrixStateStrain::Zero();
146  consistentTangentProgressFullTemp = MatrixStateStrain::Zero();
147  consistentTangentProgressHalfTemp = MatrixStateStrain::Zero();
148 
149  stressProgressHalfTemp.setZero();
150  stressProgressFullTemp.setZero();
151  stateProgressHalfTemp.setZero();
152  stateProgressFullTemp.setZero();
155 
157  }
158 
159  template < size_t n, size_t nState >
161  nState >::IX6()
162  {
163  static MatrixStateStrain IX6 = [] {
164  MatrixStateStrain tmp = MatrixStateStrain::Zero();
165  tmp.topLeftCorner( 6, 6 ) = Matrix6d::Identity();
166  return tmp;
167  }();
168  return IX6;
169  }
170 
171  template < size_t n, size_t nState >
173  IXX()
174  {
175  static TangentSizedMatrix IXX = [] {
176  TangentSizedMatrix tmp = TangentSizedMatrix::Identity();
177  return tmp;
178  }();
179  return IXX;
180  }
181 
182  template < size_t n, size_t nState >
184  const IntegrationStateVector& stateVarsOld )
185  {
186  stressProgress = stressOld;
187  stateProgress = stateVarsOld;
188  }
189 
190  template < size_t n, size_t nState >
192  {
193  return ( ( 1.0 - currentProgress ) <= 2e-16 && currentState == FullStep );
194  }
195 
196  template < size_t n, size_t nState >
198  {
199  switch ( currentState ) {
200  case FullStep: {
201  const double remainingProgress = 1.0 - currentProgress;
202  if ( remainingProgress < currentSubstepSize )
203  currentSubstepSize = remainingProgress;
204  substepIndex++;
205  return currentSubstepSize;
206  break;
207  }
208  case FirstHalfStep: {
209  return 0.5 * currentSubstepSize;
210  break;
211  }
212  case SecondHalfStep: {
213  return 0.5 * currentSubstepSize;
214  break;
215  }
216  }
217  return 0;
218  }
219  template < size_t n, size_t nState >
221  IntegrationStateVector& stateVars )
222  {
223  switch ( currentState ) {
224  case FullStep: {
225  stress = stressProgress;
226  stateVars = stateProgress;
227  break;
228  }
229  case FirstHalfStep: {
230  stress = stressProgress;
231  stateVars = stateProgress;
232  break;
233  }
234  case SecondHalfStep: {
235  stress = stressProgressHalfTemp;
236  stateVars = stateProgressHalfTemp;
237  break;
238  }
239  }
240  }
241 
242  template < size_t n, size_t nState >
244  {
245  passedSubsteps = 0;
246  switch ( currentState ) {
247  case FullStep: {
248  currentSubstepSize *= scaleDownFactor; // we use the scale factor only here
249  break;
250  }
251  // these cases should actually never happen, as the full step has already converged!
252  case FirstHalfStep:
253  MarmotJournal::warningToMSG( "UMAT: warning, 1th half sub step has not converged after already "
254  "converged full step" );
255  return acceptSubstepWithFullStepOnly();
256 
257  case SecondHalfStep:
258  MarmotJournal::warningToMSG( "UMAT: warning, 2th half sub step has not converged after already "
259  "converged full step" );
260  return acceptSubstepWithFullStepOnly();
261  }
262 
263  currentState = FullStep;
264 
265  if ( currentSubstepSize < minimumStepSize )
266  return MarmotJournal::warningToMSG( "UMAT: Substepper: Minimal stepzsize reached" );
267  else
268  return true;
269  }
270 
271  template < size_t n, size_t nState >
273  {
274  currentState = FullStep;
275  passedSubsteps = 0;
276 
277  currentSubstepSize *= factorNew; // we use the scale factor only here
278 
279  if ( currentSubstepSize < minimumStepSize )
280  return MarmotJournal::warningToMSG( "UMAT: Substepper: Minimal stepzsize reached" );
281  else
282  return true;
283  }
284 
285  template < size_t n, size_t nState >
287  const TangentSizedMatrix& dXdY,
288  const TangentSizedMatrix& dYdXOld,
289  const IntegrationStateVector& stateVars )
290  {
291  if ( currentState == FullStep ) {
292  stressProgressFullTemp = resultStress;
293  stateProgressFullTemp = stateVars;
294  consistentTangentProgressFullTemp = consistentTangentProgress;
295  consistentTangentProgressFullTemp.applyOnTheLeft( IXX() - dYdXOld );
296  consistentTangentProgressFullTemp += currentSubstepSize * IX6() * Cel;
297  consistentTangentProgressFullTemp.applyOnTheLeft( dXdY );
298  currentState = FirstHalfStep;
299  return true;
300  }
301  else if ( currentState == FirstHalfStep ) {
302 
303  stressProgressHalfTemp = resultStress;
304  stateProgressHalfTemp = stateVars;
305  consistentTangentProgressHalfTemp = consistentTangentProgress;
306  consistentTangentProgressHalfTemp.applyOnTheLeft( IXX() - dYdXOld );
307  consistentTangentProgressHalfTemp += 0.5 * currentSubstepSize * IX6() * Cel;
308  consistentTangentProgressHalfTemp.applyOnTheLeft( dXdY );
309  currentState = SecondHalfStep;
310  return true;
311  }
312 
313  else if ( currentState == SecondHalfStep ) {
314  // error Estimation
315 
316  currentState = FullStep;
317  const double error = ( resultStress - stressProgressFullTemp ).norm();
318  const double errorRatio = error / integrationErrorTolerance;
319  double scaleFactor = 1.0;
320  if ( errorRatio > 1e-10 )
321  scaleFactor = 0.9 * std::sqrt( 1. / errorRatio );
322 
323  // saturations
324  if ( scaleFactor < 0.1 )
325  scaleFactor = 0.1;
326  if ( scaleFactor * currentSubstepSize < minimumStepSize )
327  scaleFactor = minimumStepSize / currentSubstepSize;
328  if ( scaleFactor > maxScaleUpFactor )
329  scaleFactor = maxScaleUpFactor;
330  if ( scaleFactor > 10 )
331  scaleFactor = 10;
332 
333  // Error large than tolerance?
334  if ( error > integrationErrorTolerance ) {
335  discardedDueToError++;
336  passedSubsteps = 0;
337  if ( errorRatio < 2 ) {
338  return splitCurrentSubstep();
339  }
340  else {
341  return repeatSubstep( scaleFactor );
342  }
343  // return splitCurrentSubstep(); }
344  }
345  else {
346 
347  stressProgressHalfTemp = resultStress;
348  stateProgressHalfTemp = stateVars;
349  consistentTangentProgressHalfTemp.applyOnTheLeft( IXX() - dYdXOld );
350  consistentTangentProgressHalfTemp += 0.5 * currentSubstepSize * IX6() * Cel;
351  consistentTangentProgressHalfTemp.applyOnTheLeft( dXdY );
352 
353  consistentTangentProgress = 2 * consistentTangentProgressHalfTemp - consistentTangentProgressFullTemp;
354  stressProgress = 2 * stressProgressHalfTemp - stressProgressFullTemp;
355  stateProgress = 2 * stateProgressHalfTemp - stateProgressFullTemp;
356  currentProgress += currentSubstepSize;
357 
358  passedSubsteps++;
359  currentSubstepSize *= scaleFactor;
360 
361  return true;
362  }
363  }
364  return false;
365  }
366 
367  template < size_t n, size_t nState >
369  {
370  switch ( currentState ) {
371  case FullStep: {
372  // this means, that the complete current cycle is already successfull,
373  // as the two half steps must also be elastic!
374  consistentTangentProgress += currentSubstepSize * IX6() * Cel;
375  stressProgress = newStress;
376  // no need for two half steps if full step was already elastic
377  currentProgress += currentSubstepSize;
378  currentState = FullStep;
379  passedSubsteps++;
380  break;
381  }
382 
383  case FirstHalfStep: {
384  consistentTangentProgressHalfTemp = consistentTangentProgress;
385  consistentTangentProgressHalfTemp += 0.5 * currentSubstepSize * IX6() * Cel;
386  stressProgressHalfTemp = newStress;
387  currentState = SecondHalfStep;
388  break;
389  }
390  case SecondHalfStep: {
391  acceptSubstepWithFullStepOnly();
392  break;
393  }
394  }
395  }
396 
397  template < size_t n, size_t nState >
399  Matrix6d& consistentTangentOperator,
400  IntegrationStateVector& stateVars )
401  {
402  stress = stressProgress;
403  stateVars = stateProgress;
404  consistentTangentOperator = consistentTangentProgress.topLeftCorner( 6, 6 );
405  }
406 
407  template < size_t n, size_t nState >
409  {
410  consistentTangentProgress = consistentTangentProgressFullTemp;
411  stressProgress = stressProgressFullTemp;
412  stateProgress = stateProgressFullTemp;
413 
414  currentProgress += currentSubstepSize;
415  currentState = FullStep;
416 
417  return true;
418  }
419 
420  template < size_t n, size_t nState >
422  {
423  if ( currentSubstepSize < 2 * minimumStepSize ) {
424  if ( ignoreErrorToleranceOnMinimumStepSize )
425  return acceptSubstepWithFullStepOnly();
426  else
427  return false;
428  }
429 
430  consistentTangentProgressFullTemp = consistentTangentProgressHalfTemp;
431  stressProgressFullTemp = stressProgressHalfTemp;
432  stateProgressFullTemp = stateProgressHalfTemp;
433  currentSubstepSize *= 0.5;
434  currentState = FirstHalfStep;
435 
436  return true;
437  }
438  template < size_t n, size_t nState >
440  {
441  return substepIndex;
442  }
443  template < size_t n, size_t nState >
445  {
446  return discardedDueToError;
447  }
448 } // namespace Marmot::NumericalAlgorithms
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::consistentTangentProgress
MatrixStateStrain consistentTangentProgress
internal storages for the progress of the total increment
Definition: AdaptiveSubstepperExplicit.h:100
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::setConvergedProgress
void setConvergedProgress(const Marmot::Vector6d &stressOld, const IntegrationStateVector &stateVarsOld)
Set the current converged state.
Definition: AdaptiveSubstepperExplicit.h:183
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stateProgressFullTemp
IntegrationStateVector stateProgressFullTemp
Definition: AdaptiveSubstepperExplicit.h:105
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getNumberDiscardedSubstepsDueToError
int getNumberDiscardedSubstepsDueToError()
get the number of discarded subincrements
Definition: AdaptiveSubstepperExplicit.h:444
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getNextSubstep
double getNextSubstep()
get the next subincrement size
Definition: AdaptiveSubstepperExplicit.h:197
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::consistentTangentProgressHalfTemp
MatrixStateStrain consistentTangentProgressHalfTemp
temporal storages, which are used until a cycle full/half/half has finished successfully
Definition: AdaptiveSubstepperExplicit.h:107
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::substepIndex
int substepIndex
Definition: AdaptiveSubstepperExplicit.h:92
Marmot::NumericalAlgorithms
Definition: MarmotNumericalDifferentiation.h:34
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::repeatSubstep
bool repeatSubstep(double decrementationFactor)
repeat the current subincrement with a smaller step
Definition: AdaptiveSubstepperExplicit.h:272
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::finishSubstep
bool finishSubstep(const Marmot::Vector6d &resultStress, const TangentSizedMatrix &dXdY, const TangentSizedMatrix &dYdXOld, const IntegrationStateVector &stateVars)
finish a subincrement with plasticity
Definition: AdaptiveSubstepperExplicit.h:286
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::discardedDueToError
int discardedDueToError
Definition: AdaptiveSubstepperExplicit.h:93
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::ignoreErrorToleranceOnMinimumStepSize
const bool ignoreErrorToleranceOnMinimumStepSize
Definition: AdaptiveSubstepperExplicit.h:86
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::currentSubstepSize
double currentSubstepSize
Definition: AdaptiveSubstepperExplicit.h:90
MarmotJournal.h
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stressProgressHalfTemp
Marmot::Vector6d stressProgressHalfTemp
temporal storages, which are used until a cycle full/half/half has finished successfully
Definition: AdaptiveSubstepperExplicit.h:103
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getResults
void getResults(Marmot::Vector6d &stress, Matrix6d &consistentTangent, IntegrationStateVector &stateVars)
Write the current results.
Definition: AdaptiveSubstepperExplicit.h:398
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::acceptSubstepWithFullStepOnly
bool acceptSubstepWithFullStepOnly()
Definition: AdaptiveSubstepperExplicit.h:408
MarmotTypedefs.h
Marmot::Matrix6d
Eigen::Matrix< double, 6, 6 > Matrix6d
Definition: MarmotTypedefs.h:35
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::FirstHalfStep
@ FirstHalfStep
Definition: AdaptiveSubstepperExplicit.h:112
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::IXX
const TangentSizedMatrix & IXX()
Definition: AdaptiveSubstepperExplicit.h:173
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getCurrentTangentOperator
Matrix6d getCurrentTangentOperator()
get the algorithmic tangent for the current state
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getConvergedProgress
void getConvergedProgress(Marmot::Vector6d &stress, IntegrationStateVector &stateVars)
get the last converged state
Definition: AdaptiveSubstepperExplicit.h:220
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::MatrixStateStrain
Eigen::Matrix< double, materialTangentSize, 6 > MatrixStateStrain
Definition: AdaptiveSubstepperExplicit.h:44
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::minimumStepSize
const double minimumStepSize
Definition: AdaptiveSubstepperExplicit.h:84
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::TangentSizedMatrix
Eigen::Matrix< double, materialTangentSize, materialTangentSize > TangentSizedMatrix
Matrix for describing the nonlinear equation system of the return mapping algorithm.
Definition: AdaptiveSubstepperExplicit.h:43
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::FullStep
@ FullStep
Definition: AdaptiveSubstepperExplicit.h:112
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::discardSubstep
bool discardSubstep()
discard the current subincrement
Definition: AdaptiveSubstepperExplicit.h:243
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::isFinished
bool isFinished()
Check if the subincrementation is finished.
Definition: AdaptiveSubstepperExplicit.h:191
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::scaleDownFactor
const double scaleDownFactor
Definition: AdaptiveSubstepperExplicit.h:84
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::IX6
const MatrixStateStrain & IX6()
Definition: AdaptiveSubstepperExplicit.h:161
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit
Definition: AdaptiveSubstepperExplicit.h:35
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::AdaptiveSubstepperExplicit
AdaptiveSubstepperExplicit(double initialStepSize, double minimumStepSize, double maxScaleUpFactor, double scaleDownFactor, double integrationErrorTolerance, int nPassesToIncrease, const Matrix6d &Cel)
Definition: AdaptiveSubstepperExplicit.h:124
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::SubsteppingState
SubsteppingState
Definition: AdaptiveSubstepperExplicit.h:112
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stateProgressHalfTemp
IntegrationStateVector stateProgressHalfTemp
temporal storages, which are used until a cycle full/half/half has finished successfully
Definition: AdaptiveSubstepperExplicit.h:105
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::consistentTangentProgressFullTemp
MatrixStateStrain consistentTangentProgressFullTemp
Definition: AdaptiveSubstepperExplicit.h:107
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::maxScaleUpFactor
const double maxScaleUpFactor
Definition: AdaptiveSubstepperExplicit.h:84
Marmot::Vector6d
Eigen::Matrix< double, 6, 1 > Vector6d
Definition: MarmotTypedefs.h:43
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::Cel
const Matrix6d & Cel
Definition: AdaptiveSubstepperExplicit.h:88
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::currentProgress
double currentProgress
Definition: AdaptiveSubstepperExplicit.h:89
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stateProgress
IntegrationStateVector stateProgress
internal storages for the progress of the total increment
Definition: AdaptiveSubstepperExplicit.h:98
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::passedSubsteps
int passedSubsteps
Definition: AdaptiveSubstepperExplicit.h:91
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::integrationErrorTolerance
const double integrationErrorTolerance
Definition: AdaptiveSubstepperExplicit.h:84
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::SecondHalfStep
@ SecondHalfStep
Definition: AdaptiveSubstepperExplicit.h:112
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stressProgress
Marmot::Vector6d stressProgress
internal storages for the progress of the total increment
Definition: AdaptiveSubstepperExplicit.h:96
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::splitCurrentSubstep
bool splitCurrentSubstep()
Definition: AdaptiveSubstepperExplicit.h:421
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::nPassesToIncrease
const int nPassesToIncrease
Definition: AdaptiveSubstepperExplicit.h:85
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::stressProgressFullTemp
Marmot::Vector6d stressProgressFullTemp
Definition: AdaptiveSubstepperExplicit.h:103
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::initialStepSize
const double initialStepSize
Definition: AdaptiveSubstepperExplicit.h:84
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::finishElasticSubstep
void finishElasticSubstep(const Marmot::Vector6d &resultStress)
finish a subincrement with elasticity only
Definition: AdaptiveSubstepperExplicit.h:368
MarmotJournal::warningToMSG
static bool warningToMSG(const std::string &message)
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::IntegrationStateVector
Eigen::Matrix< double, nIntegrationDependentStateVars, 1 > IntegrationStateVector
Definition: AdaptiveSubstepperExplicit.h:45
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::getNumberOfSubsteps
int getNumberOfSubsteps()
get the finished number of subincrements
Definition: AdaptiveSubstepperExplicit.h:439
Marmot::NumericalAlgorithms::AdaptiveSubstepperExplicit::currentState
SubsteppingState currentState
Definition: AdaptiveSubstepperExplicit.h:113