10#ifndef Tempus_StepperBDF2_impl_hpp
11#define Tempus_StepperBDF2_impl_hpp
13#include "Tempus_WrapperModelEvaluatorBasic.hpp"
15#include "Tempus_StepperFactory.hpp"
19template <
class Scalar>
34template <
class Scalar>
37 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
39 std::string ICConsistency,
bool ICConsistencyCheck,
bool zeroInitialGuess,
53 if (appModel != Teuchos::null) {
59template <
class Scalar>
73template <
class Scalar>
89template <
class Scalar>
96 TEUCHOS_TEST_FOR_EXCEPTION(
97 this->
wrapperModel_->getAppModel() == Teuchos::null, std::logic_error,
98 "Error - Can not set the startUpStepper to Teuchos::null.\n");
100 if (startUpStepper->getModel() == Teuchos::null &&
101 this->wrapperModel_->getAppModel() != Teuchos::null) {
110template <
class Scalar>
114 if (appAction == Teuchos::null) {
124template <
class Scalar>
130template <
class Scalar>
136 RCP<SolutionState<Scalar> > initialState = solutionHistory->getCurrentState();
139 if (initialState->getXDot() == Teuchos::null)
147template <
class Scalar>
155 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperBDF2::takeStep()");
157 int numStates = solutionHistory->getNumStates();
159 RCP<Thyra::VectorBase<Scalar> > xOld;
160 RCP<Thyra::VectorBase<Scalar> > xOldOld;
168 TEUCHOS_TEST_FOR_EXCEPTION(
169 (numStates < 3), std::logic_error,
170 "Error in Tempus::StepperBDF2::takeStep(): numStates after \n"
171 <<
"startup stepper must be at least 3, whereas numStates = "
172 << numStates <<
"!\n"
173 <<
"If running with Storage Type = Static, "
174 <<
"make sure Storage Limit > 2.\n");
179 RCP<StepperBDF2<Scalar> > thisStepper = Teuchos::rcpFromRef(*
this);
181 solutionHistory, thisStepper,
184 RCP<SolutionState<Scalar> > workingState =
185 solutionHistory->getWorkingState();
186 RCP<SolutionState<Scalar> > currentState =
187 solutionHistory->getCurrentState();
189 RCP<Thyra::VectorBase<Scalar> > x = workingState->getX();
190 if (workingState->getXDot() != Teuchos::null)
195 const Scalar time = workingState->getTime();
196 const Scalar dt = workingState->getTimeStep();
197 const Scalar dtOld = currentState->getTimeStep();
199 xOld = solutionHistory->getStateTimeIndexNM1()->getX();
200 xOldOld = solutionHistory->getStateTimeIndexNM2()->getX();
204 Teuchos::RCP<TimeDerivative<Scalar> > timeDer = Teuchos::rcp(
207 const Scalar alpha =
getAlpha(dt, dtOld);
208 const Scalar beta =
getBeta(dt);
210 auto p = Teuchos::rcp(
213 solutionHistory, thisStepper,
216 const Thyra::SolveStatus<Scalar> sStatus =
220 solutionHistory, thisStepper,
223 if (workingState->getXDot() != Teuchos::null) timeDer->compute(x, xDot);
225 workingState->setSolutionStatus(sStatus);
227 workingState->computeNorms(currentState);
229 solutionHistory, thisStepper,
235template <
class Scalar>
239 auto out = Teuchos::fancyOStream(this->getOStream());
240 out->setOutputToRootOnly(0);
241 Teuchos::OSTab ostab(out, 1,
"StepperBDF2::computeStartUp()");
242 *out <<
"Warning -- Taking a startup step for BDF2 using '"
257template <
class Scalar>
258Teuchos::RCP<Tempus::StepperState<Scalar> >
261 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
266template <
class Scalar>
268 Teuchos::FancyOStream& out,
const Teuchos::EVerbosityLevel verbLevel)
const
270 auto l_out = Teuchos::fancyOStream(out.getOStream());
271 Teuchos::OSTab ostab(*l_out, 2, this->
description());
272 l_out->setOutputToRootOnly(0);
277 *l_out <<
"--- StepperBDF2 ---\n";
279 *l_out <<
" startup stepper type = "
284 *l_out <<
" startUpStepper_->isInitialized() = "
288 *l_out <<
"----------------------------" << std::endl;
289 *l_out <<
" order_ = " <<
order_ << std::endl;
290 *l_out <<
"-------------------" << std::endl;
293template <
class Scalar>
297 auto l_out = Teuchos::fancyOStream(out.getOStream());
298 l_out->setOutputToRootOnly(0);
305 *l_out <<
"The startup stepper is not initialized!\n";
309 *l_out <<
"The BDF2 AppAction is not set!\n";
314template <
class Scalar>
315Teuchos::RCP<const Teuchos::ParameterList>
325template <
class Scalar>
328 Teuchos::RCP<Teuchos::ParameterList> pl)
331 stepper->setStepperImplicitValues(pl);
333 std::string startUpStepperName =
"DIRK 1 Stage Theta Method";
334 if (pl != Teuchos::null)
336 pl->get<std::string>(
"Start Up Stepper Type", startUpStepperName);
337 stepper->setStartUpStepper(startUpStepperName);
339 if (model != Teuchos::null) {
340 stepper->setModel(model);
341 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.
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.
Default modifier for StepperBDF2.
Time-derivative interface for BDF2.
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
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.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const override
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=-1)
Solve implicit ODE, f(x, xDot, t, p) = 0.
virtual void setZeroInitialGuess(bool zIG)
StepperState is a simple class to hold state information about the stepper.
Teuchos::RCP< StepperBDF2< Scalar > > createStepperBDF2(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.