9#ifndef Tempus_StepperBDF2_impl_hpp
10#define Tempus_StepperBDF2_impl_hpp
12#include "Tempus_WrapperModelEvaluatorBasic.hpp"
14#include "Tempus_StepperFactory.hpp"
39 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
42 std::string ICConsistency,
43 bool ICConsistencyCheck,
44 bool zeroInitialGuess,
58 if (appModel != Teuchos::null) {
102 TEUCHOS_TEST_FOR_EXCEPTION(
103 this->
wrapperModel_->getAppModel() == Teuchos::null, std::logic_error,
104 "Error - Can not set the startUpStepper to Teuchos::null.\n");
106 if (startUpStepper->getModel() == Teuchos::null &&
107 this->wrapperModel_->getAppModel() != Teuchos::null) {
116template<
class Scalar>
120 if (appAction == Teuchos::null) {
132template<
class Scalar>
139template<
class Scalar>
145 RCP<SolutionState<Scalar> > initialState = solutionHistory->getCurrentState();
148 if (initialState->getXDot() == Teuchos::null)
157template<
class Scalar>
165 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperBDF2::takeStep()");
167 int numStates = solutionHistory->getNumStates();
169 RCP<Thyra::VectorBase<Scalar> > xOld;
170 RCP<Thyra::VectorBase<Scalar> > xOldOld;
178 TEUCHOS_TEST_FOR_EXCEPTION( (numStates < 3), std::logic_error,
179 "Error in Tempus::StepperBDF2::takeStep(): numStates after \n"
180 <<
"startup stepper must be at least 3, whereas numStates = "
181 << numStates <<
"!\n" <<
"If running with Storage Type = Static, "
182 <<
"make sure Storage Limit > 2.\n");
187 RCP<StepperBDF2<Scalar> > thisStepper = Teuchos::rcpFromRef(*
this);
192 RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
193 RCP<SolutionState<Scalar> > currentState=solutionHistory->getCurrentState();
195 RCP<Thyra::VectorBase<Scalar> > x = workingState->getX();
196 if (workingState->getXDot() != Teuchos::null)
201 const Scalar time = workingState->getTime();
202 const Scalar dt = workingState->getTimeStep();
203 const Scalar dtOld = currentState->getTimeStep();
205 xOld = solutionHistory->getStateTimeIndexNM1()->getX();
206 xOldOld = solutionHistory->getStateTimeIndexNM2()->getX();
210 Teuchos::RCP<TimeDerivative<Scalar> > timeDer =
213 const Scalar alpha =
getAlpha(dt, dtOld);
214 const Scalar beta =
getBeta (dt);
217 timeDer, dt, alpha, beta));
221 const Thyra::SolveStatus<Scalar> sStatus =
228 if (workingState->getXDot() != Teuchos::null)
229 timeDer->compute(x, xDot);
231 workingState->setSolutionStatus(sStatus);
233 workingState->computeNorms(currentState);
240template<
class Scalar>
244 auto out = Teuchos::fancyOStream( this->getOStream() );
245 out->setOutputToRootOnly(0);
246 Teuchos::OSTab ostab(out,1,
"StepperBDF2::computeStartUp()");
247 *out <<
"Warning -- Taking a startup step for BDF2 using '"
262template<
class Scalar>
263Teuchos::RCP<Tempus::StepperState<Scalar> >
267 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
273template<
class Scalar>
275 Teuchos::FancyOStream &out,
276 const Teuchos::EVerbosityLevel verbLevel )
const
278 auto l_out = Teuchos::fancyOStream( out.getOStream() );
279 Teuchos::OSTab ostab(*l_out, 2, this->
description());
280 l_out->setOutputToRootOnly(0);
285 *l_out <<
"--- StepperBDF2 ---\n";
287 *l_out <<
" startup stepper type = "
290 *l_out <<
" startUpStepper_ = "
292 *l_out <<
" startUpStepper_->isInitialized() = "
294 *l_out <<
" stepperBDF2AppAction_ = "
296 *l_out <<
"----------------------------" << std::endl;
297 *l_out <<
" order_ = " <<
order_ << std::endl;
298 *l_out <<
"-------------------" << std::endl;
302template<
class Scalar>
306 auto l_out = Teuchos::fancyOStream( out.getOStream() );
307 l_out->setOutputToRootOnly(0);
314 *l_out <<
"The startup stepper is not initialized!\n";
318 *l_out <<
"The BDF2 AppAction is not set!\n";
324template<
class Scalar>
325Teuchos::RCP<const Teuchos::ParameterList>
336template<
class Scalar>
337Teuchos::RCP<StepperBDF2<Scalar> >
340 Teuchos::RCP<Teuchos::ParameterList> pl)
343 stepper->setStepperImplicitValues(pl);
345 std::string startUpStepperName =
"DIRK 1 Stage Theta Method";
346 if (pl != Teuchos::null) startUpStepperName =
347 pl->get<std::string>(
"Start Up Stepper Type", startUpStepperName);
348 stepper->setStartUpStepper(startUpStepperName);
350 if (model != Teuchos::null) {
351 stepper->setModel(model);
352 stepper->initialize();
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Application Action for StepperBDF2.
@ BEGIN_STEP
At the beginning of the step.
@ AFTER_SOLVE
After the solve.
@ BEFORE_SOLVE
Before the solve.
@ END_STEP
At the end of the step.
Default modifier for StepperBDF2.
Time-derivative interface for BDF2.
BDF2 (Backward-Difference-Formula-2) time stepper.
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
void setStartUpStepper(std::string startupStepperType)
Set the stepper to use in first step.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual void setAppAction(Teuchos::RCP< StepperBDF2AppAction< Scalar > > appAction)
virtual Scalar getOrder() const
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
StepperBDF2()
Default constructor.
Teuchos::RCP< StepperBDF2AppAction< Scalar > > stepperBDF2AppAction_
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
virtual void computeStartUp(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute the first time step given the supplied startup stepper.
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.
virtual void initialize()
Initialize during construction and after changing input parameters.
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Set the initial conditions and make them consistent.
Teuchos::RCP< WrapperModelEvaluator< Scalar > > wrapperModel_
Teuchos::RCP< Teuchos::ParameterList > getValidParametersBasicImplicit() const
virtual void setDefaultSolver()
virtual void setSolver(Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > solver) override
Set solver.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel) override
Set the model.
const Thyra::SolveStatus< Scalar > solveImplicitODE(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xDot, const Scalar time, const Teuchos::RCP< ImplicitODEParameters< Scalar > > &p, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &y=Teuchos::null, const int index=0)
Solve implicit ODE, f(x, xDot, t, p) = 0.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const override
virtual void setZeroInitialGuess(bool zIG)
Set parameter so that the initial guess is set to zero (=True) or use last timestep (=False).
StepperState is a simple class to hold state information about the stepper.
Thyra Base interface for time steppers.
bool isInitialized_
True if stepper's member data is initialized.
void setICConsistencyCheck(bool c)
virtual void setStepperXDot(Teuchos::RCP< Thyra::VectorBase< Scalar > > xDot)
Set xDot for Stepper storage.
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getStepperXDot()
Get Stepper xDot.
void setStepperName(std::string s)
Set the stepper name.
virtual std::string description() const
virtual void initialize()
Initialize after construction and changing input parameters.
std::string getStepperType() const
Get the stepper type. The stepper type is used as an identifier for the stepper, and can only be set ...
virtual void setUseFSAL(bool a)
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual void checkInitialized()
Check initialization, and error out on failure.
void setStepperType(std::string s)
Set the stepper type.
void setICConsistency(std::string s)
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Teuchos::RCP< StepperBDF2< Scalar > > createStepperBDF2(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.