9 #ifndef Tempus_IntegratorBasic_impl_hpp 10 #define Tempus_IntegratorBasic_impl_hpp 12 #include "Thyra_VectorStdOps.hpp" 14 #include "Tempus_StepperFactory.hpp" 15 #include "Tempus_StepperForwardEuler.hpp" 20 template<
class Scalar>
22 : outputScreenIndices_(std::vector<int>()),
23 outputScreenInterval_(1000000),
40 template<
class Scalar>
46 std::vector<int> outputScreenIndices,
47 int outputScreenInterval)
48 : outputScreenIndices_(outputScreenIndices),
49 outputScreenInterval_(outputScreenInterval),
66 template<
class Scalar>
69 TEUCHOS_TEST_FOR_EXCEPTION( i !=
"Integrator Basic", std::logic_error,
70 "Error - Integrator Type should be 'Integrator Basic'\n");
72 this->integratorType_ = i;
76 template<
class Scalar>
80 TEUCHOS_TEST_FOR_EXCEPTION( stepper_ == Teuchos::null, std::logic_error,
81 "Error - setModel(), need to set stepper first!\n");
83 stepper_->setModel(model);
87 template<
class Scalar>
91 if (stepper == Teuchos::null)
98 template<
class Scalar>
104 if (solutionHistory_ == Teuchos::null) {
107 solutionHistory_->clear();
110 TEUCHOS_TEST_FOR_EXCEPTION( stepper_ == Teuchos::null, std::logic_error,
111 "Error - initializeSolutionHistory(), need to set stepper first!\n");
113 if (state == Teuchos::null) {
114 TEUCHOS_TEST_FOR_EXCEPTION( stepper_->getModel() == Teuchos::null,
116 "Error - initializeSolutionHistory(), need to set stepper's model first!\n");
119 stepper_->getDefaultStepperState());
121 if (timeStepControl_ != Teuchos::null) {
123 state->setTime (timeStepControl_->getInitTime());
124 state->setIndex (timeStepControl_->getInitIndex());
125 state->setTimeStep(timeStepControl_->getInitTimeStep());
126 state->setTolRel (timeStepControl_->getMaxRelError());
127 state->setTolAbs (timeStepControl_->getMaxAbsError());
129 state->setOrder (stepper_->getOrder());
133 solutionHistory_->addState(state);
135 stepper_->setInitialConditions(solutionHistory_);
139 template<
class Scalar>
149 RCP<Thyra::VectorBase<Scalar> > xdot = x0->clone_v();
150 RCP<Thyra::VectorBase<Scalar> > xdotdot = x0->clone_v();
151 if (xdot0 == Teuchos::null)
152 Thyra::assign(xdot.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
154 Thyra::assign(xdot.ptr(), *(xdot0));
155 if (xdotdot0 == Teuchos::null)
156 Thyra::assign(xdotdot.ptr(), Teuchos::ScalarTraits<Scalar>::zero());
158 Thyra::assign(xdotdot.ptr(), *(xdotdot0));
160 TEUCHOS_TEST_FOR_EXCEPTION( stepper_ == Teuchos::null, std::logic_error,
161 "Error - initializeSolutionHistory(), need to set stepper first!\n");
164 state->setStepperState(stepper_->getDefaultStepperState());
167 if (timeStepControl_ != Teuchos::null) {
169 state->setIndex (timeStepControl_->getInitIndex());
170 state->setTimeStep(timeStepControl_->getInitTimeStep());
171 state->setTolRel (timeStepControl_->getMaxRelError());
172 state->setTolAbs (timeStepControl_->getMaxAbsError());
174 state->setOrder (stepper_->getOrder());
177 initializeSolutionHistory(state);
181 template<
class Scalar>
185 if (sh == Teuchos::null) {
187 if (solutionHistory_ == Teuchos::null)
190 solutionHistory_ = sh;
195 template<
class Scalar>
199 if (tsc == Teuchos::null) {
201 if (timeStepControl_ == Teuchos::null) {
206 timeStepControl_ = tsc;
211 template<
class Scalar>
215 if (obs == Teuchos::null)
218 integratorObserver_ = obs;
222 template<
class Scalar>
225 TEUCHOS_TEST_FOR_EXCEPTION( stepper_ == Teuchos::null, std::logic_error,
226 "Error - Need to set the Stepper, setStepper(), before calling " 227 "IntegratorBasic::initialize()\n");
229 TEUCHOS_TEST_FOR_EXCEPTION( solutionHistory_->getNumStates() < 1,
231 "Error - SolutionHistory requires at least one SolutionState.\n" 232 <<
" Supplied SolutionHistory has only " 233 << solutionHistory_->getNumStates() <<
" SolutionStates.\n");
235 stepper_->initialize();
236 solutionHistory_->initialize();
237 timeStepControl_->initialize();
239 isInitialized_ =
true;
243 template<
class Scalar>
246 std::string name =
"Tempus::IntegratorBasic";
251 template<
class Scalar>
253 Teuchos::FancyOStream &out,
254 const Teuchos::EVerbosityLevel verbLevel)
const 256 auto l_out = Teuchos::fancyOStream( out.getOStream() );
257 Teuchos::OSTab ostab(*l_out, 2, this->description());
258 l_out->setOutputToRootOnly(0);
260 *l_out <<
"\n--- " << this->description() <<
" ---" << std::endl;
262 if ( solutionHistory_ != Teuchos::null ) {
263 solutionHistory_->describe(*l_out,verbLevel);
265 *l_out <<
"solutionHistory = " << solutionHistory_ << std::endl;
268 if ( timeStepControl_ != Teuchos::null ) {
269 timeStepControl_->describe(out,verbLevel);
271 *l_out <<
"timeStepControl = " << timeStepControl_ << std::endl;
274 if ( stepper_ != Teuchos::null ) {
275 stepper_->describe(out,verbLevel);
277 *l_out <<
"stepper = " << stepper_ << std::endl;
279 *l_out << std::string(this->description().length()+8,
'-') <<std::endl;
283 template <
class Scalar>
286 if (timeStepControl_->timeInRange(timeFinal))
287 timeStepControl_->setFinalTime(timeFinal);
288 bool itgrStatus = advanceTime();
293 template <
class Scalar>
296 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
297 out->setOutputToRootOnly(0);
298 if (isInitialized_ ==
false) {
299 Teuchos::OSTab ostab(out,1,
"StartIntegrator");
300 *out <<
"Failure - IntegratorBasic is not initialized." << std::endl;
306 auto cs = solutionHistory_->getCurrentState();
307 cs->setTolRel(timeStepControl_->getMaxRelError());
308 cs->setTolAbs(timeStepControl_->getMaxAbsError());
310 integratorTimer_->start();
312 const Scalar initDt =
313 std::min(timeStepControl_->getInitTimeStep(),
314 stepper_->getInitTimeStep(solutionHistory_));
316 timeStepControl_->setInitTimeStep(initDt);
317 timeStepControl_->initialize();
322 template <
class Scalar>
325 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::IntegratorBasic::advanceTime()");
328 integratorObserver_->observeStartIntegrator(*
this);
330 while (integratorStatus_ ==
WORKING &&
331 timeStepControl_->timeInRange (solutionHistory_->getCurrentTime()) &&
332 timeStepControl_->indexInRange(solutionHistory_->getCurrentIndex())){
334 stepperTimer_->reset();
335 stepperTimer_->start();
336 solutionHistory_->initWorkingState();
339 integratorObserver_->observeStartTimeStep(*
this);
341 timeStepControl_->setNextTimeStep(solutionHistory_, integratorStatus_);
342 integratorObserver_->observeNextTimeStep(*
this);
345 solutionHistory_->getWorkingState()->setSolutionStatus(
WORKING);
347 integratorObserver_->observeBeforeTakeStep(*
this);
349 stepper_->takeStep(solutionHistory_);
351 integratorObserver_->observeAfterTakeStep(*
this);
353 stepperTimer_->stop();
355 integratorObserver_->observeAfterCheckTimeStep(*
this);
357 solutionHistory_->promoteWorkingState();
358 integratorObserver_->observeEndTimeStep(*
this);
362 integratorObserver_->observeEndIntegrator(*
this);
369 template <
class Scalar>
372 auto ws = solutionHistory_->getWorkingState();
375 ws->setTolRel(timeStepControl_->getMaxRelError());
376 ws->setTolAbs(timeStepControl_->getMaxAbsError());
379 std::vector<int>::const_iterator it =
380 std::find(outputScreenIndices_.begin(),
381 outputScreenIndices_.end(),
383 if (it == outputScreenIndices_.end())
384 ws->setOutputScreen(
false);
386 ws->setOutputScreen(
true);
388 const int initial = timeStepControl_->getInitIndex();
389 if ( (ws->getIndex() - initial) % outputScreenInterval_ == 0)
390 ws->setOutputScreen(
true);
394 template <
class Scalar>
398 auto ws = solutionHistory_->getWorkingState();
401 if (ws->getNFailures() >= timeStepControl_->getMaxFailures()) {
402 RCP<Teuchos::FancyOStream> out = this->getOStream();
403 out->setOutputToRootOnly(0);
404 Teuchos::OSTab ostab(out, 2,
"checkTimeStep");
405 *out <<
"Failure - Stepper has failed more than the maximum allowed.\n" 406 <<
" (nFailures = "<<ws->getNFailures()<<
") >= (nFailuresMax = " 407 << timeStepControl_->getMaxFailures()<<
")" << std::endl;
411 if (ws->getNConsecutiveFailures()
412 >= timeStepControl_->getMaxConsecFailures()){
413 RCP<Teuchos::FancyOStream> out = this->getOStream();
414 out->setOutputToRootOnly(0);
415 Teuchos::OSTab ostab(out, 1,
"checkTimeStep");
416 *out <<
"Failure - Stepper has failed more than the maximum " 417 <<
"consecutive allowed.\n" 418 <<
" (nConsecutiveFailures = "<<ws->getNConsecutiveFailures()
419 <<
") >= (nConsecutiveFailuresMax = " 420 << timeStepControl_->getMaxConsecFailures()
429 ((timeStepControl_->getStepType() ==
"Constant") &&
430 (ws->getTimeStep() != timeStepControl_->getInitTimeStep()) &&
431 (ws->getOutput() !=
true) &&
432 (ws->getTime() != timeStepControl_->getFinalTime())
436 RCP<Teuchos::FancyOStream> out = this->getOStream();
437 out->setOutputToRootOnly(0);
438 Teuchos::OSTab ostab(out, 0,
"checkTimeStep");
439 *out <<std::scientific
440 <<std::setw( 6)<<std::setprecision(3)<<ws->getIndex()
441 <<std::setw(11)<<std::setprecision(3)<<ws->getTime()
442 <<std::setw(11)<<std::setprecision(3)<<ws->getTimeStep()
443 <<
" STEP FAILURE!! - ";
445 *out <<
"Solution Status = " <<
toString(ws->getSolutionStatus())
447 }
else if ((timeStepControl_->getStepType() ==
"Constant") &&
448 (ws->getTimeStep() != timeStepControl_->getInitTimeStep())) {
449 *out <<
"dt != Constant dt (="<<timeStepControl_->getInitTimeStep()<<
")" 453 ws->setNFailures(ws->getNFailures()+1);
454 ws->setNRunningFailures(ws->getNRunningFailures()+1);
455 ws->setNConsecutiveFailures(ws->getNConsecutiveFailures()+1);
466 template <
class Scalar>
469 std::string exitStatus;
470 if (solutionHistory_->getCurrentState()->getSolutionStatus() ==
472 exitStatus =
"Time integration FAILURE!";
475 exitStatus =
"Time integration complete.";
478 integratorTimer_->stop();
482 template <
class Scalar>
486 std::string delimiters(
",");
487 std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
488 std::string::size_type pos = str.find_first_of(delimiters, lastPos);
489 while ((pos != std::string::npos) || (lastPos != std::string::npos)) {
490 std::string token = str.substr(lastPos,pos-lastPos);
491 outputScreenIndices_.push_back(
int(std::stoi(token)));
492 if(pos==std::string::npos)
495 lastPos = str.find_first_not_of(delimiters, pos);
496 pos = str.find_first_of(delimiters, lastPos);
500 std::sort(outputScreenIndices_.begin(),outputScreenIndices_.end());
501 outputScreenIndices_.erase(std::unique(outputScreenIndices_.begin(),
502 outputScreenIndices_.end() ),
503 outputScreenIndices_.end() );
508 template <
class Scalar>
511 std::stringstream ss;
512 for(
size_t i = 0; i < outputScreenIndices_.size(); ++i) {
513 if(i != 0) ss <<
", ";
514 ss << outputScreenIndices_[i];
522 template<
class Scalar>
523 Teuchos::RCP<const Teuchos::ParameterList>
526 Teuchos::RCP<Teuchos::ParameterList> pl =
527 Teuchos::parameterList(getIntegratorName());
529 pl->set(
"Integrator Type", getIntegratorType(),
530 "'Integrator Type' must be 'Integrator Basic'.");
532 pl->set(
"Screen Output Index List", getScreenOutputIndexListString(),
533 "Screen Output Index List. Required to be in TimeStepControl range " 534 "['Minimum Time Step Index', 'Maximum Time Step Index']");
536 pl->set(
"Screen Output Index Interval", getScreenOutputIndexInterval(),
537 "Screen Output Index Interval (e.g., every 100 time steps)");
539 pl->set(
"Stepper Name", stepper_->getStepperName(),
540 "'Stepper Name' selects the Stepper block to construct (Required).");
542 pl->set(
"Solution History", *solutionHistory_->getValidParameters());
543 pl->set(
"Time Step Control", *timeStepControl_->getValidParameters());
546 Teuchos::RCP<Teuchos::ParameterList> tempusPL =
547 Teuchos::parameterList(
"Tempus");
549 tempusPL->set(
"Integrator Name", pl->name());
550 tempusPL->set(pl->name(), *pl);
551 tempusPL->set(stepper_->getStepperName(), *stepper_->getValidParameters());
559 template<
class Scalar>
561 Teuchos::RCP<Teuchos::ParameterList> tempusPL)
563 auto integratorName = tempusPL->get<std::string>(
"Integrator Name");
564 auto integratorPL = Teuchos::sublist(tempusPL, integratorName,
true);
566 std::string integratorType = integratorPL->get<std::string>(
"Integrator Type");
567 TEUCHOS_TEST_FOR_EXCEPTION( integratorType !=
"Integrator Basic",
569 "Error - For IntegratorBasic, 'Integrator Type' should be " 570 <<
"'Integrator Basic'.\n" 571 <<
" Integrator Type = " << integratorType <<
"\n");
574 integrator->setIntegratorName(integratorName);
577 if (integratorPL->isParameter(
"Stepper Name")) {
579 auto stepperName = integratorPL->get<std::string>(
"Stepper Name");
580 auto stepperPL = Teuchos::sublist(tempusPL, stepperName,
true);
581 stepperPL->setName(stepperName);
583 integrator->setStepper(sf->createStepper(stepperPL));
587 integrator->setStepper(stepper);
591 if (integratorPL->isSublist(
"Time Step Control")) {
593 auto tscPL = Teuchos::sublist(integratorPL,
"Time Step Control",
true);
594 integrator->setTimeStepControl(createTimeStepControl<Scalar>(tscPL));
601 if (integratorPL->isSublist(
"Solution History")) {
603 auto shPL = Teuchos::sublist(integratorPL,
"Solution History",
true);
604 auto sh = createSolutionHistoryPL<Scalar>(shPL);
605 integrator->setSolutionHistory(sh);
608 integrator->setSolutionHistory(createSolutionHistory<Scalar>());
612 integrator->setObserver(Teuchos::null);
615 integrator->setScreenOutputIndexInterval(
616 integratorPL->get<
int>(
"Screen Output Index Interval",
617 integrator->getScreenOutputIndexInterval()));
620 auto str = integratorPL->get<std::string>(
"Screen Output Index List",
"");
621 integrator->setScreenOutputIndexList(str);
623 auto validPL = Teuchos::rcp_const_cast<Teuchos::ParameterList>(integrator->getValidParameters());
626 auto vIntegratorName = validPL->template get<std::string>(
"Integrator Name");
627 auto vIntegratorPL = Teuchos::sublist(validPL, vIntegratorName,
true);
628 integratorPL->validateParametersAndSetDefaults(*vIntegratorPL,1);
631 auto stepperName = integratorPL->get<std::string>(
"Stepper Name");
632 auto stepperPL = Teuchos::sublist(tempusPL, stepperName,
true);
633 auto vStepperName = vIntegratorPL->template get<std::string>(
"Stepper Name");
634 auto vStepperPL = Teuchos::sublist(validPL, vStepperName,
true);
635 stepperPL->validateParametersAndSetDefaults(*vStepperPL);
643 template<
class Scalar>
645 Teuchos::RCP<Teuchos::ParameterList> tempusPL,
648 auto integrator = createIntegratorBasic<Scalar>(tempusPL);
649 if ( model == Teuchos::null )
return integrator;
651 Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > constModel = model;
652 integrator->setModel(constModel);
656 integrator->getStepper()->getDefaultStepperState());
657 newState->setTime (integrator->getTimeStepControl()->getInitTime());
658 newState->setIndex (integrator->getTimeStepControl()->getInitIndex());
659 newState->setTimeStep(integrator->getTimeStepControl()->getInitTimeStep());
660 newState->setTolRel (integrator->getTimeStepControl()->getMaxRelError());
661 newState->setTolAbs (integrator->getTimeStepControl()->getMaxAbsError());
662 newState->setOrder (integrator->getStepper()->getOrder());
666 auto sh = integrator->getNonConstSolutionHistory();
667 sh->addState(newState);
668 integrator->getStepper()->setInitialConditions(sh);
670 integrator->initialize();
677 template<
class Scalar>
680 std::string stepperType)
686 auto stepper = sf->createStepper(stepperType, model);
687 integrator->setStepper(stepper);
688 integrator->initializeSolutionHistory();
689 integrator->initialize();
696 template<
class Scalar>
704 template<
class Scalar>
706 Teuchos::RCP<Teuchos::ParameterList> tempusPL,
709 auto integratorName = tempusPL->get<std::string>(
"Integrator Name");
710 auto integratorPL = Teuchos::sublist(tempusPL, integratorName,
true);
712 std::string integratorType = integratorPL->get<std::string>(
"Integrator Type");
713 TEUCHOS_TEST_FOR_EXCEPTION( integratorType !=
"Integrator Basic",
715 "Error - For IntegratorBasic, 'Integrator Type' should be " 716 <<
"'Integrator Basic'.\n" 717 <<
" Integrator Type = " << integratorType <<
"\n");
720 integrator->setIntegratorName(integratorName);
722 TEUCHOS_TEST_FOR_EXCEPTION( !integratorPL->isParameter(
"Stepper Name"),
724 "Error - Need to set the 'Stepper Name' in 'Integrator Basic'.\n");
726 auto stepperName = integratorPL->get<std::string>(
"Stepper Name");
727 TEUCHOS_TEST_FOR_EXCEPTION( stepperName ==
"Operator Split",
729 "Error - 'Stepper Name' should be 'Operator Split'.\n");
732 auto stepperPL = Teuchos::sublist(tempusPL, stepperName,
true);
733 stepperPL->setName(stepperName);
735 integrator->setStepper(sf->createStepper(stepperPL, models));
738 if (integratorPL->isSublist(
"Time Step Control")) {
740 auto tscPL = Teuchos::sublist(integratorPL,
"Time Step Control",
true);
741 integrator->setTimeStepControl(createTimeStepControl<Scalar>(tscPL));
749 integrator->getStepper()->getDefaultStepperState());
750 newState->setTime (integrator->getTimeStepControl()->getInitTime());
751 newState->setIndex (integrator->getTimeStepControl()->getInitIndex());
752 newState->setTimeStep(integrator->getTimeStepControl()->getInitTimeStep());
753 newState->setTolRel (integrator->getTimeStepControl()->getMaxRelError());
754 newState->setTolAbs (integrator->getTimeStepControl()->getMaxAbsError());
755 newState->setOrder (integrator->getStepper()->getOrder());
759 auto shPL = Teuchos::sublist(integratorPL,
"Solution History",
true);
760 auto sh = createSolutionHistoryPL<Scalar>(shPL);
761 sh->addState(newState);
762 integrator->getStepper()->setInitialConditions(sh);
763 integrator->setSolutionHistory(sh);
766 integrator->setObserver(Teuchos::null);
769 integrator->setScreenOutputIndexInterval(
770 integratorPL->get<
int>(
"Screen Output Index Interval",
771 integrator->getScreenOutputIndexInterval()));
774 auto str = integratorPL->get<std::string>(
"Screen Output Index List",
"");
775 integrator->setScreenOutputIndexList(str);
777 auto validPL = Teuchos::rcp_const_cast<Teuchos::ParameterList>(integrator->getValidParameters());
780 auto vIntegratorName = validPL->template get<std::string>(
"Integrator Name");
781 auto vIntegratorPL = Teuchos::sublist(validPL, vIntegratorName,
true);
782 integratorPL->validateParametersAndSetDefaults(*vIntegratorPL);
785 auto vStepperName = vIntegratorPL->template get<std::string>(
"Stepper Name");
786 auto vStepperPL = Teuchos::sublist(validPL, vStepperName,
true);
787 stepperPL->validateParametersAndSetDefaults(*vStepperPL);
789 integrator->initialize();
796 #endif // Tempus_IntegratorBasic_impl_hpp virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
Teuchos::RCP< SolutionState< Scalar > > createSolutionStateX(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdot=Teuchos::null, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdotdot=Teuchos::null)
Nonmember constructor from non-const solution vectors, x.
virtual void setModel(Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > model)
Set the model on the stepper.
const std::string toString(const Status status)
Convert Status to string.
Teuchos::RCP< Teuchos::Time > integratorTimer_
std::string description() const override
virtual void setTimeStepControl(Teuchos::RCP< TimeStepControl< Scalar > > tsc=Teuchos::null)
Set the TimeStepControl.
Forward Euler time stepper.
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
Teuchos::RCP< Teuchos::Time > stepperTimer_
IntegratorObserverBasic class for time integrators. This basic class has simple no-op functions...
IntegratorBasic()
Default constructor that requires a subsequent, ??? , setStepper, and initialize calls.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Create valid IntegratorBasic ParameterList.
virtual void setStepper(Teuchos::RCP< Stepper< Scalar > > stepper)
Set the Stepper.
Thyra Base interface for time steppers.
virtual void checkTimeStep()
Check if time step has passed or failed.
virtual std::string getScreenOutputIndexListString() const
virtual void setSolutionHistory(Teuchos::RCP< SolutionHistory< Scalar > > sh=Teuchos::null)
Set the SolutionHistory.
IntegratorObserver class for time integrators.
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
virtual void initializeSolutionHistory(Teuchos::RCP< SolutionState< Scalar > > state=Teuchos::null)
Set the initial state which has the initial conditions.
virtual void setScreenOutputIndexList(std::vector< int > indices)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
void setIntegratorName(std::string i)
Set the Integrator Name.
Teuchos::RCP< SolutionState< Scalar > > createSolutionStateME(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< StepperState< Scalar > > &stepperState=Teuchos::null, const Teuchos::RCP< PhysicsState< Scalar > > &physicsState=Teuchos::null)
Nonmember constructor from Thyra ModelEvaluator.
Teuchos::RCP< IntegratorBasic< Scalar > > createIntegratorBasic(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember constructor.
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.
void setIntegratorType(std::string i)
Set the Integrator Type.
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...