9 #ifndef Tempus_StepperNewmarkExplicitAForm_impl_hpp
10 #define Tempus_StepperNewmarkExplicitAForm_impl_hpp
12 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
13 #include "Thyra_VectorStdOps.hpp"
20 template<
class Scalar>
23 const Thyra::VectorBase<Scalar>& v,
24 const Thyra::VectorBase<Scalar>& a,
25 const Scalar dt)
const
28 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt*(1.0-gamma_), a);
31 template<
class Scalar>
34 const Thyra::VectorBase<Scalar>& d,
35 const Thyra::VectorBase<Scalar>& v,
36 const Thyra::VectorBase<Scalar>& a,
37 const Scalar dt)
const
39 Teuchos::RCP<const Thyra::VectorBase<Scalar> > tmp =
40 Thyra::createMember<Scalar>(dPred.space());
42 Scalar aConst = dt*dt/2.0;
43 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
45 Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
48 template<
class Scalar>
51 const Thyra::VectorBase<Scalar>& vPred,
52 const Thyra::VectorBase<Scalar>& a,
53 const Scalar dt)
const
56 Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt*gamma_, a);
60 template<
class Scalar>
62 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel,
63 Teuchos::RCP<Teuchos::ParameterList> pList) :
64 out_(
Teuchos::VerboseObjectBase::getDefaultOStream())
72 template<
class Scalar>
74 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel)
76 this->validExplicitODE(appModel);
79 inArgs_ = appModel_->createInArgs();
80 outArgs_ = appModel_->createOutArgs();
81 inArgs_ = appModel_->getNominalValues();
84 template<
class Scalar>
86 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel)
88 this->setModel(appModel);
91 template<
class Scalar>
94 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
95 Teuchos::OSTab ostab(out,1,
"StepperNewmarkExplicitAForm::setSolver()");
96 *out <<
"Warning -- No solver to set for StepperNewmarkExplicitAForm "
97 <<
"(i.e., explicit method).\n" << std::endl;
101 template<
class Scalar>
103 Teuchos::RCP<Teuchos::ParameterList> solverPL)
105 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
106 Teuchos::OSTab ostab(out,1,
"StepperNewmarkExplicitAForm::setSolver()");
107 *out <<
"Warning -- No solver to set for StepperNewmarkExplicitAForm "
108 <<
"(i.e., explicit method).\n" << std::endl;
112 template<
class Scalar>
114 Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver)
116 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
117 Teuchos::OSTab ostab(out,1,
"StepperNewmarkExplicitAForm::setSolver()");
118 *out <<
"Warning -- No solver to set for StepperNewmarkExplicitAForm "
119 <<
"(i.e., explicit method).\n" << std::endl;
123 template<
class Scalar>
126 TEUCHOS_TEST_FOR_EXCEPTION(
127 this->appModel_ == Teuchos::null, std::logic_error,
128 "Error - Need to set the model, setModel(), before calling "
129 "StepperNewmarkExplicitAForm::initialize()\n");
131 this->setParameterList(this->stepperPL_);
134 template<
class Scalar>
140 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperNewmarkExplicitAForm::takeStep()");
144 "Error - StepperNewmarkExplicitAForm<Scalar>::takeStep(...)\n"
145 "Need at least two SolutionStates for NewmarkExplicitAForm.\n"
147 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
148 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
150 RCP<SolutionState<Scalar> > currentState=
solutionHistory->getCurrentState();
151 RCP<SolutionState<Scalar> > workingState=
solutionHistory->getWorkingState();
154 RCP<const Thyra::VectorBase<Scalar> > d_old = currentState->getX();
155 RCP<const Thyra::VectorBase<Scalar> > v_old = currentState->getXDot();
156 RCP<Thyra::VectorBase<Scalar> > a_old = currentState->getXDotDot();
159 const Scalar dt = workingState->getTimeStep();
160 const Scalar time = currentState->getTime();
162 typedef Thyra::ModelEvaluatorBase MEB;
165 *out_ <<
"IKT d_old = " << Thyra::max(*d_old) <<
"\n";
166 *out_ <<
"IKT v_old = " << Thyra::max(*v_old) <<
"\n";
167 *out_ <<
"IKT a_old prescribed = " << Thyra::max(*a_old) <<
"\n";
173 RCP<Thyra::VectorBase<Scalar> > a_init = Thyra::createMember(d_old->space());
174 Thyra::put_scalar(0.0, a_init.ptr());
177 inArgs_.set_x(d_old);
178 inArgs_.set_x_dot(v_old);
179 if (inArgs_.supports(MEB::IN_ARG_t)) inArgs_.set_t(time);
185 if (inArgs_.supports(MEB::IN_ARG_x_dot_dot)) inArgs_.set_x_dot_dot(Teuchos::null);
186 outArgs_.set_f(a_init);
187 appModel_->evalModel(inArgs_,outArgs_);
188 Thyra::copy(*a_init, a_old.ptr());
190 *out_ <<
"IKT a_init computed = " << Thyra::max(*a_old) <<
"\n";
196 RCP<Thyra::VectorBase<Scalar> > d_new = workingState->getX();
197 RCP<Thyra::VectorBase<Scalar> > v_new = workingState->getXDot();
198 RCP<Thyra::VectorBase<Scalar> > a_new = workingState->getXDotDot();
201 RCP<Thyra::VectorBase<Scalar> > d_pred =Thyra::createMember(d_old->space());
202 RCP<Thyra::VectorBase<Scalar> > v_pred =Thyra::createMember(v_old->space());
205 predictDisplacement(*d_pred, *d_old, *v_old, *a_old, dt);
206 predictVelocity(*v_pred, *v_old, *a_old, dt);
209 *out_ <<
"IKT d_pred = " << Thyra::max(*d_pred) <<
"\n";
210 *out_ <<
"IKT v_pred = " << Thyra::max(*v_pred) <<
"\n";
214 inArgs_.set_x(d_pred);
215 inArgs_.set_x_dot(v_pred);
216 if (inArgs_.supports(MEB::IN_ARG_t)) inArgs_.set_t(currentState->getTime());
223 if (inArgs_.supports(MEB::IN_ARG_x_dot_dot)) inArgs_.set_x_dot_dot(Teuchos::null);
224 outArgs_.set_f(a_old);
226 appModel_->evalModel(inArgs_,outArgs_);
228 Thyra::copy(*(outArgs_.get_f()), a_new.ptr());
230 *out_ <<
"IKT a_new = " << Thyra::max(*(workingState()->getXDotDot())) <<
"\n";
234 Thyra::copy(*d_pred, d_new.ptr());
237 correctVelocity(*v_new, *v_pred, *a_new, dt);
239 *out_ <<
"IKT d_new = " << Thyra::max(*(workingState()->getX())) <<
"\n";
240 *out_ <<
"IKT v_new = " << Thyra::max(*(workingState()->getXDot())) <<
"\n";
244 workingState->setOrder(this->getOrder());
256 template<
class Scalar>
260 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
266 template<
class Scalar>
269 std::string name =
"Newmark Explicit a-Form";
274 template<
class Scalar>
276 Teuchos::FancyOStream &out,
277 const Teuchos::EVerbosityLevel verbLevel)
const
279 out << description() <<
"::describe:" << std::endl
280 <<
"appModel_ = " << appModel_->description() << std::endl;
284 template <
class Scalar>
286 const Teuchos::RCP<Teuchos::ParameterList> & pList)
288 if (pList == Teuchos::null) {
290 if (stepperPL_ == Teuchos::null) stepperPL_ = this->getDefaultParameters();
294 stepperPL_->validateParametersAndSetDefaults(*this->getValidParameters());
296 std::string stepperType = stepperPL_->get<std::string>(
"Stepper Type");
297 TEUCHOS_TEST_FOR_EXCEPTION( stepperType !=
"Newmark Explicit a-Form",
299 "Error - Stepper Type is not 'Newmark Explicit a-Form'!\n"
300 <<
" Stepper Type = "<< pList->get<std::string>(
"Stepper Type") <<
"\n");
302 if (stepperPL_->isSublist(
"Newmark Explicit Parameters")) {
303 Teuchos::ParameterList &newmarkPL =
304 stepperPL_->sublist(
"Newmark Explicit Parameters",
true);
305 gamma_ = newmarkPL.get(
"Gamma", 0.5);
306 *out_ <<
"\nSetting Gamma = " << gamma_ <<
" from input file.\n";
308 TEUCHOS_TEST_FOR_EXCEPTION( (gamma_ > 1.0) || (gamma_ < 0.0),
310 "\nError in 'Newmark Explicit a-Form' stepper: invalid value of Gamma = " <<gamma_ <<
". Please select Gamma >= 0 and <= 1. \n");
315 template<
class Scalar>
316 Teuchos::RCP<const Teuchos::ParameterList>
319 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
320 pl->setName(
"Default Stepper - " + this->description());
321 pl->set(
"Stepper Type",
"Newmark Explicit a-Form",
322 "'Stepper Type' must be 'Newmark Explicit a-Form'.");
323 pl->sublist(
"Newmark Explicit Parameters",
false,
"");
324 pl->sublist(
"Newmark Explicit Parameters",
false,
"").set(
"Gamma",
325 0.5,
"Newmark Explicit parameter");
331 template<
class Scalar>
332 Teuchos::RCP<Teuchos::ParameterList>
335 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
336 *pl = *(this->getValidParameters());
341 template <
class Scalar>
342 Teuchos::RCP<Teuchos::ParameterList>
349 template <
class Scalar>
350 Teuchos::RCP<Teuchos::ParameterList>
353 Teuchos::RCP<Teuchos::ParameterList> temp_plist = stepperPL_;
354 stepperPL_ = Teuchos::null;
360 #endif // Tempus_StepperNewmarkExplicitAForm_impl_hpp