9#ifndef Tempus_StepperHHTAlpha_impl_hpp
10#define Tempus_StepperHHTAlpha_impl_hpp
12#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
27 const Scalar dt)
const
29#ifdef VERBOSE_DEBUG_OUTPUT
30 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
33 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt*(1.0-
gamma_), a);
42 const Scalar dt)
const
44#ifdef VERBOSE_DEBUG_OUTPUT
45 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
48 Scalar aConst = dt*dt/2.0*(1.0-2.0*
beta_);
49 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
51 Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
60#ifdef VERBOSE_DEBUG_OUTPUT
61 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
64 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0-
alpha_f_, vPred,
alpha_f_, v);
73#ifdef VERBOSE_DEBUG_OUTPUT
74 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
77 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), 1.0-
alpha_f_, dPred,
alpha_f_, d);
85#ifdef VERBOSE_DEBUG_OUTPUT
86 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
90 Thyra::V_StVpStV(Teuchos::ptrFromRef(a_n_plus1), c, a_n_plus1, -c*
alpha_m_, a_n);
100 const Scalar dt)
const
102#ifdef VERBOSE_DEBUG_OUTPUT
103 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
106 Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt*
gamma_, a);
109template<
class Scalar>
114 const Scalar dt)
const
116#ifdef VERBOSE_DEBUG_OUTPUT
117 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
120 Thyra::V_StVpStV(Teuchos::ptrFromRef(d), 1.0, dPred,
beta_*dt*dt, a);
125template<
class Scalar>
129 out_->setOutputToRootOnly(0);
130 *
out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
132 <<
" Leaving as beta = " <<
beta_ <<
"!\n";
139 out_->setOutputToRootOnly(0);
140 *
out_ <<
"\nWARNING: Running (implicit implementation of) Newmark "
141 <<
"Implicit a-Form Stepper with Beta = 0.0, which \n"
142 <<
"specifies an explicit scheme. Mass lumping is not possible, "
143 <<
"so this will be slow! To run explicit \n"
144 <<
"implementation of Newmark Implicit a-Form Stepper, please "
145 <<
"re-run with 'Stepper Type' = 'Newmark Explicit a-Form'.\n"
146 <<
"This stepper allows for mass lumping when called through "
147 <<
"Piro::TempusSolver.\n";
150 TEUCHOS_TEST_FOR_EXCEPTION( (
beta_ > 1.0) || (
beta_ < 0.0),
152 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Beta = "
153 <<
beta_ <<
". Please select Beta >= 0 and <= 1. \n");
159template<
class Scalar>
163 out_->setOutputToRootOnly(0);
164 *
out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
166 <<
" Leaving as gamma = " <<
gamma_ <<
"!\n";
172 TEUCHOS_TEST_FOR_EXCEPTION( (
gamma_ > 1.0) || (
gamma_ < 0.0),
174 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Gamma ="
175 <<
gamma_ <<
". Please select Gamma >= 0 and <= 1. \n");
181template<
class Scalar>
188 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_f = "
189 <<
alpha_f_ <<
". Please select Alpha_f >= 0 and <= 1. \n");
195template<
class Scalar>
202 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_m = "
203 <<
alpha_m_ <<
". Please select Alpha_m >= 0 and < 1. \n");
209template<
class Scalar>
211 std::string schemeName)
215 if (
schemeName_ ==
"Newmark Beta Average Acceleration") {
218 else if (
schemeName_ ==
"Newmark Beta Linear Acceleration") {
221 else if (
schemeName_ ==
"Newmark Beta Central Difference") {
224 else if (
schemeName_ ==
"Newmark Beta User Defined") {
228 TEUCHOS_TEST_FOR_EXCEPTION(
true,
230 "\nError in Tempus::StepperHHTAlpha! "
232 <<
"Valid Scheme Names are: 'Newmark Beta Average Acceleration', "
233 <<
"'Newmark Beta Linear Acceleration', \n"
234 <<
"'Newmark Beta Central Difference' and 'Newmark Beta User Defined'.\n");
240template<
class Scalar>
242 out_(
Teuchos::VerboseObjectBase::getDefaultOStream())
244#ifdef VERBOSE_DEBUG_OUTPUT
245 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
261template<
class Scalar>
264 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
266 std::string ICConsistency,
267 bool ICConsistencyCheck,
268 bool zeroInitialGuess,
269 std::string schemeName,
275 :
out_(
Teuchos::VerboseObjectBase::getDefaultOStream())
284 if (schemeName ==
"Newmark Beta User Defined") {
293 if (appModel != Teuchos::null) {
299template<
class Scalar>
303 if (appAction == Teuchos::null) {
313template<
class Scalar>
317#ifdef VERBOSE_DEBUG_OUTPUT
318 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
321 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
326 TEUCHOS_TEST_FOR_EXCEPTION(this->
solver_ == Teuchos::null, std::logic_error,
327 "Error - Solver is not set!\n");
335template<
class Scalar>
339#ifdef VERBOSE_DEBUG_OUTPUT
340 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
346 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperHHTAlpha::takeStep()");
348 TEUCHOS_TEST_FOR_EXCEPTION(solutionHistory->getNumStates() < 2,
350 "Error - StepperHHTAlpha<Scalar>::takeStep(...)\n"
351 "Need at least two SolutionStates for HHTAlpha.\n"
352 " Number of States = " << solutionHistory->getNumStates() <<
"\n"
353 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
354 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
356 RCP<StepperHHTAlpha<Scalar> > thisStepper = Teuchos::rcpFromRef(*
this);
360 RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
361 RCP<SolutionState<Scalar> > currentState=solutionHistory->getCurrentState();
363 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
364 Teuchos::rcp_dynamic_cast<WrapperModelEvaluatorSecondOrder<Scalar> >(
368 RCP<const Thyra::VectorBase<Scalar> > d_old = currentState->getX();
369 RCP<const Thyra::VectorBase<Scalar> > v_old = currentState->getXDot();
370 RCP<Thyra::VectorBase<Scalar> > a_old = currentState->getXDotDot();
375 *
out_ <<
"IKT d_old = " << Thyra::max(*d_old) <<
"\n";
376 *
out_ <<
"IKT v_old = " << Thyra::max(*v_old) <<
"\n";
381 RCP<Thyra::VectorBase<Scalar> > d_new = workingState->getX();
382 RCP<Thyra::VectorBase<Scalar> > v_new = workingState->getXDot();
383 RCP<Thyra::VectorBase<Scalar> > a_new = workingState->getXDotDot();
386 const Scalar time = currentState->getTime();
387 const Scalar dt = workingState->getTimeStep();
393 if (time == solutionHistory->minTime()) {
394 RCP<Thyra::VectorBase<Scalar> > d_init = Thyra::createMember(d_old->space());
395 RCP<Thyra::VectorBase<Scalar> > v_init = Thyra::createMember(v_old->space());
396 RCP<Thyra::VectorBase<Scalar> > a_init = Thyra::createMember(a_old->space());
397 Thyra::copy(*d_old, d_init.ptr());
398 Thyra::copy(*v_old, v_init.ptr());
401 bool is_compatible = (a_init->space())->isCompatible(*this->
initialGuess_->space());
402 TEUCHOS_TEST_FOR_EXCEPTION(
403 is_compatible !=
true, std::logic_error,
404 "Error in Tempus::NemwarkImplicitAForm takeStep(): user-provided initial guess'!\n"
405 <<
"for Newton is not compatible with solution vector!\n");
409 Thyra::put_scalar(0.0, a_init.ptr());
411 wrapperModel->initializeNewmark(v_init,d_init,0.0,time,
beta_,
gamma_);
412 const Thyra::SolveStatus<Scalar> sStatus=(*(this->
solver_)).solve(&*a_init);
414 workingState->setSolutionStatus(sStatus);
415 Thyra::copy(*a_init, a_old.ptr());
419 *
out_ <<
"IKT a_old = " << Thyra::max(*a_old) <<
"\n";
423 RCP<Thyra::VectorBase<Scalar> > d_pred =Thyra::createMember(d_old->space());
424 RCP<Thyra::VectorBase<Scalar> > v_pred =Thyra::createMember(v_old->space());
435 wrapperModel->initializeNewmark(v_pred,d_pred,dt,t,
beta_,
gamma_);
442 const Thyra::SolveStatus<Scalar> sStatus = (*(this->
solver_)).solve(&*a_new);
454 workingState->setSolutionStatus(sStatus);
455 workingState->setOrder(this->
getOrder());
456 workingState->computeNorms(currentState);
472template<
class Scalar>
473Teuchos::RCP<Tempus::StepperState<Scalar> >
477#ifdef VERBOSE_DEBUG_OUTPUT
478 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
480 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
486template<
class Scalar>
488 Teuchos::FancyOStream &out,
489 const Teuchos::EVerbosityLevel verbLevel)
const
491 auto l_out = Teuchos::fancyOStream( out.getOStream() );
492 Teuchos::OSTab ostab(*l_out, 2, this->
description());
493 l_out->setOutputToRootOnly(0);
495#ifdef VERBOSE_DEBUG_OUTPUT
496 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
503 *l_out <<
"--- StepperHHTAlpha ---\n";
504 *l_out <<
" schemeName_ = " <<
schemeName_ << std::endl;
505 *l_out <<
" beta_ = " <<
beta_ << std::endl;
506 *l_out <<
" gamma_ = " <<
gamma_ << std::endl;
507 *l_out <<
" alpha_f_ = " <<
alpha_f_ << std::endl;
508 *l_out <<
" alpha_m_ = " <<
alpha_m_ << std::endl;
509 *l_out <<
"-----------------------" << std::endl;
513template<
class Scalar>
516 out.setOutputToRootOnly(0);
524 out <<
"The application ModelEvaluator is not set!\n";
529 out <<
"The wrapper ModelEvaluator is not set!\n";
532 if (this->
solver_ == Teuchos::null) {
534 out <<
"The solver is not set!\n";
541template<
class Scalar>
542Teuchos::RCP<const Teuchos::ParameterList>
545#ifdef VERBOSE_DEBUG_OUTPUT
546 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
550 auto hhtalphaPL = Teuchos::parameterList(
"HHT-Alpha Parameters");
551 hhtalphaPL->set<std::string>(
"Scheme Name",
schemeName_);
552 hhtalphaPL->set<
double> (
"Beta",
beta_);
553 hhtalphaPL->set<
double> (
"Gamma",
gamma_ );
554 hhtalphaPL->set<
double> (
"Alpha_f",
alpha_f_ );
555 hhtalphaPL->set<
double> (
"Alpha_m",
alpha_m_ );
556 pl->set(
"HHT-Alpha Parameters", *hhtalphaPL);
564template<
class Scalar>
565Teuchos::RCP<StepperHHTAlpha<Scalar> >
568 Teuchos::RCP<Teuchos::ParameterList> pl)
571 stepper->setStepperImplicitValues(pl);
573 if (pl != Teuchos::null) {
574 if (pl->isSublist(
"HHT-Alpha Parameters")) {
575 auto hhtalphaPL = pl->sublist(
"HHT-Alpha Parameters",
true);
576 std::string schemeName =
577 hhtalphaPL.get<std::string>(
"Scheme Name",
"Newmark Beta Average Acceleration");
578 stepper->setSchemeName(schemeName);
579 if (schemeName ==
"Newmark Beta User Defined") {
580 stepper->setBeta (hhtalphaPL.get<
double>(
"Beta", 0.25));
581 stepper->setGamma(hhtalphaPL.get<
double>(
"Gamma", 0.5 ));
583 stepper->setAlphaF(hhtalphaPL.get<
double>(
"Alpha_f", 0.0));
584 stepper->setAlphaM(hhtalphaPL.get<
double>(
"Alpha_m", 0.0));
586 stepper->setSchemeName(
"Newmark Beta Average Acceleration");
587 stepper->setAlphaF(0.0);
588 stepper->setAlphaM(0.0);
592 if (model != Teuchos::null) {
593 stepper->setModel(model);
594 stepper->initialize();
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Application Action for HHT Alpha.
@ AFTER_SOLVE
After the implicit solve.
@ BEGIN_STEP
At the beginning of the step.
@ END_STEP
At the end of the step.
@ BEFORE_SOLVE
Before the implicit solve.
Default modifier for StepperHHTAlpha.
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
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
void predictVelocity(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
void correctAcceleration(Thyra::VectorBase< Scalar > &a_n_plus1, const Thyra::VectorBase< Scalar > &a_n) const
void setAlphaF(Scalar alpha_f)
void setBeta(Scalar beta)
Teuchos::RCP< StepperHHTAlphaAppAction< Scalar > > stepperHHTAlphaAppAction_
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
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
void setGamma(Scalar gamma)
void correctDisplacement(Thyra::VectorBase< Scalar > &d, const Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
virtual void setAppAction(Teuchos::RCP< StepperHHTAlphaAppAction< Scalar > > appAction)
virtual Scalar getOrder() const
void predictDisplacement_alpha_f(Thyra::VectorBase< Scalar > &dPred, const Thyra::VectorBase< Scalar > &d) const
void predictVelocity_alpha_f(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v) const
StepperHHTAlpha()
Default constructor.
void setAlphaM(Scalar alpha_m)
Teuchos::RCP< Teuchos::FancyOStream > out_
void setSchemeName(std::string schemeName)
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Teuchos::RCP< WrapperModelEvaluator< Scalar > > wrapperModel_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initialGuess_
Teuchos::RCP< Teuchos::ParameterList > getValidParametersBasicImplicit() const
Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > solver_
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 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.
bool isInitialized_
True if stepper's member data is initialized.
void setICConsistencyCheck(bool c)
void setStepperName(std::string s)
Set the stepper name.
virtual std::string description() const
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
A ModelEvaluator for residual evaluations given a state. This ModelEvaluator takes a state,...
void validSecondOrderODE_DAE(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Validate ME supports 2nd order implicit ODE/DAE evaluation, f(xdotdot,xdot,x,t) [= 0].
Teuchos::RCP< StepperHHTAlpha< Scalar > > createStepperHHTAlpha(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.