9 #ifndef Tempus_StepperHHTAlpha_impl_hpp
10 #define Tempus_StepperHHTAlpha_impl_hpp
12 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
21 template <
class Scalar>
26 #ifdef VERBOSE_DEBUG_OUTPUT
27 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
30 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt * (1.0 - gamma_), a);
33 template <
class Scalar>
37 const Scalar dt)
const
39 #ifdef VERBOSE_DEBUG_OUTPUT
40 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
43 Scalar aConst = dt * dt / 2.0 * (1.0 - 2.0 * beta_);
44 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
46 Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
49 template <
class Scalar>
53 #ifdef VERBOSE_DEBUG_OUTPUT
54 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
57 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0 - alpha_f_, vPred, alpha_f_,
61 template <
class Scalar>
65 #ifdef VERBOSE_DEBUG_OUTPUT
66 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
69 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), 1.0 - alpha_f_, dPred, alpha_f_,
73 template <
class Scalar>
78 #ifdef VERBOSE_DEBUG_OUTPUT
79 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
81 Scalar c = 1.0 / (1.0 - alpha_m_);
84 Thyra::V_StVpStV(Teuchos::ptrFromRef(a_n_plus1), c, a_n_plus1, -c * alpha_m_,
88 template <
class Scalar>
93 #ifdef VERBOSE_DEBUG_OUTPUT
94 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
97 Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt * gamma_, a);
100 template <
class Scalar>
105 #ifdef VERBOSE_DEBUG_OUTPUT
106 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
109 Thyra::V_StVpStV(Teuchos::ptrFromRef(d), 1.0, dPred, beta_ * dt * dt, a);
112 template <
class Scalar>
115 if (schemeName_ !=
"Newmark Beta User Defined") {
116 out_->setOutputToRootOnly(0);
117 *out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
118 << schemeName_ <<
"').\n"
119 <<
" Leaving as beta = " << beta_ <<
"!\n";
126 out_->setOutputToRootOnly(0);
127 *out_ <<
"\nWARNING: Running (implicit implementation of) Newmark "
128 <<
"Implicit a-Form Stepper with Beta = 0.0, which \n"
129 <<
"specifies an explicit scheme. Mass lumping is not possible, "
130 <<
"so this will be slow! To run explicit \n"
131 <<
"implementation of Newmark Implicit a-Form Stepper, please "
132 <<
"re-run with 'Stepper Type' = 'Newmark Explicit a-Form'.\n"
133 <<
"This stepper allows for mass lumping when called through "
134 <<
"Piro::TempusSolver.\n";
138 (beta_ > 1.0) || (beta_ < 0.0), std::logic_error,
139 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Beta = "
140 << beta_ <<
". Please select Beta >= 0 and <= 1. \n");
142 this->isInitialized_ =
false;
145 template <
class Scalar>
148 if (schemeName_ !=
"Newmark Beta User Defined") {
149 out_->setOutputToRootOnly(0);
150 *out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
151 << schemeName_ <<
"').\n"
152 <<
" Leaving as gamma = " << gamma_ <<
"!\n";
159 (gamma_ > 1.0) || (gamma_ < 0.0), std::logic_error,
160 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Gamma ="
161 << gamma_ <<
". Please select Gamma >= 0 and <= 1. \n");
163 this->isInitialized_ =
false;
166 template <
class Scalar>
172 (alpha_f_ > 1.0) || (alpha_f_ < 0.0), std::logic_error,
173 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_f = "
174 << alpha_f_ <<
". Please select Alpha_f >= 0 and <= 1. \n");
176 this->isInitialized_ =
false;
179 template <
class Scalar>
185 (alpha_m_ >= 1.0) || (alpha_m_ < 0.0), std::logic_error,
186 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_m = "
187 << alpha_m_ <<
". Please select Alpha_m >= 0 and < 1. \n");
189 this->isInitialized_ =
false;
192 template <
class Scalar>
195 schemeName_ = schemeName;
197 if (schemeName_ ==
"Newmark Beta Average Acceleration") {
201 else if (schemeName_ ==
"Newmark Beta Linear Acceleration") {
205 else if (schemeName_ ==
"Newmark Beta Central Difference") {
209 else if (schemeName_ ==
"Newmark Beta User Defined") {
215 true, std::logic_error,
216 "\nError in Tempus::StepperHHTAlpha! "
217 <<
"Invalid Scheme Name = " << schemeName_ <<
". \n"
218 <<
"Valid Scheme Names are: 'Newmark Beta Average Acceleration', "
219 <<
"'Newmark Beta Linear Acceleration', \n"
220 <<
"'Newmark Beta Central Difference' and 'Newmark Beta User "
224 this->isInitialized_ =
false;
227 template <
class Scalar>
229 : out_(Teuchos::VerboseObjectBase::getDefaultOStream())
231 #ifdef VERBOSE_DEBUG_OUTPUT
232 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
248 template <
class Scalar>
252 bool useFSAL, std::string ICConsistency,
bool ICConsistencyCheck,
253 bool zeroInitialGuess, std::string schemeName, Scalar beta, Scalar gamma,
254 Scalar alpha_f, Scalar alpha_m,
256 stepperHHTAlphaAppAction)
257 : out_(Teuchos::VerboseObjectBase::getDefaultOStream())
266 if (schemeName ==
"Newmark Beta User Defined") {
275 if (appModel != Teuchos::null) {
281 template <
class Scalar>
285 if (appAction == Teuchos::null) {
287 stepperHHTAlphaAppAction_ =
291 stepperHHTAlphaAppAction_ = appAction;
295 template <
class Scalar>
299 #ifdef VERBOSE_DEBUG_OUTPUT
300 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
306 this->wrapperModel_ = wrapperModel;
309 "Error - Solver is not set!\n");
310 if (this->wrapperModel_ != Teuchos::null)
311 this->solver_->setModel(this->wrapperModel_);
313 this->isInitialized_ =
false;
316 template <
class Scalar>
320 #ifdef VERBOSE_DEBUG_OUTPUT
321 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
323 this->checkInitialized();
327 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperHHTAlpha::takeStep()");
330 solutionHistory->getNumStates() < 2, std::logic_error,
331 "Error - StepperHHTAlpha<Scalar>::takeStep(...)\n"
332 <<
"Need at least two SolutionStates for HHTAlpha.\n"
333 <<
" Number of States = " << solutionHistory->getNumStates()
334 <<
"\nTry setting in \"Solution History\" \"Storage Type\" = "
335 <<
"\"Undo\"\n or \"Storage Type\" = \"Static\" and \"Storage Limit\" = "
338 RCP<StepperHHTAlpha<Scalar> > thisStepper = Teuchos::rcpFromRef(*
this);
339 stepperHHTAlphaAppAction_->execute(
340 solutionHistory, thisStepper,
343 RCP<SolutionState<Scalar> > workingState =
344 solutionHistory->getWorkingState();
345 RCP<SolutionState<Scalar> > currentState =
346 solutionHistory->getCurrentState();
350 this->wrapperModel_);
353 RCP<const Thyra::VectorBase<Scalar> > d_old = currentState->getX();
354 RCP<const Thyra::VectorBase<Scalar> > v_old = currentState->getXDot();
355 RCP<Thyra::VectorBase<Scalar> > a_old = currentState->getXDotDot();
360 *out_ <<
"IKT d_old = " << Thyra::max(*d_old) <<
"\n";
361 *out_ <<
"IKT v_old = " << Thyra::max(*v_old) <<
"\n";
366 RCP<Thyra::VectorBase<Scalar> > d_new = workingState->getX();
367 RCP<Thyra::VectorBase<Scalar> > v_new = workingState->getXDot();
368 RCP<Thyra::VectorBase<Scalar> > a_new = workingState->getXDotDot();
371 const Scalar time = currentState->getTime();
372 const Scalar dt = workingState->getTimeStep();
374 Scalar t = time + dt;
378 if (time == solutionHistory->minTime()) {
379 RCP<Thyra::VectorBase<Scalar> > d_init =
380 Thyra::createMember(d_old->space());
381 RCP<Thyra::VectorBase<Scalar> > v_init =
382 Thyra::createMember(v_old->space());
383 RCP<Thyra::VectorBase<Scalar> > a_init =
384 Thyra::createMember(a_old->space());
385 Thyra::copy(*d_old, d_init.ptr());
386 Thyra::copy(*v_old, v_init.ptr());
387 if (this->initialGuess_ !=
391 (a_init->space())->isCompatible(*this->initialGuess_->space());
393 is_compatible !=
true, std::logic_error,
394 "Error in Tempus::NemwarkImplicitAForm takeStep(): user-provided "
396 <<
"for Newton is not compatible with solution vector!\n");
397 Thyra::copy(*this->initialGuess_, a_init.ptr());
400 Thyra::put_scalar(0.0, a_init.ptr());
402 wrapperModel->initializeNewmark(v_init, d_init, 0.0, time, beta_, gamma_);
404 (*(this->solver_)).solve(&*a_init);
406 workingState->setSolutionStatus(sStatus);
407 Thyra::copy(*a_init, a_old.ptr());
411 *out_ <<
"IKT a_old = " << Thyra::max(*a_old) <<
"\n";
415 RCP<Thyra::VectorBase<Scalar> > d_pred =
416 Thyra::createMember(d_old->space());
417 RCP<Thyra::VectorBase<Scalar> > v_pred =
418 Thyra::createMember(v_old->space());
421 predictDisplacement(*d_pred, *d_old, *v_old, *a_old, dt);
422 predictVelocity(*v_pred, *v_old, *a_old, dt);
426 predictDisplacement_alpha_f(*d_pred, *d_old);
427 predictVelocity_alpha_f(*v_pred, *v_old);
430 wrapperModel->initializeNewmark(v_pred, d_pred, dt, t, beta_, gamma_);
432 stepperHHTAlphaAppAction_->execute(
433 solutionHistory, thisStepper,
438 (*(this->solver_)).solve(&*a_new);
440 stepperHHTAlphaAppAction_->execute(
441 solutionHistory, thisStepper,
445 correctAcceleration(*a_new, *a_old);
448 correctVelocity(*v_new, *v_pred, *a_new, dt);
449 correctDisplacement(*d_new, *d_pred, *a_new, dt);
451 workingState->setSolutionStatus(sStatus);
452 workingState->setOrder(this->getOrder());
453 workingState->computeNorms(currentState);
455 stepperHHTAlphaAppAction_->execute(
456 solutionHistory, thisStepper,
468 template <
class Scalar>
472 #ifdef VERBOSE_DEBUG_OUTPUT
473 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
480 template <
class Scalar>
484 auto l_out = Teuchos::fancyOStream(out.
getOStream());
486 l_out->setOutputToRootOnly(0);
488 #ifdef VERBOSE_DEBUG_OUTPUT
489 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
496 *l_out <<
"--- StepperHHTAlpha ---\n";
497 *l_out <<
" schemeName_ = " << schemeName_ << std::endl;
498 *l_out <<
" beta_ = " << beta_ << std::endl;
499 *l_out <<
" gamma_ = " << gamma_ << std::endl;
500 *l_out <<
" alpha_f_ = " << alpha_f_ << std::endl;
501 *l_out <<
" alpha_m_ = " << alpha_m_ << std::endl;
502 *l_out <<
"-----------------------" << std::endl;
505 template <
class Scalar>
509 bool isValidSetup =
true;
514 if (this->wrapperModel_->getAppModel() == Teuchos::null) {
515 isValidSetup =
false;
516 out <<
"The application ModelEvaluator is not set!\n";
519 if (this->wrapperModel_ == Teuchos::null) {
520 isValidSetup =
false;
521 out <<
"The wrapper ModelEvaluator is not set!\n";
524 if (this->solver_ == Teuchos::null) {
525 isValidSetup =
false;
526 out <<
"The solver is not set!\n";
532 template <
class Scalar>
536 #ifdef VERBOSE_DEBUG_OUTPUT
537 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
539 auto pl = this->getValidParametersBasicImplicit();
541 auto hhtalphaPL = Teuchos::parameterList(
"HHT-Alpha Parameters");
542 hhtalphaPL->set<std::string>(
"Scheme Name", schemeName_);
543 hhtalphaPL->set<
double>(
"Beta", beta_);
544 hhtalphaPL->set<
double>(
"Gamma", gamma_);
545 hhtalphaPL->set<
double>(
"Alpha_f", alpha_f_);
546 hhtalphaPL->set<
double>(
"Alpha_m", alpha_m_);
547 pl->set(
"HHT-Alpha Parameters", *hhtalphaPL);
554 template <
class Scalar>
560 stepper->setStepperImplicitValues(pl);
562 if (pl != Teuchos::null) {
563 if (pl->
isSublist(
"HHT-Alpha Parameters")) {
564 auto hhtalphaPL = pl->
sublist(
"HHT-Alpha Parameters",
true);
565 std::string schemeName = hhtalphaPL.
get<std::string>(
566 "Scheme Name",
"Newmark Beta Average Acceleration");
567 stepper->setSchemeName(schemeName);
568 if (schemeName ==
"Newmark Beta User Defined") {
569 stepper->setBeta(hhtalphaPL.get<
double>(
"Beta", 0.25));
570 stepper->setGamma(hhtalphaPL.get<
double>(
"Gamma", 0.5));
572 stepper->setAlphaF(hhtalphaPL.get<
double>(
"Alpha_f", 0.0));
573 stepper->setAlphaM(hhtalphaPL.get<
double>(
"Alpha_m", 0.0));
576 stepper->setSchemeName(
"Newmark Beta Average Acceleration");
577 stepper->setAlphaF(0.0);
578 stepper->setAlphaM(0.0);
582 if (model != Teuchos::null) {
583 stepper->setModel(model);
584 stepper->initialize();
591 #endif // Tempus_StepperHHTAlpha_impl_hpp
void setBeta(Scalar beta)
void correctDisplacement(Thyra::VectorBase< Scalar > &d, const Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
virtual void setSolver(Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > solver) override
Set solver.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
void correctVelocity(Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
T & get(const std::string &name, T def_value)
Application Action for HHT Alpha.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setStepperName(std::string s)
Set the stepper name.
void correctAcceleration(Thyra::VectorBase< Scalar > &a_n_plus1, const Thyra::VectorBase< Scalar > &a_n) const
void setAlphaF(Scalar alpha_f)
virtual void initialize()
Initialize after construction and changing input parameters.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
StepperHHTAlpha()
Default constructor.
A ModelEvaluator for residual evaluations given a state. This ModelEvaluator takes a state...
Thyra Base interface for time steppers.
StepperState is a simple class to hold state information about the stepper.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
bool isSublist(const std::string &name) const
virtual void setDefaultSolver()
void setAlphaM(Scalar alpha_m)
void predictVelocity_alpha_f(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v) const
void setICConsistencyCheck(bool c)
void setSchemeName(std::string schemeName)
virtual void setZeroInitialGuess(bool zIG)
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
Default modifier for StepperHHTAlpha.
void predictDisplacement_alpha_f(Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &d) const
void predictDisplacement(Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &d, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
Teuchos::RCP< StepperHHTAlpha< Scalar > > createStepperHHTAlpha(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
void validSecondOrderODE_DAE(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Teuchos::RCP< Teuchos::FancyOStream > out_
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
void predictVelocity(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
virtual void setAppAction(Teuchos::RCP< StepperHHTAlphaAppAction< Scalar > > appAction)
void setGamma(Scalar gamma)
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual void setUseFSAL(bool a)
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
void setStepperType(std::string s)
Set the stepper type.
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
void setICConsistency(std::string s)