9 #ifndef Tempus_StepperHHTAlpha_impl_hpp
10 #define Tempus_StepperHHTAlpha_impl_hpp
12 #include "Tempus_config.hpp"
14 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
15 #include "NOX_Thyra.H"
23 template<
class Scalar>
class StepperFactory;
26 template<
class Scalar>
29 const Thyra::VectorBase<Scalar>& v,
30 const Thyra::VectorBase<Scalar>& a,
31 const Scalar dt)
const
33 #ifdef VERBOSE_DEBUG_OUTPUT
34 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
37 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt*(1.0-gamma_), a);
40 template<
class Scalar>
43 const Thyra::VectorBase<Scalar>& d,
44 const Thyra::VectorBase<Scalar>& v,
45 const Thyra::VectorBase<Scalar>& a,
46 const Scalar dt)
const
48 #ifdef VERBOSE_DEBUG_OUTPUT
49 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
51 Teuchos::RCP<const Thyra::VectorBase<Scalar> > tmp =
52 Thyra::createMember<Scalar>(dPred.space());
54 Scalar aConst = dt*dt/2.0*(1.0-2.0*beta_);
55 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
57 Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
61 template<
class Scalar>
64 const Thyra::VectorBase<Scalar>& v)
const
66 #ifdef VERBOSE_DEBUG_OUTPUT
67 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
70 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0-alpha_f_, vPred, alpha_f_, v);
74 template<
class Scalar>
77 const Thyra::VectorBase<Scalar>& d)
const
79 #ifdef VERBOSE_DEBUG_OUTPUT
80 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
83 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), 1.0-alpha_f_, dPred, alpha_f_, d);
86 template<
class Scalar>
89 const Thyra::VectorBase<Scalar>& a_n)
const
91 #ifdef VERBOSE_DEBUG_OUTPUT
92 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
94 Scalar c = 1.0/(1.0-alpha_m_);
96 Thyra::V_StVpStV(Teuchos::ptrFromRef(a_n_plus1), c, a_n_plus1, -c*alpha_m_, a_n);
101 template<
class Scalar>
104 const Thyra::VectorBase<Scalar>& vPred,
105 const Thyra::VectorBase<Scalar>& a,
106 const Scalar dt)
const
108 #ifdef VERBOSE_DEBUG_OUTPUT
109 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
112 Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt*gamma_, a);
115 template<
class Scalar>
118 const Thyra::VectorBase<Scalar>& dPred,
119 const Thyra::VectorBase<Scalar>& a,
120 const Scalar dt)
const
122 #ifdef VERBOSE_DEBUG_OUTPUT
123 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
126 Thyra::V_StVpStV(Teuchos::ptrFromRef(d), 1.0, dPred, beta_*dt*dt, a);
131 template<
class Scalar>
134 if (schemeName_ !=
"Newmark Beta User Defined") {
135 *out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (=" <<schemeName_<<
").\n"
136 <<
" Not setting beta, and leaving as beta = " << beta_ <<
"!\n";
143 *out_ <<
"\nWARNING: Running (implicit implementation of) Newmark "
144 <<
"Implicit a-Form Stepper with Beta = 0.0, which \n"
145 <<
"specifies an explicit scheme. Mass lumping is not possible, "
146 <<
"so this will be slow! To run explicit \n"
147 <<
"implementation of Newmark Implicit a-Form Stepper, please "
148 <<
"re-run with 'Stepper Type' = 'Newmark Explicit a-Form'.\n"
149 <<
"This stepper allows for mass lumping when called through "
150 <<
"Piro::TempusSolver.\n";
153 TEUCHOS_TEST_FOR_EXCEPTION( (beta_ > 1.0) || (beta_ < 0.0),
155 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Beta = "
156 << beta_ <<
". Please select Beta >= 0 and <= 1. \n");
160 template<
class Scalar>
163 if (schemeName_ !=
"Newmark Beta User Defined") {
164 *out_ <<
"\nWARNING: schemeName != 'Newmark Beta User Defined' (=" <<schemeName_<<
").\n"
165 <<
" Not setting gamma, and leaving as gamma = " << gamma_ <<
"!\n";
171 TEUCHOS_TEST_FOR_EXCEPTION( (gamma_ > 1.0) || (gamma_ < 0.0),
173 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Gamma ="
174 <<gamma_ <<
". Please select Gamma >= 0 and <= 1. \n");
178 template<
class Scalar>
183 TEUCHOS_TEST_FOR_EXCEPTION( (alpha_f_ > 1.0) || (alpha_f_ < 0.0),
185 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_f = "
186 << alpha_f_ <<
". Please select Alpha_f >= 0 and <= 1. \n");
190 template<
class Scalar>
195 TEUCHOS_TEST_FOR_EXCEPTION( (alpha_m_ >= 1.0) || (alpha_m_ < 0.0),
197 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_m = "
198 << alpha_m_ <<
". Please select Alpha_m >= 0 and < 1. \n");
202 template<
class Scalar>
204 std::string schemeName)
206 schemeName_ = schemeName;
208 if (schemeName_ ==
"Newmark Beta Average Acceleration") {
209 beta_= 0.25; gamma_ = 0.5;
211 else if (schemeName_ ==
"Newmark Beta Linear Acceleration") {
212 beta_= 0.25; gamma_ = 1.0/6.0;
214 else if (schemeName_ ==
"Newmark Beta Central Difference") {
215 beta_= 0.0; gamma_ = 0.5;
217 else if (schemeName_ ==
"Newmark Beta User Defined") {
218 beta_= 0.25; gamma_ = 0.5;
221 TEUCHOS_TEST_FOR_EXCEPTION(
true,
223 "\nError in Tempus::StepperHHTAlpha! "
224 <<
"Invalid Scheme Name = " << schemeName_ <<
". \n"
225 <<
"Valid Scheme Names are: 'Newmark Beta Average Acceleration', "
226 <<
"'Newmark Beta Linear Acceleration', \n"
227 <<
"'Newmark Beta Central Difference' and 'Newmark Beta User Defined'.\n");
232 template<
class Scalar>
234 out_(Teuchos::VerboseObjectBase::getDefaultOStream())
236 #ifdef VERBOSE_DEBUG_OUTPUT
237 *
out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
253 template<
class Scalar>
255 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel,
257 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
259 std::string ICConsistency,
260 bool ICConsistencyCheck,
261 bool zeroInitialGuess,
262 std::string schemeName,
267 : out_(Teuchos::VerboseObjectBase::getDefaultOStream())
282 if (appModel != Teuchos::null) {
291 template<
class Scalar>
293 const Teuchos::RCP<
const Thyra::ModelEvaluator<Scalar> >& appModel)
295 #ifdef VERBOSE_DEBUG_OUTPUT
296 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
299 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
302 this->wrapperModel_ = wrapperModel;
306 template<
class Scalar>
309 TEUCHOS_TEST_FOR_EXCEPTION( this->wrapperModel_ == Teuchos::null,
311 "Error - Need to set the model, setModel(), before calling "
312 "StepperHHTAlpha::initialize()\n");
314 #ifdef VERBOSE_DEBUG_OUTPUT
315 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
320 template<
class Scalar>
324 #ifdef VERBOSE_DEBUG_OUTPUT
325 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
329 TEMPUS_FUNC_TIME_MONITOR(
"Tempus::StepperHHTAlpha::takeStep()");
333 "Error - StepperHHTAlpha<Scalar>::takeStep(...)\n"
334 "Need at least two SolutionStates for HHTAlpha.\n"
336 "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
337 " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
339 RCP<SolutionState<Scalar> > workingState=
solutionHistory->getWorkingState();
340 RCP<SolutionState<Scalar> > currentState=
solutionHistory->getCurrentState();
342 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
344 this->wrapperModel_);
347 RCP<const Thyra::VectorBase<Scalar> > d_old = currentState->getX();
348 RCP<const Thyra::VectorBase<Scalar> > v_old = currentState->getXDot();
349 RCP<Thyra::VectorBase<Scalar> > a_old = currentState->getXDotDot();
354 *out_ <<
"IKT d_old = " << Thyra::max(*d_old) <<
"\n";
355 *out_ <<
"IKT v_old = " << Thyra::max(*v_old) <<
"\n";
360 RCP<Thyra::VectorBase<Scalar> > d_new = workingState->getX();
361 RCP<Thyra::VectorBase<Scalar> > v_new = workingState->getXDot();
362 RCP<Thyra::VectorBase<Scalar> > a_new = workingState->getXDotDot();
365 const Scalar time = currentState->getTime();
366 const Scalar dt = workingState->getTimeStep();
373 RCP<Thyra::VectorBase<Scalar> > d_init = Thyra::createMember(d_old->space());
374 RCP<Thyra::VectorBase<Scalar> > v_init = Thyra::createMember(v_old->space());
375 RCP<Thyra::VectorBase<Scalar> > a_init = Thyra::createMember(a_old->space());
376 Thyra::copy(*d_old, d_init.ptr());
377 Thyra::copy(*v_old, v_init.ptr());
378 if (this->initial_guess_ != Teuchos::null) {
380 bool is_compatible = (a_init->space())->isCompatible(*this->initial_guess_->space());
381 TEUCHOS_TEST_FOR_EXCEPTION(
382 is_compatible !=
true, std::logic_error,
383 "Error in Tempus::NemwarkImplicitAForm takeStep(): user-provided initial guess'!\n"
384 <<
"for Newton is not compatible with solution vector!\n");
385 Thyra::copy(*this->initial_guess_, a_init.ptr());
388 Thyra::put_scalar(0.0, a_init.ptr());
390 wrapperModel->initializeNewmark(v_init,d_init,0.0,time,beta_,gamma_);
391 const Thyra::SolveStatus<Scalar> sStatus=this->solveImplicitODE(a_init);
393 workingState->setSolutionStatus(sStatus);
394 Thyra::copy(*a_init, a_old.ptr());
398 *out_ <<
"IKT a_old = " << Thyra::max(*a_old) <<
"\n";
403 RCP<Thyra::VectorBase<Scalar> > d_pred =Thyra::createMember(d_old->space());
404 RCP<Thyra::VectorBase<Scalar> > v_pred =Thyra::createMember(v_old->space());
407 predictDisplacement(*d_pred, *d_old, *v_old, *a_old, dt);
408 predictVelocity(*v_pred, *v_old, *a_old, dt);
411 predictDisplacement_alpha_f(*d_pred, *d_old);
412 predictVelocity_alpha_f(*v_pred, *v_old);
415 wrapperModel->initializeNewmark(v_pred,d_pred,dt,t,beta_,gamma_);
418 const Thyra::SolveStatus<Scalar> sStatus = this->solveImplicitODE(a_new);
421 correctAcceleration(*a_new, *a_old);
424 correctVelocity(*v_new, *v_pred, *a_new, dt);
425 correctDisplacement(*d_new, *d_pred, *a_new, dt);
427 workingState->setSolutionStatus(sStatus);
428 workingState->setOrder(this->getOrder());
441 template<
class Scalar>
442 Teuchos::RCP<Tempus::StepperState<Scalar> >
446 #ifdef VERBOSE_DEBUG_OUTPUT
447 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
449 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
455 template<
class Scalar>
457 Teuchos::FancyOStream &out,
458 const Teuchos::EVerbosityLevel )
const
460 #ifdef VERBOSE_DEBUG_OUTPUT
461 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
463 out << this->getStepperType() <<
"::describe:" << std::endl
464 <<
"wrapperModel_ = " << this->wrapperModel_->description() << std::endl;
468 template<
class Scalar>
469 Teuchos::RCP<const Teuchos::ParameterList>
472 #ifdef VERBOSE_DEBUG_OUTPUT
473 *out_ <<
"DEBUG: " << __PRETTY_FUNCTION__ <<
"\n";
475 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
477 pl->set<std::string>(
"Scheme Name",
"Newmark Beta Average Acceleration");
478 pl->set<
double> (
"Beta", 0.25);
479 pl->set<
double> (
"Gamma", 0.5 );
480 pl->set<
double> (
"Alpha_f", 0.0 );
481 pl->set<
double> (
"Alpha_m", 0.0 );
482 pl->set<std::string>(
"Solver Name",
"Default Solver");
483 pl->set<
bool> (
"Zero Initial Guess",
false);
485 pl->set(
"Default Solver", *solverPL);
492 #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
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 correctAcceleration(Thyra::VectorBase< Scalar > &a_n_plus1, const Thyra::VectorBase< Scalar > &a_n) const
virtual void setSolver(Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > solver=Teuchos::null)
Set solver.
virtual bool getICConsistencyCheckDefault() const
void setAlphaF(Scalar alpha_f)
Teuchos::RCP< Teuchos::ParameterList > defaultSolverParameters()
Returns the default solver ParameterList for implicit Steppers.
virtual std::string getICConsistencyDefault() const
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
StepperHHTAlpha()
Default constructor.
A ModelEvaluator for residual evaluations given a state. This ModelEvaluator takes a state...
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > >=Teuchos::null)
Set Observer.
StepperState is a simple class to hold state information about the stepper.
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)
StepperObserver class for Stepper class.
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
virtual void setZeroInitialGuess(bool zIG)
Set parameter so that the initial guess is set to zero (=True) or use last timestep (=False)...
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
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
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< Teuchos::FancyOStream > out_
void predictVelocity(Thyra::VectorBase< Scalar > &vPred, const Thyra::VectorBase< Scalar > &v, const Thyra::VectorBase< Scalar > &a, const Scalar dt) const
void setGamma(Scalar gamma)
virtual bool getUseFSALDefault() const
virtual void initialize()
Initialize during construction and after changing input parameters.
void getValidParametersBasic(Teuchos::RCP< Teuchos::ParameterList > pl, std::string stepperType)
Provide basic parameters to Steppers.
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
void setStepperType(std::string s)
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
void setICConsistency(std::string s)