9#ifndef Tempus_StepperBackwardEuler_impl_hpp
10#define Tempus_StepperBackwardEuler_impl_hpp
13#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) {
68 if (predictorType ==
"None") {
94 TEUCHOS_TEST_FOR_EXCEPTION(
96 this->wrapperModel_->getAppModel() == Teuchos::null, std::logic_error,
97 "Error - Need to set the model, setModel(), before calling "
98 "StepperBackwardEuler::setPredictor()\n");
108template<
class Scalar>
112 if (appAction == Teuchos::null) {
123template<
class Scalar>
141template<
class Scalar>
147 RCP<SolutionState<Scalar> > initialState = solutionHistory->getCurrentState();
150 if (initialState->getXDot() == Teuchos::null)
159template<
class Scalar>
167 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperBackwardEuler::takeStep()");
169 TEUCHOS_TEST_FOR_EXCEPTION(solutionHistory->getNumStates() < 2,
171 "Error - StepperBackwardEuler<Scalar>::takeStep(...)\n"
172 "Need at least two SolutionStates for Backward Euler.\n"
173 " Number of States = " << solutionHistory->getNumStates() <<
"\n"
174 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
175 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
177 RCP<StepperBackwardEuler<Scalar> > thisStepper = Teuchos::rcpFromRef(*
this);
181 RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
182 RCP<SolutionState<Scalar> > currentState=solutionHistory->getCurrentState();
184 RCP<const Thyra::VectorBase<Scalar> > xOld = currentState->getX();
185 RCP<Thyra::VectorBase<Scalar> > x = workingState->getX();
186 if (workingState->getXDot() != Teuchos::null)
194 const Scalar time = workingState->getTime();
195 const Scalar dt = workingState->getTimeStep();
198 Teuchos::RCP<TimeDerivative<Scalar> > timeDer =
200 Scalar(1.0)/dt,xOld));
202 const Scalar alpha = Scalar(1.0)/dt;
203 const Scalar beta = Scalar(1.0);
205 timeDer, dt, alpha, beta));
210 const Thyra::SolveStatus<Scalar> sStatus =
216 if (workingState->getXDot() != Teuchos::null)
217 timeDer->compute(x, xDot);
219 workingState->setSolutionStatus(sStatus);
220 workingState->setOrder(this->
getOrder());
221 workingState->computeNorms(currentState);
228template<
class Scalar>
235 if (solutionHistory->getWorkingState()->getSolutionStatus()==
Status::FAILED) {
236 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
237 Teuchos::OSTab ostab(out,1,
"StepperBackwardEuler::computePredictor");
238 *out <<
"Warning - predictorStepper has failed." << std::endl;
241 solutionHistory->getWorkingState()->setSolutionStatus(
Status::WORKING);
252template<
class Scalar>
253Teuchos::RCP<Tempus::StepperState<Scalar> >
257 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
263template<
class Scalar>
265 Teuchos::FancyOStream &out,
266 const Teuchos::EVerbosityLevel verbLevel)
const
268 out.setOutputToRootOnly(0);
273 out <<
"--- StepperBackwardEuler ---\n";
274 out <<
" predictorStepper_ = "
277 out <<
" predictorStepper_->isInitialized() = "
279 out <<
" predictor stepper type = "
282 out <<
" stepperBEAppAction_ = "
284 out <<
"----------------------------" << std::endl;
288template<
class Scalar>
291 out.setOutputToRootOnly(0);
300 out <<
"The predictor stepper is not initialized!\n";
306 out <<
"The Backward Euler AppAction is not set!\n";
313template<
class Scalar>
314Teuchos::RCP<const Teuchos::ParameterList>
319 pl->set(
"Predictor Stepper Type",
"None");
326template <
class Scalar>
334template <
class Scalar>
339 const Teuchos::Array<Scalar>& t,
341 const int param_index)
const
343 typedef Thyra::ModelEvaluatorBase MEB;
344 MEB::OutArgs<Scalar> outArgs = this->
wrapperModel_->getOutArgs();
345 outArgs.set_f(Teuchos::rcpFromRef(residual));
349template <
class Scalar>
354 const Teuchos::Array<Scalar>& t,
356 const int param_index,
357 const int deriv_index)
const
359 typedef Thyra::ModelEvaluatorBase MEB;
360 MEB::OutArgs<Scalar> outArgs = this->
wrapperModel_->getOutArgs();
361 TEUCHOS_ASSERT(outArgs.supports(MEB::OUT_ARG_W_op));
362 outArgs.set_W_op(Teuchos::rcpFromRef(jacobian));
366template <
class Scalar>
371 const Teuchos::Array<Scalar>& t,
373 const int param_index)
const
375 typedef Thyra::ModelEvaluatorBase MEB;
376 MEB::OutArgs<Scalar> outArgs = this->
wrapperModel_->getOutArgs();
377 TEUCHOS_ASSERT(outArgs.supports(MEB::OUT_ARG_DfDp, param_index).supports(MEB::DERIV_LINEAR_OP));
378 outArgs.set_DfDp(param_index,
379 MEB::Derivative<Scalar>(Teuchos::rcpFromRef(deriv)));
383template <
class Scalar>
388 const Teuchos::Array<Scalar>& t,
390 const int param_index)
const
392 typedef Thyra::ModelEvaluatorBase MEB;
393 MEB::OutArgs<Scalar> outArgs = this->
wrapperModel_->getOutArgs();
394 TEUCHOS_ASSERT(outArgs.supports(MEB::OUT_ARG_W));
395 outArgs.set_W(Teuchos::rcpFromRef(jacobian_solver));
399template <
class Scalar>
402 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs,
404 const Teuchos::Array<Scalar>& t,
406 const int param_index,
407 const int deriv_index)
const
410 typedef Thyra::ModelEvaluatorBase MEB;
412 TEUCHOS_ASSERT(x.size() == 2);
413 TEUCHOS_ASSERT(t.size() == 2);
414 RCP<const Thyra::VectorBase<Scalar> > xn = x[0];
415 RCP<const Thyra::VectorBase<Scalar> > xo = x[1];
416 const Scalar tn = t[0];
417 const Scalar to = t[1];
418 const Scalar dt = tn-to;
421 RCP<Thyra::VectorBase<Scalar> > x_dot = xn->clone_v();
422 Teuchos::RCP<TimeDerivative<Scalar> > timeDer =
424 timeDer->compute(xn, x_dot);
427 MEB::InArgs<Scalar> inArgs = this->
wrapperModel_->getInArgs();
429 if (inArgs.supports(MEB::IN_ARG_x_dot )) inArgs.set_x_dot (x_dot);
430 if (inArgs.supports(MEB::IN_ARG_t )) inArgs.set_t (tn);
431 if (inArgs.supports(MEB::IN_ARG_step_size )) inArgs.set_step_size(dt);
432 inArgs.set_p(param_index, Teuchos::rcpFromRef(p));
433 TEUCHOS_ASSERT(inArgs.supports(MEB::IN_ARG_alpha));
434 TEUCHOS_ASSERT(inArgs.supports(MEB::IN_ARG_beta));
435 if (deriv_index == 0) {
437 inArgs.set_alpha(Scalar(1.0)/dt);
438 inArgs.set_beta(Scalar(1.0));
440 else if (deriv_index == 1) {
442 inArgs.set_alpha(Scalar(-1.0)/dt);
443 inArgs.set_beta(Scalar(0.0));
445 this->
wrapperModel_->getAppModel()->evalModel(inArgs, outArgs);
451template<
class Scalar>
452Teuchos::RCP<StepperBackwardEuler<Scalar> >
455 Teuchos::RCP<Teuchos::ParameterList> pl)
459 stepper->setStepperImplicitValues(pl);
461 if (pl != Teuchos::null) {
462 std::string predictorName =
463 pl->get<std::string>(
"Predictor Stepper Type",
"None");
464 stepper->setPredictor(predictorName);
467 if (model != Teuchos::null) {
468 stepper->setModel(model);
469 stepper->initialize();
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Application Action for StepperBackwardEuler.
@ BEGIN_STEP
At the beginning of the step.
@ AFTER_SOLVE
After the implicit solve.
@ END_STEP
At the end of the step.
@ BEFORE_SOLVE
Before the implicit solve.
Default modifier for StepperBackwardEuler.
Time-derivative interface for Backward Euler.
Backward Euler time stepper.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState() override
Get a default (initial) StepperState.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual void setAppAction(Teuchos::RCP< StepperBackwardEulerAppAction< Scalar > > appAction)
virtual int stencilLength() const override
Return the number of solution vectors in the time step stencil.
virtual void computeStepResidual(Thyra::VectorBase< Scalar > &residual, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const override
Compute time step residual.
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel) override
Set the model.
virtual void computePredictor(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute predictor given the supplied stepper.
Teuchos::RCP< StepperBackwardEulerAppAction< Scalar > > stepperBEAppAction_
void setPredictor(std::string predictorType="None")
Set the predictor.
virtual void computeStepSolver(Thyra::LinearOpWithSolveBase< Scalar > &jacobian_solver, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const override
Compute time step Jacobian solver.
Teuchos::RCP< Stepper< Scalar > > predictorStepper_
virtual void computeStepJacobian(Thyra::LinearOpBase< Scalar > &jacobian, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index, const int deriv_index) const override
Compute time step Jacobian.
virtual Scalar getOrder() const override
virtual void computeStepParamDeriv(Thyra::LinearOpBase< Scalar > &deriv, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const override
Compute time step derivative w.r.t. model parameters.
StepperBackwardEuler()
Default constructor.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const override
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Set the initial conditions and make them consistent.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Return a valid ParameterList with current settings.
void computeStepResidDerivImpl(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index, const int deriv_index=0) const
Implementation of computeStep*() methods.
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Take the specified timestep, dt, and return true if successful.
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 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< StepperBackwardEuler< Scalar > > createStepperBackwardEuler(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.