Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Tempus_StepperExplicitRK_impl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
9 #ifndef Tempus_StepperExplicitRK_impl_hpp
10 #define Tempus_StepperExplicitRK_impl_hpp
11 
13 
14 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
15 #include "Thyra_VectorStdOps.hpp"
16 
17 
18 namespace Tempus {
19 
20 
21 template<class Scalar>
23 {
24  this->setUseFSAL( this->getUseFSALDefault());
25  this->setICConsistency( this->getICConsistencyDefault());
26  this->setICConsistencyCheck( this->getICConsistencyCheckDefault());
27  this->setUseEmbedded( this->getUseEmbeddedDefault());
28 
29  this->setStageNumber(-1);
30 
31 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
32  this->setObserver(Teuchos::rcp(new StepperRKObserver<Scalar>()));
33 #endif
34  this->setAppAction(Teuchos::null);
35 }
36 
37 
38 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
39 template<class Scalar>
41  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
42  const Teuchos::RCP<StepperRKObserverComposite<Scalar> >& obs,
43  bool useFSAL,
44  std::string ICConsistency,
45  bool ICConsistencyCheck,
46  bool useEmbedded)
47 {
48  this->setUseFSAL( useFSAL);
49  this->setICConsistency( ICConsistency);
50  this->setICConsistencyCheck( ICConsistencyCheck);
51  this->setUseEmbedded( useEmbedded);
52 
53  this->setStageNumber(-1);
54 
55  this->stepperObserver_ =
56  Teuchos::rcp(new StepperRKObserverComposite<Scalar>());
57  this->setObserver(obs);
58  this->setAppAction(Teuchos::null);
59 
60  if (appModel != Teuchos::null) {
61  this->setModel(appModel);
62  this->initialize();
63  }
64 }
65 #endif
66 template<class Scalar>
68  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
69  bool useFSAL,
70  std::string ICConsistency,
71  bool ICConsistencyCheck,
72  bool useEmbedded,
73  const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction)
74 {
75  this->setUseFSAL( useFSAL);
76  this->setICConsistency( ICConsistency);
77  this->setICConsistencyCheck( ICConsistencyCheck);
78  this->setUseEmbedded( useEmbedded);
79 
80  this->setStageNumber(-1);
81 
82 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
83  this->setObserver();
84 #endif
85  this->setAppAction(stepperRKAppAction);
86 
87  if (appModel != Teuchos::null) {
88  this->setModel(appModel);
89  this->initialize();
90  }
91 }
92 
93 
94 template<class Scalar>
96  const Teuchos::RCP<SolutionHistory<Scalar> >& sh) const
97 {
98 
99  Scalar dt = Scalar(1.0e+99);
100  if (!this->getUseEmbedded()) return dt;
101 
102  Teuchos::RCP<SolutionState<Scalar> > currentState=sh->getCurrentState();
103  const int order = currentState->getOrder();
104  const Scalar time = currentState->getTime();
105  const Scalar errorRel = currentState->getTolRel();
106  const Scalar errorAbs = currentState->getTolAbs();
107 
108  Teuchos::RCP<Thyra::VectorBase<Scalar> > stageX, scratchX;
109  stageX = Thyra::createMember(this->appModel_->get_f_space());
110  scratchX = Thyra::createMember(this->appModel_->get_f_space());
111  Thyra::assign(stageX.ptr(), *(currentState->getX()));
112 
113  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageXDot(2);
114  for (int i=0; i<2; ++i) {
115  stageXDot[i] = Thyra::createMember(this->appModel_->get_f_space());
116  assign(stageXDot[i].ptr(), Teuchos::ScalarTraits<Scalar>::zero());
117  }
118 
119  // A: one function evaluation at F(t_0, X_0)
120  typedef Thyra::ModelEvaluatorBase MEB;
121  MEB::InArgs<Scalar> inArgs = this->appModel_->getNominalValues();
122  MEB::OutArgs<Scalar> outArgs = this->appModel_->createOutArgs();
123  inArgs.set_x(stageX);
124  if (inArgs.supports(MEB::IN_ARG_t)) inArgs.set_t(time);
125  if (inArgs.supports(MEB::IN_ARG_x_dot)) inArgs.set_x_dot(Teuchos::null);
126  outArgs.set_f(stageXDot[0]); // K1
127  this->appModel_->evalModel(inArgs, outArgs);
128 
129  auto err_func = [] (Teuchos::RCP<Thyra::VectorBase<Scalar> > U,
130  const Scalar rtol, const Scalar atol,
131  Teuchos::RCP<Thyra::VectorBase<Scalar> > absU)
132  {
133  // compute err = Norm_{WRMS} with w = Atol + Rtol * | U |
134  Thyra::assign(absU.ptr(), *U);
135  Thyra::abs(*U, absU.ptr()); // absU = | X0 |
136  Thyra::Vt_S(absU.ptr(), rtol); // absU *= Rtol
137  Thyra::Vp_S(absU.ptr(), atol); // absU += Atol
138  Thyra::ele_wise_divide(Teuchos::as<Scalar>(1.0), *U, *absU, absU.ptr());
139  Scalar err = Thyra::norm_inf(*absU);
140  return err;
141  };
142 
143  Scalar d0 = err_func(stageX, errorRel, errorAbs, scratchX);
144  Scalar d1 = err_func(stageXDot[0], errorRel, errorAbs, scratchX);
145 
146  // b) first guess for the step size
147  dt = Teuchos::as<Scalar>(0.01)*(d0/d1);
148 
149  // c) perform one explicit Euler step (X_1)
150  Thyra::Vp_StV(stageX.ptr(), dt, *(stageXDot[0]));
151 
152  // compute F(t_0 + dt, X_1)
153  inArgs.set_x(stageX);
154  if (inArgs.supports(MEB::IN_ARG_t)) inArgs.set_t(time + dt);
155  if (inArgs.supports(MEB::IN_ARG_x_dot)) inArgs.set_x_dot(Teuchos::null);
156  outArgs.set_f(stageXDot[1]); // K2
157  this->appModel_->evalModel(inArgs, outArgs);
158 
159  // d) compute estimate of the second derivative of the solution
160  // d2 = || f(t_0 + dt, X_1) - f(t_0, X_0) || / dt
161  Teuchos::RCP<Thyra::VectorBase<Scalar> > errX;
162  errX = Thyra::createMember(this->appModel_->get_f_space());
163  assign(errX.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
164  Thyra::V_VmV(errX.ptr(), *(stageXDot[1]), *(stageXDot[0]));
165  Scalar d2 = err_func(errX, errorRel, errorAbs, scratchX) / dt;
166 
167  // e) compute step size h_1 (from m = 0 order Taylor series)
168  Scalar max_d1_d2 = std::max(d1, d2);
169  Scalar h1 = std::pow((0.01/max_d1_d2),(1.0/(order+1)));
170 
171  // f) propose starting step size
172  dt = std::min(100*dt, h1);
173  return dt;
174 }
175 
176 
177 template<class Scalar>
179  Teuchos::RCP<Teuchos::ParameterList> pl) const
180 {
181  getValidParametersBasic(pl, this->getStepperType());
182  pl->set<bool>("Use Embedded", false,
183  "'Whether to use Embedded Stepper (if available) or not\n"
184  " 'true' - Stepper will compute embedded solution and is adaptive.\n"
185  " 'false' - Stepper is not embedded(adaptive).\n");
186  pl->set<std::string>("Description", this->getDescription());
187 }
188 
189 
190 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
191 template<class Scalar>
193  Teuchos::RCP<StepperObserver<Scalar> > obs)
194 {
195  if (this->stepperObserver_ == Teuchos::null)
196  this->stepperObserver_ =
197  Teuchos::rcp(new StepperRKObserverComposite<Scalar>());
198 
199  if (( obs == Teuchos::null ) and (this->stepperObserver_->getSize() >0 ) )
200  return;
201 
202  if (( obs == Teuchos::null ) and (this->stepperObserver_->getSize() == 0) )
203  obs = Teuchos::rcp(new StepperRKObserver<Scalar>());
204 
205  // Check that this casts to prevent a runtime error if it doesn't
206  if (Teuchos::rcp_dynamic_cast<StepperRKObserver<Scalar> > (obs) != Teuchos::null) {
207  this->stepperObserver_->addObserver(
208  Teuchos::rcp_dynamic_cast<StepperRKObserver<Scalar> > (obs, true) );
209  } else {
210  Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
211  Teuchos::OSTab ostab(out,0,"setObserver");
212  *out << "Tempus::StepperExplicit_RK::setObserver: Warning: An observer has been provided that";
213  *out << " does not support Tempus::StepperRKObserver. This observer WILL NOT be added.";
214  *out << " In the future, this will result in a runtime error!" << std::endl;
215  }
216 
217  this->isInitialized_ = false;
218 }
219 #endif
220 
221 
222 template<class Scalar>
224 {
225  TEUCHOS_TEST_FOR_EXCEPTION( this->tableau_ == Teuchos::null, std::logic_error,
226  "Error - Need to set the tableau, before calling "
227  "StepperExplicitRK::initialize()\n");
228 
229  TEUCHOS_TEST_FOR_EXCEPTION( this->appModel_==Teuchos::null, std::logic_error,
230  "Error - Need to set the model, setModel(), before calling "
231  "StepperExplicitRK::initialize()\n");
232 
233  // Initialize the stage vectors
234  int numStages = this->tableau_->numStages();
235  stageXDot_.resize(numStages);
236  for (int i=0; i<numStages; ++i) {
237  stageXDot_[i] = Thyra::createMember(this->appModel_->get_f_space());
238  assign(stageXDot_[i].ptr(), Teuchos::ScalarTraits<Scalar>::zero());
239  }
240 
241  if ( this->tableau_->isEmbedded() and this->getUseEmbedded() ){
242  ee_ = Thyra::createMember(this->appModel_->get_f_space());
243  abs_u0 = Thyra::createMember(this->appModel_->get_f_space());
244  abs_u = Thyra::createMember(this->appModel_->get_f_space());
245  sc = Thyra::createMember(this->appModel_->get_f_space());
246  }
247 
249 }
250 
251 
252 template<class Scalar>
254  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
255 {
256  using Teuchos::RCP;
257 
258  RCP<SolutionState<Scalar> > initialState = solutionHistory->getCurrentState();
259 
260  // Check if we need Stepper storage for xDot
261  if (initialState->getXDot() == Teuchos::null)
262  this->setStepperXDot(stageXDot_.back());
263 
265 }
266 
267 
268 template<class Scalar>
270  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
271 {
272  this->checkInitialized();
273 
274  using Teuchos::RCP;
275 
276  TEMPUS_FUNC_TIME_MONITOR("Tempus::StepperExplicitRK::takeStep()");
277  {
278  TEUCHOS_TEST_FOR_EXCEPTION(solutionHistory->getNumStates() < 2,
279  std::logic_error,
280  "Error - StepperExplicitRK<Scalar>::takeStep(...)\n"
281  "Need at least two SolutionStates for ExplicitRK.\n"
282  " Number of States = " << solutionHistory->getNumStates() << "\n"
283  "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
284  " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
285 
286 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
287  this->stepperObserver_->observeBeginTakeStep(solutionHistory, *this);
288 #endif
289  RCP<StepperExplicitRK<Scalar> > thisStepper = Teuchos::rcpFromRef(*this);
290  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
292 
293  RCP<SolutionState<Scalar> > currentState=solutionHistory->getCurrentState();
294  RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
295  const Scalar dt = workingState->getTimeStep();
296  const Scalar time = currentState->getTime();
297 
298  const int numStages = this->tableau_->numStages();
299  Teuchos::SerialDenseMatrix<int,Scalar> A = this->tableau_->A();
300  Teuchos::SerialDenseVector<int,Scalar> b = this->tableau_->b();
301  Teuchos::SerialDenseVector<int,Scalar> c = this->tableau_->c();
302 
303  this->stageX_ = workingState->getX();
304  Thyra::assign(this->stageX_.ptr(), *(currentState->getX()));
305 
306  // Compute stage solutions
307  for (int i=0; i < numStages; ++i) {
308  this->setStageNumber(i);
309 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
310  this->stepperObserver_->observeBeginStage(solutionHistory, *this);
311 
312  // ???: is it a good idea to leave this (no-op) here?
313  this->stepperObserver_
314  ->observeBeforeImplicitExplicitly(solutionHistory, *this);
315 
316  // ???: is it a good idea to leave this (no-op) here?
317  this->stepperObserver_->observeBeforeSolve(solutionHistory, *this);
318 #endif
319  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
321  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
323 
324  if ( i == 0 && this->getUseFSAL() &&
325  workingState->getNConsecutiveFailures() == 0 ) {
326 
327  RCP<Thyra::VectorBase<Scalar> > tmp = stageXDot_[0];
328  stageXDot_[0] = stageXDot_.back();
329  stageXDot_.back() = tmp;
330 
331  } else {
332 
333  Thyra::assign(this->stageX_.ptr(), *(currentState->getX()));
334  for (int j=0; j < i; ++j) {
335  if (A(i,j) != Teuchos::ScalarTraits<Scalar>::zero()) {
336  Thyra::Vp_StV(this->stageX_.ptr(), dt*A(i,j), *stageXDot_[j]);
337  }
338  }
339  const Scalar ts = time + c(i)*dt;
340 
341 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
342  // ???: is it a good idea to leave this (no-op) here?
343  this->stepperObserver_->observeAfterSolve(solutionHistory, *this);
344 
345  this->stepperObserver_->observeBeforeExplicit(solutionHistory, *this);
346 #endif
347  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
349  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
351 
352  auto p = Teuchos::rcp(new ExplicitODEParameters<Scalar>(dt));
353 
354  // Evaluate xDot = f(x,t).
355  this->evaluateExplicitODE(stageXDot_[i], this->stageX_, ts, p);
356  }
357 
358 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
359  this->stepperObserver_->observeEndStage(solutionHistory, *this);
360 #endif
361  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
363  }
364 
365  // Sum for solution: x_n = x_n-1 + Sum{ b(i) * dt*f(i) }
366  Thyra::assign((workingState->getX()).ptr(), *(currentState->getX()));
367  for (int i=0; i < numStages; ++i) {
368  if (b(i) != Teuchos::ScalarTraits<Scalar>::zero()) {
369  Thyra::Vp_StV((workingState->getX()).ptr(), dt*b(i), *(stageXDot_[i]));
370  }
371  }
372 
373 
374  // At this point, the stepper has passed.
375  // But when using adaptive time stepping, the embedded method
376  // can change the step status
377  workingState->setSolutionStatus(Status::PASSED);
378 
379  if (this->tableau_->isEmbedded() and this->getUseEmbedded()) {
380 
381  const Scalar tolRel = workingState->getTolRel();
382  const Scalar tolAbs = workingState->getTolAbs();
383 
384  // just compute the error weight vector
385  // (all that is needed is the error, and not the embedded solution)
386  Teuchos::SerialDenseVector<int,Scalar> errWght = b ;
387  errWght -= this->tableau_->bstar();
388 
389  //compute local truncation error estimate: | u^{n+1} - \hat{u}^{n+1} |
390  // Sum for solution: ee_n = Sum{ (b(i) - bstar(i)) * dt*f(i) }
391  assign(ee_.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
392  for (int i=0; i < numStages; ++i) {
393  if (errWght(i) != Teuchos::ScalarTraits<Scalar>::zero()) {
394  Thyra::Vp_StV(ee_.ptr(), dt*errWght(i), *(stageXDot_[i]));
395  }
396  }
397 
398  // compute: Atol + max(|u^n|, |u^{n+1}| ) * Rtol
399  Thyra::abs( *(currentState->getX()), abs_u0.ptr());
400  Thyra::abs( *(workingState->getX()), abs_u.ptr());
401  Thyra::pair_wise_max_update(tolRel, *abs_u0, abs_u.ptr());
402  Thyra::add_scalar(tolAbs, abs_u.ptr());
403 
404  //compute: || ee / sc ||
405  assign(sc.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
406  Thyra::ele_wise_divide(Teuchos::as<Scalar>(1.0), *ee_, *abs_u, sc.ptr());
407  Scalar err = std::abs(Thyra::norm_inf(*sc));
408  workingState->setErrorRel(err);
409 
410  // test if step should be rejected
411  if (std::isinf(err) || std::isnan(err) || err > Teuchos::as<Scalar>(1.0))
412  workingState->setSolutionStatus(Status::FAILED);
413  }
414 
415  workingState->setOrder(this->getOrder());
416  workingState->computeNorms(currentState);
417 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
418  this->stepperObserver_->observeEndTakeStep(solutionHistory, *this);
419 #endif
420  this->stepperRKAppAction_->execute(solutionHistory, thisStepper,
422  }
423  // reset the stage number
424  this->setStageNumber(-1);
425  return;
426 }
427 
428 
429 /** \brief Provide a StepperState to the SolutionState.
430  * This Stepper does not have any special state data,
431  * so just provide the base class StepperState with the
432  * Stepper description. This can be checked to ensure
433  * that the input StepperState can be used by this Stepper.
434  */
435 template<class Scalar>
436 Teuchos::RCP<Tempus::StepperState<Scalar> > StepperExplicitRK<Scalar>::
438 {
439  Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
440  rcp(new StepperState<Scalar>(this->getStepperType()));
441  return stepperState;
442 }
443 
444 
445 template<class Scalar>
447  Teuchos::FancyOStream &out,
448  const Teuchos::EVerbosityLevel verbLevel) const
449 {
450  out << std::endl;
451  Stepper<Scalar>::describe(out, verbLevel);
452  StepperExplicit<Scalar>::describe(out, verbLevel);
453 
454  out << "--- StepperExplicitRK ---\n";
455  if (this->tableau_ != Teuchos::null) this->tableau_->describe(out, verbLevel);
456  out << " tableau_ = " << this->tableau_ << std::endl;
457 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
458  out << " stepperObserver_ = " << stepperObserver_ << std::endl;
459 #endif
460  out << " stepperRKAppAction_= " << this->stepperRKAppAction_ << std::endl;
461  out << " stageX_ = " << this->stageX_ << std::endl;
462  out << " stageXDot_.size() = " << stageXDot_.size() << std::endl;
463  const int numStages = stageXDot_.size();
464  for (int i=0; i<numStages; ++i)
465  out << " stageXDot_["<<i<<"] = " << stageXDot_[i] << std::endl;
466  out << " useEmbedded_ = "
467  << Teuchos::toString(useEmbedded_) << std::endl;
468  out << " ee_ = " << ee_ << std::endl;
469  out << " abs_u0 = " << abs_u0 << std::endl;
470  out << " abs_u = " << abs_u << std::endl;
471  out << " sc = " << sc << std::endl;
472  out << "-------------------------" << std::endl;
473 }
474 
475 
476 template<class Scalar>
477 bool StepperExplicitRK<Scalar>::isValidSetup(Teuchos::FancyOStream & out) const
478 {
479  bool isValidSetup = true;
480 
481  if ( !Stepper<Scalar>::isValidSetup(out) ) isValidSetup = false;
482  if ( !StepperExplicit<Scalar>::isValidSetup(out) ) isValidSetup = false;
483 
484  if (this->tableau_ == Teuchos::null) {
485  isValidSetup = false;
486  out << "The tableau is not set!\n";
487  }
488 
489 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
490  if (stepperObserver_ == Teuchos::null) {
491  isValidSetup = false;
492  out << "The observer is not set!\n";
493  }
494 #endif
495  if (this->stepperRKAppAction_ == Teuchos::null) {
496  isValidSetup = false;
497  out << "The AppAction is not set!\n";
498  }
499 
500  return isValidSetup;
501 }
502 
503 
504 template<class Scalar>
505 Teuchos::RCP<const Teuchos::ParameterList>
507 {
508  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
509  this->getValidParametersBasicERK(pl);
510  return pl;
511 }
512 
513 
514 } // namespace Tempus
515 #endif // Tempus_StepperExplicitRK_impl_hpp
virtual void setupDefault()
Default setup for constructor.
const std::string toString(const Status status)
Convert Status to string.
virtual Scalar getInitTimeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void initialize()
Initialize after construction and changing input parameters.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual void setup(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel, const Teuchos::RCP< StepperRKObserverComposite< Scalar > > &obs, bool useFSAL, std::string ICConsistency, bool ICConsistencyCheck, bool useEmbedded)
Setup for constructor.
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
Thyra Base interface for time steppers.
StepperState is a simple class to hold state information about the stepper.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Application Action for StepperRKBase.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions, make them consistent, and set needed memory.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
StepperObserver class for Stepper class.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
void getValidParametersBasicERK(Teuchos::RCP< Teuchos::ParameterList > pl) const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
virtual void initialize()
Initialize during construction and after changing input parameters.
StepperRKObserver class for StepperRK.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
Thyra Base interface for implicit time steppers.
void getValidParametersBasic(Teuchos::RCP< Teuchos::ParameterList > pl, std::string stepperType)
Provide basic parameters to Steppers.