9 #ifndef Tempus_StepperForwardEuler_impl_hpp
10 #define Tempus_StepperForwardEuler_impl_hpp
12 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
13 #include "Thyra_VectorStdOps.hpp"
19 template<
class Scalar>
21 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel,
22 Teuchos::RCP<Teuchos::ParameterList> pList)
25 this->setParameterList(pList);
26 this->setModel(appModel);
30 template<
class Scalar>
32 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel)
34 this->validExplicitODE(appModel);
37 inArgs_ = appModel_->getNominalValues();
38 outArgs_ = appModel_->createOutArgs();
41 template<
class Scalar>
43 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel)
45 this->setModel(appModel);
48 template<
class Scalar>
51 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
52 Teuchos::OSTab ostab(out,1,
"StepperForwardEuler::setSolver()");
53 *out <<
"Warning -- No solver to set for StepperForwardEuler "
54 <<
"(i.e., explicit method).\n" << std::endl;
58 template<
class Scalar>
60 Teuchos::RCP<Teuchos::ParameterList> solverPL)
62 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
63 Teuchos::OSTab ostab(out,1,
"StepperForwardEuler::setSolver()");
64 *out <<
"Warning -- No solver to set for StepperForwardEuler "
65 <<
"(i.e., explicit method).\n" << std::endl;
69 template<
class Scalar>
71 Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver)
73 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
74 Teuchos::OSTab ostab(out,1,
"StepperForwardEuler::setSolver()");
75 *out <<
"Warning -- No solver to set for StepperForwardEuler "
76 <<
"(i.e., explicit method).\n" << std::endl;
80 template<
class Scalar>
84 if (obs == Teuchos::null) {
86 if (stepperObserver_ == Teuchos::null) {
93 stepperObserver_ = obs;
100 template<
class Scalar>
103 TEUCHOS_TEST_FOR_EXCEPTION(
104 this->appModel_ == Teuchos::null, std::logic_error,
105 "Error - Need to set the model, setModel(), before calling "
106 "StepperForwardEuler::initialize()\n");
108 this->setParameterList(this->stepperPL_);
112 template<
class Scalar>
118 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperForwardEuler::takeStep()");
122 "Error - StepperForwardEuler<Scalar>::takeStep(...)\n"
123 "Need at least two SolutionStates for Forward Euler.\n"
125 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
126 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
129 RCP<SolutionState<Scalar> > currentState=
solutionHistory->getCurrentState();
131 typedef Thyra::ModelEvaluatorBase MEB;
132 inArgs_.set_x(currentState->getX());
133 if (inArgs_.supports(MEB::IN_ARG_t)) inArgs_.set_t(currentState->getTime());
140 if (inArgs_.supports(MEB::IN_ARG_x_dot)) inArgs_.set_x_dot(Teuchos::null);
141 RCP<Thyra::VectorBase<Scalar> > xDot = currentState->getXDot();
142 if (xDot == Teuchos::null) xDot = getXDotTemp(currentState->getX());
143 outArgs_.set_f(xDot);
145 if (!Teuchos::is_null(stepperFEObserver_))
148 appModel_->evalModel(inArgs_,outArgs_);
151 RCP<SolutionState<Scalar> > workingState=
solutionHistory->getWorkingState();
152 const Scalar dt = workingState->getTimeStep();
153 Thyra::V_VpStV(Teuchos::outArg(*(workingState->getX())),
154 *(currentState->getX()),dt,*(xDot));
156 if (workingState->getXDot() != Teuchos::null)
157 assign((workingState->getXDot()).ptr(),
158 Teuchos::ScalarTraits<Scalar>::zero());
160 workingState->setOrder(this->getOrder());
167 template<
class Scalar>
168 Teuchos::RCP<Thyra::VectorBase<Scalar> >
172 if (xDotTemp_ == Teuchos::null) {
173 xDotTemp_ = x->clone_v();
174 Thyra::assign(xDotTemp_.ptr(), Scalar(0.0));
186 template<
class Scalar>
190 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
196 template<
class Scalar>
199 std::string name =
"Forward Euler";
204 template<
class Scalar>
206 Teuchos::FancyOStream &out,
207 const Teuchos::EVerbosityLevel verbLevel)
const
209 out << description() <<
"::describe:" << std::endl
210 <<
"appModel_ = " << appModel_->description() << std::endl;
214 template <
class Scalar>
216 const Teuchos::RCP<Teuchos::ParameterList> & pList)
218 if (pList == Teuchos::null) {
220 if (stepperPL_ == Teuchos::null) stepperPL_ = this->getDefaultParameters();
224 stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
226 std::string stepperType = stepperPL_->get<std::string>(
"Stepper Type");
227 TEUCHOS_TEST_FOR_EXCEPTION( stepperType !=
"Forward Euler",
229 "Error - Stepper Type is not 'Forward Euler'!\n"
230 <<
" Stepper Type = "<< pList->get<std::string>(
"Stepper Type") <<
"\n");
234 template<
class Scalar>
235 Teuchos::RCP<const Teuchos::ParameterList>
238 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
239 pl->setName(
"Default Stepper - " + this->description());
240 pl->set(
"Stepper Type",
"Forward Euler",
241 "'Stepper Type' must be 'Forward Euler'.");
247 template<
class Scalar>
248 Teuchos::RCP<Teuchos::ParameterList>
251 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
252 *pl = *(this->getValidParameters());
257 template <
class Scalar>
258 Teuchos::RCP<Teuchos::ParameterList>
265 template <
class Scalar>
266 Teuchos::RCP<Teuchos::ParameterList>
269 Teuchos::RCP<Teuchos::ParameterList> temp_plist = stepperPL_;
270 stepperPL_ = Teuchos::null;
276 #endif // Tempus_StepperForwardEuler_impl_hpp