Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Tempus_IntegratorBasic_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_IntegratorBasic_impl_hpp
10 #define Tempus_IntegratorBasic_impl_hpp
11 
12 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
13 #include "Teuchos_TimeMonitor.hpp"
15 #include "Tempus_TimeStepControl.hpp"
16 #include <ctime>
17 
18 
19 namespace Tempus {
20 
21 template<class Scalar>
23  Teuchos::RCP<Teuchos::ParameterList> inputPL,
24  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model)
25  : integratorObserver_(Teuchos::null),
26  integratorStatus_(WORKING), isInitialized_(false)
27 {
28  this->setTempusParameterList(inputPL);
29  this->setStepper(model);
30  this->initialize();
31 }
32 
33 
34 template<class Scalar>
36  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
37  std::string stepperType)
38  : integratorObserver_(Teuchos::null),
39  integratorStatus_(WORKING), isInitialized_(false)
40 {
41  using Teuchos::RCP;
42  RCP<StepperFactory<Scalar> > sf = Teuchos::rcp(new StepperFactory<Scalar>());
43  RCP<Stepper<Scalar> > stepper = sf->createStepper(stepperType, model);
44 
45  this->setTempusParameterList(Teuchos::null);
46  this->setStepperWStepper(stepper);
47  this->initialize();
48 }
49 
50 
51 template<class Scalar>
53  : integratorObserver_(Teuchos::null),
54  integratorStatus_(WORKING), isInitialized_(false)
55 {
56  this->setTempusParameterList(Teuchos::null);
57 }
58 
59 
60 template<class Scalar>
62  Teuchos::RCP<Teuchos::ParameterList> inputPL,
63  std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > > models)
64  : integratorObserver_(Teuchos::null),
65  integratorStatus_(WORKING), isInitialized_(false)
66 {
67  this->setTempusParameterList(inputPL);
68  this->setStepper(models);
69  this->initialize();
70 }
71 
72 
73 template<class Scalar>
75  Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > model)
76 {
77  using Teuchos::RCP;
78  using Teuchos::ParameterList;
79 
80  if (stepper_ == Teuchos::null) {
81  // Construct from Integrator ParameterList
82  RCP<StepperFactory<Scalar> > sf =Teuchos::rcp(new StepperFactory<Scalar>());
83  std::string stepperName = integratorPL_->get<std::string>("Stepper Name");
84 
85  RCP<ParameterList> stepperPL = Teuchos::sublist(tempusPL_,stepperName,true);
86  stepper_ = sf->createStepper(stepperPL, model);
87  } else {
88  stepper_->setModel(model);
89  }
90 }
91 
92 
93 template<class Scalar>
95  std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > > models)
96 {
97  using Teuchos::RCP;
98  using Teuchos::ParameterList;
99 
100  if (stepper_ == Teuchos::null) {
101  // Construct from Integrator ParameterList
102  RCP<StepperFactory<Scalar> > sf =Teuchos::rcp(new StepperFactory<Scalar>());
103  std::string stepperName = integratorPL_->get<std::string>("Stepper Name");
104 
105  RCP<ParameterList> stepperPL = Teuchos::sublist(tempusPL_,stepperName,true);
106  stepper_ = sf->createStepper(stepperPL, models);
107  } else {
108  stepper_->createSubSteppers(models);
109  }
110 }
111 
112 
113 template<class Scalar>
115  Teuchos::RCP<Stepper<Scalar> > newStepper)
116 {
117  stepper_ = newStepper;
118 }
119 
120 /// This resets the SolutionHistory and sets the first SolutionState as the IC.
121 template<class Scalar>
124 {
125  using Teuchos::RCP;
126  using Teuchos::ParameterList;
127 
128  // Construct from Integrator ParameterList
129  RCP<ParameterList> shPL =
130  Teuchos::sublist(integratorPL_, "Solution History", true);
131  solutionHistory_ = rcp(new SolutionHistory<Scalar>(shPL));
132 
133  if (state == Teuchos::null) {
134  // Construct default IC from the application model
135  RCP<SolutionState<Scalar> > newState = rcp(new SolutionState<Scalar>(
136  stepper_->getModel(), stepper_->getDefaultStepperState(), Teuchos::null));
137 
138  // Set SolutionState MetaData from TimeStepControl
139  newState->setTime (timeStepControl_->getInitTime());
140  newState->setIndex (timeStepControl_->getInitIndex());
141  newState->setTimeStep(timeStepControl_->getInitTimeStep());
142  newState->getMetaData()->setTolRel(timeStepControl_->getMaxRelError());
143  newState->getMetaData()->setTolAbs(timeStepControl_->getMaxAbsError());
144  int order = timeStepControl_->getInitOrder();
145  if (order == 0) order = stepper_->getOrder();
146  if (order < stepper_->getOrderMin()) order = stepper_->getOrderMin();
147  if (order > stepper_->getOrderMax()) order = stepper_->getOrderMax();
148  newState->setOrder(order);
149  newState->setSolutionStatus(Status::PASSED); // ICs are considered passing.
150 
151  solutionHistory_->addState(newState);
152 
153  } else {
154  // Use state as IC
155  solutionHistory_->addState(state);
156  }
157 
158  // Get IC from the application model via the stepper and ensure consistency.
159  stepper_->setInitialConditions(solutionHistory_);
160 }
161 
162 
163 template<class Scalar>
166  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x0,
167  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xdot0,
168  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xdotdot0)
169 {
170  using Teuchos::RCP;
171  using Teuchos::ParameterList;
172 
173  // Construct from Integrator ParameterList
174  RCP<ParameterList> shPL =
175  Teuchos::sublist(integratorPL_, "Solution History", true);
176  solutionHistory_ = rcp(new SolutionHistory<Scalar>(shPL));
177 
178  // Create and set xdot and xdotdot.
179  RCP<Thyra::VectorBase<Scalar> > xdot = x0->clone_v();
180  RCP<Thyra::VectorBase<Scalar> > xdotdot = x0->clone_v();
181  if (xdot0 == Teuchos::null)
182  Thyra::assign(xdot.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
183  else
184  Thyra::assign(xdot.ptr(), *(xdot0));
185  if (xdotdot0 == Teuchos::null)
186  Thyra::assign(xdotdot.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
187  else
188  Thyra::assign(xdotdot.ptr(), *(xdotdot0));
189 
190  RCP<SolutionState<Scalar> > newState = rcp(new SolutionState<Scalar>(
191  x0->clone_v(), xdot, xdotdot, stepper_->getDefaultStepperState()));
192 
193  // Set SolutionState MetaData from TimeStepControl
194  //newState->setTime (timeStepControl_->getInitTime());
195  newState->setTime (t0);
196  newState->setIndex (timeStepControl_->getInitIndex());
197  newState->setTimeStep(timeStepControl_->getInitTimeStep());
198  int order = timeStepControl_->getInitOrder();
199  if (order == 0) order = stepper_->getOrder();
200  if (order < stepper_->getOrderMin()) order = stepper_->getOrderMin();
201  if (order > stepper_->getOrderMax()) order = stepper_->getOrderMax();
202  newState->setOrder(order);
203 
204  newState->setSolutionStatus(Status::PASSED); // ICs are considered passing.
205 
206  solutionHistory_->addState(newState);
207 
208  // Get IC from the application model via the stepper and ensure consistency.
209  stepper_->setInitialConditions(solutionHistory_);
210 }
211 
212 
213 template<class Scalar>
215  Teuchos::RCP<SolutionHistory<Scalar> > sh)
216 {
217  using Teuchos::RCP;
218  using Teuchos::ParameterList;
219 
220  if (sh == Teuchos::null) {
221  // Create default SolutionHistory, otherwise keep current history.
222  if (solutionHistory_ == Teuchos::null) initializeSolutionHistory();
223  } else {
224 
225  TEUCHOS_TEST_FOR_EXCEPTION( sh->getNumStates() < 1,
226  std::out_of_range,
227  "Error - setSolutionHistory requires at least one SolutionState.\n"
228  << " Supplied SolutionHistory has only " << sh->getNumStates()
229  << " SolutionStates.\n");
230 
231  // Make integratorPL_ consistent with new SolutionHistory.
232  RCP<ParameterList> shPL = sh->getNonconstParameterList();
233  integratorPL_->set("Solution History", shPL->name());
234  integratorPL_->set(shPL->name(), *shPL);
235 
236  solutionHistory_ = sh;
237  }
238 }
239 
240 
241 template<class Scalar>
243  Teuchos::RCP<TimeStepControl<Scalar> > tsc)
244 {
245  using Teuchos::RCP;
246  using Teuchos::ParameterList;
247 
248  if (tsc == Teuchos::null) {
249  // Create timeStepControl_ if null, otherwise keep current parameters.
250  if (timeStepControl_ == Teuchos::null) {
251  if (integratorPL_->isSublist("Time Step Control")) {
252  // Construct from Integrator ParameterList
253  RCP<ParameterList> tscPL =
254  Teuchos::sublist(integratorPL_,"Time Step Control",true);
255  timeStepControl_ = rcp(new TimeStepControl<Scalar>(tscPL));
256  } else {
257  // Construct default TimeStepControl
258  timeStepControl_ = rcp(new TimeStepControl<Scalar>());
259  RCP<ParameterList> tscPL = timeStepControl_->getNonconstParameterList();
260  integratorPL_->set("Time Step Control", tscPL->name());
261  integratorPL_->set(tscPL->name(), *tscPL);
262  }
263  }
264 
265  } else {
266  // Make integratorPL_ consistent with new TimeStepControl.
267  RCP<ParameterList> tscPL = tsc->getNonconstParameterList();
268  integratorPL_->set("Time Step Control", tscPL->name());
269  integratorPL_->set(tscPL->name(), *tscPL);
270  timeStepControl_ = tsc;
271  }
272 
273 }
274 
275 
276 template<class Scalar>
278  Teuchos::RCP<IntegratorObserver<Scalar> > obs)
279 {
280 
281  if (obs == Teuchos::null) {
282  // Create default IntegratorObserverBasic, otherwise keep current observer.
283  if (integratorObserver_ == Teuchos::null) {
284  integratorObserver_ =
285  Teuchos::rcp(new IntegratorObserverComposite<Scalar>);
286  // Add basic observer to output time step info
287  Teuchos::RCP<IntegratorObserverBasic<Scalar> > basicObs =
288  Teuchos::rcp(new IntegratorObserverBasic<Scalar>);
289  integratorObserver_->addObserver(basicObs);
290  }
291  } else {
292  if (integratorObserver_ == Teuchos::null) {
293  integratorObserver_ =
294  Teuchos::rcp(new IntegratorObserverComposite<Scalar>);
295  }
296  integratorObserver_->addObserver(obs);
297  }
298 
299 }
300 
301 
302 template<class Scalar>
304 {
305  TEUCHOS_TEST_FOR_EXCEPTION( stepper_ == Teuchos::null, std::logic_error,
306  "Error - Need to set the Stepper, setStepper(), before calling "
307  "IntegratorBasic::initialize()\n");
308 
309  this->setTimeStepControl();
310  this->parseScreenOutput();
311  this->setSolutionHistory();
312  this->setObserver();
313 
314  // Set initial conditions, make them consistent, and set stepper memory.
315  stepper_->setInitialConditions(solutionHistory_);
316 
317  // Ensure TimeStepControl orders match the Stepper orders.
318  if (timeStepControl_->getMinOrder() < stepper_->getOrderMin())
319  timeStepControl_->setMinOrder(stepper_->getOrderMin());
320  if (timeStepControl_->getMinOrder() > stepper_->getOrderMax())
321  timeStepControl_->setMinOrder(stepper_->getOrderMax());
322 
323  if (timeStepControl_->getMaxOrder() == 0 ||
324  timeStepControl_->getMaxOrder() > stepper_->getOrderMax())
325  timeStepControl_->setMaxOrder(stepper_->getOrderMax());
326  if (timeStepControl_->getMaxOrder() < timeStepControl_->getMinOrder())
327  timeStepControl_->setMaxOrder(timeStepControl_->getMinOrder());
328 
329  if (timeStepControl_->getInitOrder() < timeStepControl_->getMinOrder())
330  timeStepControl_->setInitOrder(timeStepControl_->getMinOrder());
331  if (timeStepControl_->getInitOrder() > timeStepControl_->getMaxOrder())
332  timeStepControl_->setInitOrder(timeStepControl_->getMaxOrder());
333 
334  TEUCHOS_TEST_FOR_EXCEPTION(
335  timeStepControl_->getMinOrder() > timeStepControl_->getMaxOrder(),
336  std::out_of_range,
337  "Error - Invalid TimeStepControl min order greater than max order.\n"
338  << " Min order = " << timeStepControl_->getMinOrder() << "\n"
339  << " Max order = " << timeStepControl_->getMaxOrder() << "\n");
340 
341  TEUCHOS_TEST_FOR_EXCEPTION(
342  timeStepControl_->getInitOrder() < timeStepControl_->getMinOrder() ||
343  timeStepControl_->getInitOrder() > timeStepControl_->getMaxOrder(),
344  std::out_of_range,
345  "Error - Initial TimeStepControl order is out of min/max range.\n"
346  << " Initial order = " << timeStepControl_->getInitOrder() << "\n"
347  << " Min order = " << timeStepControl_->getMinOrder() << "\n"
348  << " Max order = " << timeStepControl_->getMaxOrder() << "\n");
349 
350  if (integratorTimer_ == Teuchos::null)
351  integratorTimer_ = rcp(new Teuchos::Time("Integrator Timer"));
352  if (stepperTimer_ == Teuchos::null)
353  stepperTimer_ = rcp(new Teuchos::Time("Stepper Timer"));
354 
355  if (Teuchos::as<int>(this->getVerbLevel()) >=
356  Teuchos::as<int>(Teuchos::VERB_HIGH)) {
357  Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
358  Teuchos::OSTab ostab(out,1,"IntegratorBasic::IntegratorBasic");
359  *out << this->description() << std::endl;
360  }
361 
362  isInitialized_ = true;
363 }
364 
365 
366 template<class Scalar>
368 {
369  std::string name = "Tempus::IntegratorBasic";
370  return(name);
371 }
372 
373 
374 template<class Scalar>
376  Teuchos::FancyOStream &out,
377  const Teuchos::EVerbosityLevel verbLevel) const
378 {
379  out << description() << "::describe" << std::endl;
380  out << "solutionHistory= " << solutionHistory_->description()<<std::endl;
381  out << "timeStepControl= " << timeStepControl_->description()<<std::endl;
382  out << "stepper = " << stepper_ ->description()<<std::endl;
383 
384  if (Teuchos::as<int>(verbLevel) >=
385  Teuchos::as<int>(Teuchos::VERB_HIGH)) {
386  out << "solutionHistory= " << std::endl;
387  solutionHistory_->describe(out,verbLevel);
388  out << "timeStepControl= " << std::endl;
389  timeStepControl_->describe(out,verbLevel);
390  out << "stepper = " << std::endl;
391  stepper_ ->describe(out,verbLevel);
392  }
393 }
394 
395 
396 template <class Scalar>
397 bool IntegratorBasic<Scalar>::advanceTime(const Scalar timeFinal)
398 {
399  if (timeStepControl_->timeInRange(timeFinal))
400  timeStepControl_->setFinalTime(timeFinal);
401  bool itgrStatus = advanceTime();
402  return itgrStatus;
403 }
404 
405 
406 template <class Scalar>
408 {
409  Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
410  if (isInitialized_ == false) {
411  Teuchos::OSTab ostab(out,1,"StartIntegrator");
412  *out << "Failure - IntegratorBasic is not initialized." << std::endl;
413  integratorStatus_ = Status::FAILED;
414  return;
415  }
416  integratorTimer_->start();
417  // get optimal initial time step
418  const Scalar initDt =
419  std::min(timeStepControl_->getInitTimeStep(),
420  stepper_->getInitTimeStep(solutionHistory_));
421  // update initial time step
422  timeStepControl_->setInitTimeStep(initDt);
423  integratorStatus_ = WORKING;
424 }
425 
426 
427 template <class Scalar>
429 {
430  TEMPUS_FUNC_TIME_MONITOR("Tempus::IntegratorBasic::advanceTime()");
431  {
432  startIntegrator();
433  integratorObserver_->observeStartIntegrator(*this);
434 
435  while (integratorStatus_ == WORKING and
436  timeStepControl_->timeInRange (solutionHistory_->getCurrentTime()) and
437  timeStepControl_->indexInRange(solutionHistory_->getCurrentIndex())){
438 
439  stepperTimer_->reset();
440  stepperTimer_->start();
441  solutionHistory_->initWorkingState();
442 
443  startTimeStep();
444  integratorObserver_->observeStartTimeStep(*this);
445 
446  timeStepControl_->getNextTimeStep(solutionHistory_, integratorStatus_);
447  integratorObserver_->observeNextTimeStep(*this);
448 
449  if (integratorStatus_ == Status::FAILED) break;
450  solutionHistory_->getWorkingState()->getMetaData()->
451  setSolutionStatus(WORKING);
452 
453  integratorObserver_->observeBeforeTakeStep(*this);
454 
455  stepper_->takeStep(solutionHistory_);
456 
457  integratorObserver_->observeAfterTakeStep(*this);
458 
459  stepperTimer_->stop();
460  checkTimeStep();
461  integratorObserver_->observeAfterCheckTimeStep(*this);
462 
463  solutionHistory_->promoteWorkingState();
464  integratorObserver_->observeEndTimeStep(*this);
465  }
466 
467  endIntegrator();
468  integratorObserver_->observeEndIntegrator(*this);
469  }
470 
471  return (integratorStatus_ == Status::PASSED);
472 }
473 
474 
475 template <class Scalar>
477 {
478  Teuchos::RCP<SolutionStateMetaData<Scalar> > wsmd =
479  solutionHistory_->getWorkingState()->getMetaData();
480 
481  //set the Abs/Rel tolerance
482  wsmd->setTolRel(timeStepControl_->getMaxRelError());
483  wsmd->setTolAbs(timeStepControl_->getMaxAbsError());
484 
485  // Check if we need to dump screen output this step
486  std::vector<int>::const_iterator it =
487  std::find(outputScreenIndices_.begin(),
488  outputScreenIndices_.end(),
489  wsmd->getIStep());
490  if (it == outputScreenIndices_.end())
491  wsmd->setOutputScreen(false);
492  else
493  wsmd->setOutputScreen(true);
494 
495  const int initial = timeStepControl_->getInitIndex();
496  const int interval = integratorPL_->get<int>("Screen Output Index Interval");
497  if ( (wsmd->getIStep() - initial) % interval == 0)
498  wsmd->setOutputScreen(true);
499 }
500 
501 
502 template <class Scalar>
504 {
505  using Teuchos::RCP;
506  RCP<SolutionStateMetaData<Scalar> > wsmd =
507  solutionHistory_->getWorkingState()->getMetaData();
508 
509  // Too many TimeStep failures, Integrator fails.
510  if (wsmd->getNFailures() >= timeStepControl_->getMaxFailures()) {
511  RCP<Teuchos::FancyOStream> out = this->getOStream();
512  Teuchos::OSTab ostab(out,2,"checkTimeStep");
513  *out << "Failure - Stepper has failed more than the maximum allowed.\n"
514  << " (nFailures = "<<wsmd->getNFailures()<< ") >= (nFailuresMax = "
515  << timeStepControl_->getMaxFailures()<<")" << std::endl;
516  integratorStatus_ = Status::FAILED;
517  return;
518  }
519  if (wsmd->getNConsecutiveFailures()
520  >= timeStepControl_->getMaxConsecFailures()){
521  RCP<Teuchos::FancyOStream> out = this->getOStream();
522  Teuchos::OSTab ostab(out,1,"checkTimeStep");
523  *out << "Failure - Stepper has failed more than the maximum "
524  << "consecutive allowed.\n"
525  << " (nConsecutiveFailures = "<<wsmd->getNConsecutiveFailures()
526  << ") >= (nConsecutiveFailuresMax = "
527  << timeStepControl_->getMaxConsecFailures()
528  << ")" << std::endl;
529  integratorStatus_ = Status::FAILED;
530  return;
531  }
532 
533  // Check Stepper failure.
534  if (wsmd->getSolutionStatus() == Status::FAILED or
535  // Constant time step failure
536  ((timeStepControl_->getStepType() == "Constant") and
537  (wsmd->getDt() != timeStepControl_->getInitTimeStep()) and
538  (wsmd->getOutput() != true) and
539  (wsmd->getTime() != timeStepControl_->getFinalTime())
540  )
541  )
542  {
543  RCP<Teuchos::FancyOStream> out = this->getOStream();
544  Teuchos::OSTab ostab(out,0,"checkTimeStep");
545  *out <<std::scientific
546  <<std::setw( 6)<<std::setprecision(3)<<wsmd->getIStep()
547  <<std::setw(11)<<std::setprecision(3)<<wsmd->getTime()
548  <<std::setw(11)<<std::setprecision(3)<<wsmd->getDt()
549  << " STEP FAILURE!! - ";
550  if (wsmd->getSolutionStatus() == Status::FAILED) {
551  *out << "Solution Status = " << toString(wsmd->getSolutionStatus())
552  << std::endl;
553  } else if ((timeStepControl_->getStepType() == "Constant") and
554  (wsmd->getDt() != timeStepControl_->getInitTimeStep())) {
555  *out << "dt != Constant dt (="<<timeStepControl_->getInitTimeStep()<<")"
556  << std::endl;
557  }
558 
559  wsmd->setNFailures(wsmd->getNFailures()+1);
560  wsmd->setNRunningFailures(wsmd->getNRunningFailures()+1);
561  wsmd->setNConsecutiveFailures(wsmd->getNConsecutiveFailures()+1);
562  wsmd->setSolutionStatus(Status::FAILED);
563  return;
564  }
565 
566  // TIME STEP PASSED basic tests! Ensure it is set as such.
567  wsmd->setSolutionStatus(Status::PASSED);
568 
569 }
570 
571 
572 template <class Scalar>
574 {
575  std::string exitStatus;
576  if (solutionHistory_->getCurrentState()->getSolutionStatus() ==
577  Status::FAILED or integratorStatus_ == Status::FAILED) {
578  exitStatus = "Time integration FAILURE!";
579  } else {
580  integratorStatus_ = Status::PASSED;
581  exitStatus = "Time integration complete.";
582  }
583 
584  integratorTimer_->stop();
585  runtime_ = integratorTimer_->totalElapsedTime();
586 }
587 
588 
589 template <class Scalar>
591 {
592  // This has been delayed until timeStepControl has been constructed.
593 
594  // Parse output indices
595  outputScreenIndices_.clear();
596  std::string str =
597  integratorPL_->get<std::string>("Screen Output Index List", "");
598  std::string delimiters(",");
599  std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
600  std::string::size_type pos = str.find_first_of(delimiters, lastPos);
601  while ((pos != std::string::npos) || (lastPos != std::string::npos)) {
602  std::string token = str.substr(lastPos,pos-lastPos);
603  outputScreenIndices_.push_back(int(std::stoi(token)));
604  if(pos==std::string::npos)
605  break;
606 
607  lastPos = str.find_first_not_of(delimiters, pos);
608  pos = str.find_first_of(delimiters, lastPos);
609  }
610 
611  // order output indices and remove duplicates.
612  std::sort(outputScreenIndices_.begin(),outputScreenIndices_.end());
613  outputScreenIndices_.erase(std::unique(outputScreenIndices_.begin(),
614  outputScreenIndices_.end() ),
615  outputScreenIndices_.end() );
616  return;
617 }
618 
619 
620 template <class Scalar>
622  const Teuchos::RCP<Teuchos::ParameterList> & inputPL)
623 {
624  if (inputPL == Teuchos::null) {
625  if (tempusPL_->isParameter("Integrator Name")) {
626  // Set Integrator PL from Tempus PL
627  std::string integratorName_ =
628  tempusPL_->get<std::string>("Integrator Name");
629  integratorPL_ = Teuchos::sublist(tempusPL_, integratorName_, true);
630  } else {
631  // Build default Integrator PL
632  integratorPL_ = Teuchos::parameterList();
633  integratorPL_->setName("Default Integrator");
634  *integratorPL_ = *(this->getValidParameters());
635  tempusPL_->set("Integrator Name", "Default Integrator");
636  tempusPL_->set("Default Integrator", *integratorPL_);
637  }
638  } else {
639  *integratorPL_ = *inputPL;
640  tempusPL_->set("Integrator Name", integratorPL_->name());
641  tempusPL_->set(integratorPL_->name(), *integratorPL_);
642  }
643 
644  integratorPL_->validateParametersAndSetDefaults(*this->getValidParameters());
645 
646  std::string integratorType =
647  integratorPL_->get<std::string>("Integrator Type");
648  TEUCHOS_TEST_FOR_EXCEPTION( integratorType != "Integrator Basic",
649  std::logic_error,
650  "Error - Inconsistent Integrator Type for IntegratorBasic\n"
651  << " Integrator Type = " << integratorType << "\n");
652 
653  return;
654 }
655 
656 
657 /** \brief Create valid IntegratorBasic ParameterList.
658  */
659 template<class Scalar>
660 Teuchos::RCP<const Teuchos::ParameterList>
662 {
663  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
664 
665  std::ostringstream tmp;
666  tmp << "'Integrator Type' must be 'Integrator Basic'.";
667  pl->set("Integrator Type", "Integrator Basic", tmp.str());
668 
669  tmp.clear();
670  tmp << "Screen Output Index List. Required to be in TimeStepControl range "
671  << "['Minimum Time Step Index', 'Maximum Time Step Index']";
672  pl->set("Screen Output Index List", "", tmp.str());
673  pl->set("Screen Output Index Interval", 1000000,
674  "Screen Output Index Interval (e.g., every 100 time steps)");
675 
676  pl->set("Stepper Name", "",
677  "'Stepper Name' selects the Stepper block to construct (Required).");
678 
679  // Solution History
680  pl->sublist("Solution History",false,"solutionHistory_docs")
681  .disableRecursiveValidation();
682 
683  // Time Step Control
684  pl->sublist("Time Step Control",false,"solutionHistory_docs")
685  .disableRecursiveValidation();
686 
687  return pl;
688 }
689 
690 
691 template <class Scalar>
692 Teuchos::RCP<Teuchos::ParameterList>
694 {
695  return(integratorPL_);
696 }
697 
698 
699 template <class Scalar>
700 Teuchos::RCP<Teuchos::ParameterList>
702 {
703  Teuchos::RCP<Teuchos::ParameterList> temp_param_list = integratorPL_;
704  integratorPL_ = Teuchos::null;
705  return(temp_param_list);
706 }
707 
708 /// Non-member constructor
709 template<class Scalar>
710 Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integratorBasic(
711  Teuchos::RCP<Teuchos::ParameterList> pList,
712  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model)
713 {
714  Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integrator =
715  Teuchos::rcp(new Tempus::IntegratorBasic<Scalar>(pList, model));
716  return(integrator);
717 }
718 
719 /// Non-member constructor
720 template<class Scalar>
721 Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integratorBasic(
722  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
723  std::string stepperType)
724 {
725  Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integrator =
726  Teuchos::rcp(new Tempus::IntegratorBasic<Scalar>(model, stepperType));
727  return(integrator);
728 }
729 
730 /// Non-member constructor
731 template<class Scalar>
732 Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integratorBasic()
733 {
734  Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integrator =
735  Teuchos::rcp(new Tempus::IntegratorBasic<Scalar>());
736  return(integrator);
737 }
738 
739 /// Non-member constructor
740 template<class Scalar>
741 Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integratorBasic(
742  Teuchos::RCP<Teuchos::ParameterList> pList,
743  std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > > models)
744 {
745  Teuchos::RCP<Tempus::IntegratorBasic<Scalar> > integrator =
746  Teuchos::rcp(new Tempus::IntegratorBasic<Scalar>(pList, models));
747  return(integrator);
748 }
749 
750 } // namespace Tempus
751 #endif // Tempus_IntegratorBasic_impl_hpp
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList() override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Create valid IntegratorBasic ParameterList.
const std::string toString(const Status status)
Convert Status to string.
std::string description() const override
virtual void setTimeStepControl(Teuchos::RCP< TimeStepControl< Scalar > > tsc=Teuchos::null)
Set the TimeStepControl.
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
IntegratorObserverBasic class for time integrators. This basic class has simple no-op functions...
IntegratorBasic()
Constructor that requires a subsequent setParameterList, setStepper, and initialize calls...
Thyra Base interface for time steppers.
virtual void checkTimeStep()
Check if time step has passed or failed.
Teuchos::RCP< Tempus::IntegratorBasic< Scalar > > integratorBasic(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model)
Non-member constructor.
void parseScreenOutput()
Parse when screen output should be executed.
virtual void setSolutionHistory(Teuchos::RCP< SolutionHistory< Scalar > > sh=Teuchos::null)
Set the SolutionHistory.
IntegratorObserver class for time integrators.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList() override
virtual void setStepperWStepper(Teuchos::RCP< Stepper< Scalar > > stepper)
Set the Stepper.
virtual void setTempusParameterList(Teuchos::RCP< Teuchos::ParameterList > pl) override
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
TimeStepControl manages the time step size. There several mechanicisms that effect the time step size...
virtual void initializeSolutionHistory(Teuchos::RCP< SolutionState< Scalar > > state=Teuchos::null)
Set the initial state which has the initial conditions.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual void initialize()
Initializes the Integrator after set* function calls.
virtual void endIntegrator()
Perform tasks after end of integrator.
virtual void startIntegrator()
Perform tasks before start of integrator.
virtual void setStepper(Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > model)
Set the Stepper.
virtual void startTimeStep()
Start time step.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...