9 #ifndef Tempus_StepperLeapfrog_impl_hpp
10 #define Tempus_StepperLeapfrog_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,
"StepperLeapfrog::setSolver()");
53 *out <<
"Warning -- No solver to set for StepperLeapfrog "
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,
"StepperLeapfrog::setSolver()");
64 *out <<
"Warning -- No solver to set for StepperLeapfrog "
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,
"StepperLeapfrog::setSolver()");
75 *out <<
"Warning -- No solver to set for StepperLeapfrog "
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 "StepperLeapfrog::initialize()\n");
108 this->setParameterList(this->stepperPL_);
112 template<
class Scalar>
118 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperLeapfrog::takeStep()");
122 "Error - StepperLeapfrog<Scalar>::takeStep(...)\n"
123 "Need at least two SolutionStates for Leapfrog.\n"
125 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
126 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
128 typedef Thyra::ModelEvaluatorBase MEB;
130 RCP<SolutionState<Scalar> > currentState=
solutionHistory->getCurrentState();
131 RCP<SolutionState<Scalar> > workingState=
solutionHistory->getWorkingState();
132 const Scalar time = currentState->getTime();
133 const Scalar dt = workingState->getTimeStep();
137 if (workingState->getIsSynced() ==
true) {
138 if (getIsXDotXDotInitialized() ==
false) {
139 inArgs_.set_x(currentState->getX());
140 if (inArgs_.supports(MEB::IN_ARG_t)) inArgs_.set_t(time);
147 if (inArgs_.supports(MEB::IN_ARG_x_dot))
148 inArgs_.set_x_dot(Teuchos::null);
149 if (inArgs_.supports(MEB::IN_ARG_x_dot_dot))
150 inArgs_.set_x_dot_dot(Teuchos::null);
151 outArgs_.set_f(currentState->getXDotDot());
153 if (!Teuchos::is_null(stepperLFObserver_))
154 stepperLFObserver_->observeBeforeExplicitInitialize(
156 appModel_->evalModel(inArgs_,outArgs_);
157 setIsXDotXDotInitialized(
true);
160 if (!Teuchos::is_null(stepperLFObserver_))
161 stepperLFObserver_->observeBeforeXDotUpdateInitialize(
164 Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
165 *(currentState->getXDot()),0.5*dt,*(currentState->getXDotDot()));
168 if (!Teuchos::is_null(stepperLFObserver_))
171 Thyra::V_VpStV(Teuchos::outArg(*(workingState->getX())),
172 *(currentState->getX()),dt,*(workingState->getXDot()));
174 inArgs_.set_x(workingState->getX());
175 if (inArgs_.supports(MEB::IN_ARG_t)) inArgs_.set_t(time+dt);
182 if (inArgs_.supports(MEB::IN_ARG_x_dot)) inArgs_.set_x_dot(Teuchos::null);
183 if (inArgs_.supports(MEB::IN_ARG_x_dot_dot))
184 inArgs_.set_x_dot_dot(Teuchos::null);
185 outArgs_.set_f(workingState->getXDotDot());
187 if (!Teuchos::is_null(stepperLFObserver_))
189 appModel_->evalModel(inArgs_,outArgs_);
191 if (!Teuchos::is_null(stepperLFObserver_))
193 if (workingState->getOutput() ==
true) {
195 Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
196 *(workingState->getXDot()),0.5*dt,*(workingState->getXDotDot()));
197 workingState->setIsSynced(
true);
200 Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
201 *(workingState->getXDot()),dt,*(workingState->getXDotDot()));
202 workingState->setIsSynced(
false);
206 workingState->setOrder(this->getOrder());
219 template<
class Scalar>
223 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
229 template<
class Scalar>
232 std::string name =
"Leapfrog";
237 template<
class Scalar>
239 Teuchos::FancyOStream &out,
240 const Teuchos::EVerbosityLevel verbLevel)
const
242 out << description() <<
"::describe:" << std::endl
243 <<
"appModel_ = " << appModel_->description() << std::endl;
247 template <
class Scalar>
249 const Teuchos::RCP<Teuchos::ParameterList> & pList)
251 if (pList == Teuchos::null) {
253 if (stepperPL_ == Teuchos::null) stepperPL_ = this->getDefaultParameters();
257 stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
259 std::string stepperType = stepperPL_->get<std::string>(
"Stepper Type");
260 TEUCHOS_TEST_FOR_EXCEPTION( stepperType !=
"Leapfrog",
262 "Error - Stepper Type is not 'Leapfrog'!\n"
263 <<
" Stepper Type = "<< pList->get<std::string>(
"Stepper Type") <<
"\n");
267 template<
class Scalar>
268 Teuchos::RCP<const Teuchos::ParameterList>
271 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
272 pl->setName(
"Default Stepper - " + this->description());
273 pl->set(
"Stepper Type",
"Leapfrog",
274 "'Stepper Type' must be 'Leapfrog'.");
275 pl->set<
bool>(
"Is xDotDot Initialized", 0,
276 "At the beginning of an integration, the solution may or may not "
277 "be initialized. If false, the Leapfrog steppers will initialize "
278 "xDotDot during the first timestep.");
284 template<
class Scalar>
285 Teuchos::RCP<Teuchos::ParameterList>
288 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
289 *pl = *(this->getValidParameters());
294 template <
class Scalar>
295 Teuchos::RCP<Teuchos::ParameterList>
302 template <
class Scalar>
303 Teuchos::RCP<Teuchos::ParameterList>
306 Teuchos::RCP<Teuchos::ParameterList> temp_plist = stepperPL_;
307 stepperPL_ = Teuchos::null;
313 #endif // Tempus_StepperLeapfrog_impl_hpp