Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Tempus_StepperNewmarkImplicitDForm_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_StepperNewmarkImplicitDForm_impl_hpp
10 #define Tempus_StepperNewmarkImplicitDForm_impl_hpp
11 
12 #include "NOX_Thyra.H"
14 #include "Tempus_config.hpp"
15 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
16 
17 //#define VERBOSE_DEBUG_OUTPUT
18 //#define DEBUG_OUTPUT
19 
20 namespace Tempus {
21 
22 // Forward Declaration for recursive includes (this Stepper <--> StepperFactory)
23 template <class Scalar>
24 class StepperFactory;
25 
26 template <class Scalar>
27 void
29  Thyra::VectorBase<Scalar>& vPred, const Thyra::VectorBase<Scalar>& v,
30  const Thyra::VectorBase<Scalar>& a, const Scalar dt) const {
31 #ifdef VERBOSE_DEBUG_OUTPUT
32  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
33 #endif
34  // vPred = v + dt*(1.0-gamma_)*a
35  Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt * (1.0 - gamma_), a);
36 }
37 
38 template <class Scalar>
39 void
41  Thyra::VectorBase<Scalar>& dPred, const Thyra::VectorBase<Scalar>& d,
42  const Thyra::VectorBase<Scalar>& v, const Thyra::VectorBase<Scalar>& a,
43  const Scalar dt) const {
44 #ifdef VERBOSE_DEBUG_OUTPUT
45  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
46 #endif
47  Teuchos::RCP<const Thyra::VectorBase<Scalar>> tmp =
48  Thyra::createMember<Scalar>(dPred.space());
49  // dPred = dt*v + dt*dt/2.0*(1.0-2.0*beta_)*a
50  Scalar aConst = dt * dt / 2.0 * (1.0 - 2.0 * beta_);
51  Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
52  // dPred += d;
53  Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
54 }
55 
56 template <class Scalar>
57 void
59  Thyra::VectorBase<Scalar>& v, const Thyra::VectorBase<Scalar>& vPred,
60  const Thyra::VectorBase<Scalar>& a, const Scalar dt) const {
61 #ifdef VERBOSE_DEBUG_OUTPUT
62  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
63 #endif
64  // v = vPred + dt*gamma_*a
65  Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt * gamma_, a);
66 }
67 
68 template <class Scalar>
69 void
71  Thyra::VectorBase<Scalar>& d, const Thyra::VectorBase<Scalar>& dPred,
72  const Thyra::VectorBase<Scalar>& a, const Scalar dt) const {
73 #ifdef VERBOSE_DEBUG_OUTPUT
74  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
75 #endif
76  // d = dPred + beta_*dt*dt*a
77  Thyra::V_StVpStV(Teuchos::ptrFromRef(d), 1.0, dPred, beta_ * dt * dt, a);
78 }
79 
80 template <class Scalar>
81 void
83  Thyra::VectorBase<Scalar>& a, const Thyra::VectorBase<Scalar>& dPred,
84  const Thyra::VectorBase<Scalar>& d, const Scalar dt) const {
85 #ifdef VERBOSE_DEBUG_OUTPUT
86  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
87 #endif
88  // a = (d - dPred) / (beta_*dt*dt)
89  Scalar const c = 1.0 / beta_ / dt / dt;
90  Thyra::V_StVpStV(Teuchos::ptrFromRef(a), c, d, -c, dPred);
91 }
92 
93 template <class Scalar>
95  : out_(Teuchos::VerboseObjectBase::getDefaultOStream()) {
96 #ifdef VERBOSE_DEBUG_OUTPUT
97  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
98 #endif
99 
100  this->setParameterList(Teuchos::null);
101  this->modelWarning();
102 }
103 
104 template <class Scalar>
106  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar>>& appModel,
107  Teuchos::RCP<Teuchos::ParameterList> pList)
108  : out_(Teuchos::VerboseObjectBase::getDefaultOStream()) {
109 #ifdef VERBOSE_DEBUG_OUTPUT
110  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
111 #endif
112 
113  this->setParameterList(pList);
114 
115  if (appModel == Teuchos::null) {
116  this->modelWarning();
117  }
118  else {
119  this->setModel(appModel);
120  this->initialize();
121  }
122 }
123 
124 template <class Scalar>
125 void
127  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar>>& appModel) {
128 #ifdef VERBOSE_DEBUG_OUTPUT
129  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
130 #endif
131  this->validSecondOrderODE_DAE(appModel);
132  Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
134  appModel, "Newmark Implicit d-Form"));
135  this->wrapperModel_ = wrapperModel;
136  inArgs_ = this->wrapperModel_->getNominalValues();
137  outArgs_ = this->wrapperModel_->createOutArgs();
138 }
139 
140 template <class Scalar>
141 void
143 {
144  TEUCHOS_TEST_FOR_EXCEPTION( this->wrapperModel_ == Teuchos::null,
145  std::logic_error,
146  "Error - Need to set the model, setModel(), before calling "
147  "StepperNewmarkImplicitDForm::initialize()\n");
148 
149 #ifdef VERBOSE_DEBUG_OUTPUT
150  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
151 #endif
152  this->setParameterList(this->stepperPL_);
153  this->setSolver();
154 }
155 
156 template <class Scalar>
157 void
159  const Teuchos::RCP<SolutionHistory<Scalar>>& solutionHistory) {
160 #ifdef VERBOSE_DEBUG_OUTPUT
161  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
162 #endif
163  using Teuchos::RCP;
164 
165  TEMPUS_FUNC_TIME_MONITOR("Tempus::StepperNewmarkImplicitDForm::takeStep()");
166  {
167  TEUCHOS_TEST_FOR_EXCEPTION(solutionHistory->getNumStates() < 2,
168  std::logic_error,
169  "Error - StepperNewmarkImplicitDForm<Scalar>::takeStep(...)\n"
170  "Need at least two SolutionStates for NewmarkImplicitDForm.\n"
171  " Number of States = " << solutionHistory->getNumStates() << "\n"
172  "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
173  " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
174 
175  RCP<SolutionState<Scalar>> workingState =solutionHistory->getWorkingState();
176  RCP<SolutionState<Scalar>> currentState =solutionHistory->getCurrentState();
177 
178  Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
179  Teuchos::rcp_dynamic_cast<WrapperModelEvaluatorSecondOrder<Scalar> >(
180  this->wrapperModel_);
181 
182  // Get values of d, v and a from previous step
183  RCP<const Thyra::VectorBase<Scalar>> d_old = currentState->getX();
184  RCP<Thyra::VectorBase<Scalar>> v_old = currentState->getXDot();
185  RCP<Thyra::VectorBase<Scalar>> a_old = currentState->getXDotDot();
186 
187  // Get new values of d, v and a from current workingState
188  //(to be updated here)
189  RCP<Thyra::VectorBase<Scalar>> d_new = workingState->getX();
190  RCP<Thyra::VectorBase<Scalar>> v_new = workingState->getXDot();
191  RCP<Thyra::VectorBase<Scalar>> a_new = workingState->getXDotDot();
192 
193  // Get time and dt
194  const Scalar time = currentState->getTime();
195  const Scalar dt = workingState->getTimeStep();
196  // Update time
197  Scalar t = time + dt;
198 
199 
200 #ifdef DEBUG_OUTPUT
201  Teuchos::Range1D range;
202 
203  *out_ << "\n*** d_old ***\n";
204  RTOpPack::ConstSubVectorView<Scalar> dov;
205  d_old->acquireDetachedView(range, &dov);
206  auto doa = dov.values();
207  for (auto i = 0; i < doa.size(); ++i) *out_ << doa[i] << " ";
208  *out_ << "\n*** d_old ***\n";
209 
210  *out_ << "\n*** v_old ***\n";
211  RTOpPack::ConstSubVectorView<Scalar> vov;
212  v_old->acquireDetachedView(range, &vov);
213  auto voa = vov.values();
214  for (auto i = 0; i < voa.size(); ++i) *out_ << voa[i] << " ";
215  *out_ << "\n*** v_old ***\n";
216 
217  *out_ << "\n*** a_old ***\n";
218  RTOpPack::ConstSubVectorView<Scalar> aov;
219  a_old->acquireDetachedView(range, &aov);
220  auto aoa = aov.values();
221  for (auto i = 0; i < aoa.size(); ++i) *out_ << aoa[i] << " ";
222  *out_ << "\n*** a_old ***\n";
223 #endif
224 
225  // allocate d and v predictors
226  RCP<Thyra::VectorBase<Scalar>> d_pred = Thyra::createMember(d_old->space());
227  RCP<Thyra::VectorBase<Scalar>> v_pred = Thyra::createMember(v_old->space());
228 
229  // compute displacement and velocity predictors
230  predictDisplacement(*d_pred, *d_old, *v_old, *a_old, dt);
231  predictVelocity(*v_pred, *v_old, *a_old, dt);
232 
233 #ifdef DEBUG_OUTPUT
234  *out_ << "\n*** d_pred ***\n";
235  RTOpPack::ConstSubVectorView<Scalar> dpv;
236  d_pred->acquireDetachedView(range, &dpv);
237  auto dpa = dpv.values();
238  for (auto i = 0; i < dpa.size(); ++i) *out_ << dpa[i] << " ";
239  *out_ << "\n*** d_pred ***\n";
240 
241  *out_ << "\n*** v_pred ***\n";
242  RTOpPack::ConstSubVectorView<Scalar> vpv;
243  v_pred->acquireDetachedView(range, &vpv);
244  auto vpa = vpv.values();
245  for (auto i = 0; i < vpa.size(); ++i) *out_ << vpa[i] << " ";
246  *out_ << "\n*** v_pred ***\n";
247 
248 #endif
249  // inject d_pred, v_pred, a and other relevant data into wrapperModel
250  wrapperModel->initializeNewmark(v_pred, d_pred, dt, t, beta_, gamma_);
251 
252  // create initial guess in NOX solver
253  RCP<Thyra::VectorBase<Scalar>> initial_guess = Thyra::createMember(d_pred->space());
254  if ((time == solutionHistory->minTime()) && (this->initial_guess_ != Teuchos::null)) {
255  //if first time step and initial_guess_ is provided, set initial_guess = initial_guess_
256  //Throw an exception if initial_guess is not compatible with solution
257  bool is_compatible = (initial_guess->space())->isCompatible(*this->initial_guess_->space());
258  TEUCHOS_TEST_FOR_EXCEPTION(
259  is_compatible != true, std::logic_error,
260  "Error in Tempus::NemwarkImplicitDForm takeStep(): user-provided initial guess'!\n"
261  << "for Newton is not compatible with solution vector!\n");
262  Thyra::copy(*this->initial_guess_, initial_guess.ptr());
263  }
264  else {
265  //Otherwise, set initial guess = diplacement predictor
266  Thyra::copy(*d_pred, initial_guess.ptr());
267  }
268 
269  //Set d_pred as initial guess for NOX solver, and solve nonlinear system.
270  const Thyra::SolveStatus<Scalar> sStatus =
271  this->solveImplicitODE(initial_guess);
272 
273  workingState->setSolutionStatus(sStatus); // Converged --> pass.
274 
275  //solveImplicitODE will return converged solution in initial_guess
276  //vector. Copy it here to d_new, to define the new displacement.
277  Thyra::copy(*initial_guess, d_new.ptr());
278 
279  //correct acceleration, velocity
280  correctAcceleration(*a_new, *d_pred, *d_new, dt);
281  correctVelocity(*v_new, *v_pred, *a_new, dt);
282 
283 #ifdef DEBUG_OUTPUT
284  *out_ << "\n*** d_new ***\n";
285  RTOpPack::ConstSubVectorView<Scalar> dnv;
286  d_new->acquireDetachedView(range, &dnv);
287  auto dna = dnv.values();
288  for (auto i = 0; i < dna.size(); ++i) *out_ << dna[i] << " ";
289  *out_ << "\n*** d_new ***\n";
290 
291  *out_ << "\n*** v_new ***\n";
292  RTOpPack::ConstSubVectorView<Scalar> vnv;
293  v_new->acquireDetachedView(range, &vnv);
294  auto vna = vnv.values();
295  for (auto i = 0; i < vna.size(); ++i) *out_ << vna[i] << " ";
296  *out_ << "\n*** v_new ***\n";
297 
298  *out_ << "\n*** a_new ***\n";
299  RTOpPack::ConstSubVectorView<Scalar> anv;
300  a_new->acquireDetachedView(range, &anv);
301  auto ana = anv.values();
302  for (auto i = 0; i < ana.size(); ++i) *out_ << ana[i] << " ";
303  *out_ << "\n*** a_new ***\n";
304 #endif
305 
306  workingState->setOrder(this->getOrder());
307  }
308  return;
309 }
310 
311 /** \brief Provide a StepperState to the SolutionState.
312  * This Stepper does not have any special state data,
313  * so just provide the base class StepperState with the
314  * Stepper description. This can be checked to ensure
315  * that the input StepperState can be used by this Stepper.
316  */
317 template <class Scalar>
318 Teuchos::RCP<Tempus::StepperState<Scalar>>
320 #ifdef VERBOSE_DEBUG_OUTPUT
321  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
322 #endif
323  Teuchos::RCP<Tempus::StepperState<Scalar>> stepperState =
324  rcp(new StepperState<Scalar>(description()));
325  return stepperState;
326 }
327 
328 template <class Scalar>
329 std::string
331 #ifdef VERBOSE_DEBUG_OUTPUT
332  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
333 #endif
334  std::string name = "Newmark Implicit d-Form";
335  return (name);
336 }
337 
338 template <class Scalar>
339 void
341  Teuchos::FancyOStream& out,
342  const Teuchos::EVerbosityLevel /* verbLevel */) const {
343 #ifdef VERBOSE_DEBUG_OUTPUT
344  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
345 #endif
346  out << description() << "::describe:" << std::endl
347  << "wrapperModel_ = " << this->wrapperModel_->description() << std::endl;
348 }
349 
350 template <class Scalar>
351 void
353  Teuchos::RCP<Teuchos::ParameterList> const& pList) {
354 #ifdef VERBOSE_DEBUG_OUTPUT
355  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
356 #endif
357  if (pList == Teuchos::null) {
358  // Create default parameters if null, otherwise keep current parameters.
359  if (this->stepperPL_ == Teuchos::null) this->stepperPL_ = this->getDefaultParameters();
360  } else {
361  this->stepperPL_ = pList;
362  }
363  // Can not validate because of optional Parameters.
364  // stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
365  // Get beta and gamma from parameter list
366  // IKT, FIXME: does parameter list get validated somewhere?
367  // validateParameters above is commented out...
368 
369  Teuchos::RCP<Teuchos::ParameterList> stepperPL = this->stepperPL_;
370  std::string stepperType = stepperPL->get<std::string>("Stepper Type");
371  TEUCHOS_TEST_FOR_EXCEPTION(
372  stepperType != "Newmark Implicit d-Form", std::logic_error,
373  "Error - Stepper Type is not 'Newmark Implicit d-Form'!\n"
374  << " Stepper Type = " << stepperPL->get<std::string>("Stepper Type")
375  << "\n");
376  beta_ = 0.25; // default value
377  gamma_ = 0.5; // default value
378  Teuchos::VerboseObjectBase::getDefaultOStream();
379  if (this->stepperPL_->isSublist("Newmark Parameters")) {
380  Teuchos::ParameterList& newmarkPL =
381  this->stepperPL_->sublist("Newmark Parameters", true);
382  std::string scheme_name = newmarkPL.get("Scheme Name", "Not Specified");
383  if (scheme_name == "Not Specified") {
384  beta_ = newmarkPL.get("Beta", 0.25);
385  gamma_ = newmarkPL.get("Gamma", 0.5);
386  TEUCHOS_TEST_FOR_EXCEPTION(
387  (beta_ > 1.0) || (beta_ < 0.0), std::logic_error,
388  "\nError in 'Newmark Implicit d-Form' stepper: invalid value of Beta = "
389  << beta_ << ". Please select Beta >= 0 and <= 1. \n");
390  TEUCHOS_TEST_FOR_EXCEPTION(
391  (gamma_ > 1.0) || (gamma_ < 0.0), std::logic_error,
392  "\nError in 'Newmark Implicit d-Form' stepper: invalid value of Gamma = "
393  << gamma_ << ". Please select Gamma >= 0 and <= 1. \n");
394  *out_ << "\nSetting Beta = " << beta_ << " and Gamma = " << gamma_
395  << " from Newmark Parameters in input file.\n";
396  } else {
397  *out_ << "\nScheme Name = " << scheme_name << ". Using values \n"
398  << "of Beta and Gamma for this scheme (ignoring values of Beta and "
399  "Gamma \n"
400  << "in input file, if provided).\n";
401  if (scheme_name == "Average Acceleration") {
402  beta_ = 0.25;
403  gamma_ = 0.5;
404  } else if (scheme_name == "Linear Acceleration") {
405  beta_ = 0.25;
406  gamma_ = 1.0 / 6.0;
407  } else if (scheme_name == "Central Difference") {
408  beta_ = 0.0;
409  gamma_ = 0.5;
410  } else {
411  TEUCHOS_TEST_FOR_EXCEPTION(
412  true, std::logic_error,
413  "\nError in Tempus::StepperNewmarkImplicitDForm! Invalid Scheme Name = "
414  << scheme_name << ". \n"
415  << "Valid Scheme Names are: 'Average Acceleration', 'Linear "
416  "Acceleration', \n"
417  << "'Central Difference' and 'Not Specified'.\n");
418  }
419  *out_ << "===> Beta = " << beta_ << ", Gamma = " << gamma_ << "\n";
420  }
421  if (beta_ == 0.0) {
422  //IKT, FIXME - THROW EXCEPTION.
423  TEUCHOS_TEST_FOR_EXCEPTION(
424  true, std::logic_error,
425  "Error - d-Form of Newmark scheme is not defined for explicit (Beta = 0).\n");
426  }
427  } else {
428  *out_ << "\nNo Newmark Parameters sublist found in input file; using "
429  "default values of Beta = "
430  << beta_ << " and Gamma = " << gamma_ << ".\n";
431  }
432 }
433 
434 template <class Scalar>
435 Teuchos::RCP<const Teuchos::ParameterList>
437 #ifdef VERBOSE_DEBUG_OUTPUT
438  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
439 #endif
440  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
441  pl->setName("Default Stepper - " + this->description());
442  pl->set<std::string>("Stepper Type", this->description());
443  this->getValidParametersBasic(pl);
444  pl->set<bool> ("Zero Initial Guess", false);
445  pl->set<std::string>("Solver Name", "",
446  "Name of ParameterList containing the solver specifications.");
447 
448  return pl;
449 }
450 template <class Scalar>
451 Teuchos::RCP<Teuchos::ParameterList>
453 #ifdef VERBOSE_DEBUG_OUTPUT
454  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
455 #endif
456  using Teuchos::RCP;
457  using Teuchos::ParameterList;
458  using Teuchos::rcp_const_cast;
459 
460  RCP<ParameterList> pl =
461  rcp_const_cast<ParameterList>(this->getValidParameters());
462 
463  pl->set<std::string>("Solver Name", "Default Solver");
464  RCP<ParameterList> solverPL = this->defaultSolverParameters();
465  pl->set("Default Solver", *solverPL);
466 
467  return pl;
468 }
469 
470 template <class Scalar>
471 Teuchos::RCP<Teuchos::ParameterList>
473 #ifdef VERBOSE_DEBUG_OUTPUT
474  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
475 #endif
476  return (this->stepperPL_);
477 }
478 
479 template <class Scalar>
480 Teuchos::RCP<Teuchos::ParameterList>
482 #ifdef VERBOSE_DEBUG_OUTPUT
483  *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
484 #endif
485  Teuchos::RCP<Teuchos::ParameterList> temp_plist = this->stepperPL_;
486  this->stepperPL_ = Teuchos::null;
487  return (temp_plist);
488 }
489 
490 } // namespace Tempus
491 #endif // Tempus_StepperNewmarkImplicitDForm_impl_hpp
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
void correctVelocity(Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
virtual void modelWarning() const
void correctDisplacement(Thyra::VectorBase< Scalar > &d, const Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
virtual void initialize()
Initialize during construction and after changing input parameters.
A ModelEvaluator for residual evaluations given a state. This ModelEvaluator takes a state...
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
StepperState is a simple class to hold state information about the stepper.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar >> &solutionHistory)
Take the specified timestep, dt, and return true if successful.
void predictDisplacement(Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &d, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
void predictVelocity(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar >> &appModel)
void correctAcceleration(Thyra::VectorBase< Scalar > &a, const Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &d, const Scalar dt) const