Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_StepperHHTAlpha_impl.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Tempus_StepperHHTAlpha_impl_hpp
11#define Tempus_StepperHHTAlpha_impl_hpp
12
13#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
14
17
18//#define VERBOSE_DEBUG_OUTPUT
19//#define DEBUG_OUTPUT
20
21namespace Tempus {
22
23template <class Scalar>
26 const Thyra::VectorBase<Scalar>& a, const Scalar dt) const
27{
28#ifdef VERBOSE_DEBUG_OUTPUT
29 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
30#endif
31 // vPred = v + dt*(1.0-gamma_)*a
32 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0, v, dt * (1.0 - gamma_), a);
33}
34
35template <class Scalar>
39 const Scalar dt) const
40{
41#ifdef VERBOSE_DEBUG_OUTPUT
42 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
43#endif
44 // dPred = dt*v + dt*dt/2.0*(1.0-2.0*beta_)*a
45 Scalar aConst = dt * dt / 2.0 * (1.0 - 2.0 * beta_);
46 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), dt, v, aConst, a);
47 // dPred += d;
48 Thyra::Vp_V(Teuchos::ptrFromRef(dPred), d, 1.0);
49}
50
51template <class Scalar>
54{
55#ifdef VERBOSE_DEBUG_OUTPUT
56 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
57#endif
58 // vPred = (1-alpha_f)*vPred + alpha_f*v
59 Thyra::V_StVpStV(Teuchos::ptrFromRef(vPred), 1.0 - alpha_f_, vPred, alpha_f_,
60 v);
61}
62
63template <class Scalar>
66{
67#ifdef VERBOSE_DEBUG_OUTPUT
68 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
69#endif
70 // dPred = (1-alpha_f)*dPred + alpha_f*d
71 Thyra::V_StVpStV(Teuchos::ptrFromRef(dPred), 1.0 - alpha_f_, dPred, alpha_f_,
72 d);
73}
74
75template <class Scalar>
78 const Thyra::VectorBase<Scalar>& a_n) const
79{
80#ifdef VERBOSE_DEBUG_OUTPUT
81 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
82#endif
83 Scalar c = 1.0 / (1.0 - alpha_m_);
84 // a_n_plus1 = 1.0/(1.0-alpha_m_)*a_n_plus1 - alpha_m/(1.0-alpha_m)*a_n =
85 // (1-alpha_f)*vPred + alpha_f*v
86 Thyra::V_StVpStV(Teuchos::ptrFromRef(a_n_plus1), c, a_n_plus1, -c * alpha_m_,
87 a_n);
88}
89
90template <class Scalar>
93 const Thyra::VectorBase<Scalar>& a, const Scalar dt) const
94{
95#ifdef VERBOSE_DEBUG_OUTPUT
96 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
97#endif
98 // v = vPred + dt*gamma_*a
99 Thyra::V_StVpStV(Teuchos::ptrFromRef(v), 1.0, vPred, dt * gamma_, a);
100}
101
102template <class Scalar>
105 const Thyra::VectorBase<Scalar>& a, const Scalar dt) const
106{
107#ifdef VERBOSE_DEBUG_OUTPUT
108 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
109#endif
110 // d = dPred + beta_*dt*dt*a
111 Thyra::V_StVpStV(Teuchos::ptrFromRef(d), 1.0, dPred, beta_ * dt * dt, a);
112}
113
114template <class Scalar>
116{
117 if (schemeName_ != "Newmark Beta User Defined") {
118 out_->setOutputToRootOnly(0);
119 *out_ << "\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
120 << schemeName_ << "').\n"
121 << " Leaving as beta = " << beta_ << "!\n";
122 return;
123 }
124
125 beta_ = beta;
126
127 if (beta_ == 0.0) {
128 out_->setOutputToRootOnly(0);
129 *out_ << "\nWARNING: Running (implicit implementation of) Newmark "
130 << "Implicit a-Form Stepper with Beta = 0.0, which \n"
131 << "specifies an explicit scheme. Mass lumping is not possible, "
132 << "so this will be slow! To run explicit \n"
133 << "implementation of Newmark Implicit a-Form Stepper, please "
134 << "re-run with 'Stepper Type' = 'Newmark Explicit a-Form'.\n"
135 << "This stepper allows for mass lumping when called through "
136 << "Piro::TempusSolver.\n";
137 }
138
139 TEUCHOS_TEST_FOR_EXCEPTION(
140 (beta_ > 1.0) || (beta_ < 0.0), std::logic_error,
141 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Beta = "
142 << beta_ << ". Please select Beta >= 0 and <= 1. \n");
143
144 this->isInitialized_ = false;
145}
146
147template <class Scalar>
149{
150 if (schemeName_ != "Newmark Beta User Defined") {
151 out_->setOutputToRootOnly(0);
152 *out_ << "\nWARNING: schemeName != 'Newmark Beta User Defined' (= '"
153 << schemeName_ << "').\n"
154 << " Leaving as gamma = " << gamma_ << "!\n";
155 return;
156 }
157
158 gamma_ = gamma;
159
160 TEUCHOS_TEST_FOR_EXCEPTION(
161 (gamma_ > 1.0) || (gamma_ < 0.0), std::logic_error,
162 "\nError in 'Newmark Implicit a-Form' stepper: invalid value of Gamma ="
163 << gamma_ << ". Please select Gamma >= 0 and <= 1. \n");
164
165 this->isInitialized_ = false;
166}
167
168template <class Scalar>
170{
171 alpha_f_ = alpha_f;
172
173 TEUCHOS_TEST_FOR_EXCEPTION(
174 (alpha_f_ > 1.0) || (alpha_f_ < 0.0), std::logic_error,
175 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_f = "
176 << alpha_f_ << ". Please select Alpha_f >= 0 and <= 1. \n");
177
178 this->isInitialized_ = false;
179}
180
181template <class Scalar>
183{
184 alpha_m_ = alpha_m;
185
186 TEUCHOS_TEST_FOR_EXCEPTION(
187 (alpha_m_ >= 1.0) || (alpha_m_ < 0.0), std::logic_error,
188 "\nError in 'HHT-Alpha' stepper: invalid value of Alpha_m = "
189 << alpha_m_ << ". Please select Alpha_m >= 0 and < 1. \n");
190
191 this->isInitialized_ = false;
192}
193
194template <class Scalar>
195void StepperHHTAlpha<Scalar>::setSchemeName(std::string schemeName)
196{
197 schemeName_ = schemeName;
198
199 if (schemeName_ == "Newmark Beta Average Acceleration") {
200 beta_ = 0.25;
201 gamma_ = 0.5;
202 }
203 else if (schemeName_ == "Newmark Beta Linear Acceleration") {
204 beta_ = 0.25;
205 gamma_ = 1.0 / 6.0;
206 }
207 else if (schemeName_ == "Newmark Beta Central Difference") {
208 beta_ = 0.0;
209 gamma_ = 0.5;
210 }
211 else if (schemeName_ == "Newmark Beta User Defined") {
212 beta_ = 0.25;
213 gamma_ = 0.5; // Use defaults until setBeta and setGamma calls.
214 }
215 else {
216 TEUCHOS_TEST_FOR_EXCEPTION(
217 true, std::logic_error,
218 "\nError in Tempus::StepperHHTAlpha! "
219 << "Invalid Scheme Name = " << schemeName_ << ". \n"
220 << "Valid Scheme Names are: 'Newmark Beta Average Acceleration', "
221 << "'Newmark Beta Linear Acceleration', \n"
222 << "'Newmark Beta Central Difference' and 'Newmark Beta User "
223 "Defined'.\n");
224 }
225
226 this->isInitialized_ = false;
227}
228
229template <class Scalar>
231{
232 const Scalar gamma_expected = Scalar(0.5) + alpha_f_;
233 const Scalar beta_expected =
234 Scalar(0.25) * std::pow((Scalar(1.0) + alpha_f_), 2);
235
236 const bool gamma_ok = approxEqual(gamma_, gamma_expected);
237 const bool beta_ok = approxEqual(beta_, beta_expected);
238
239 if (!gamma_ok && !beta_ok) {
240 out_->setOutputToRootOnly(0);
241 *out_ << "\nWARNING: For HHT-Alpha,\n"
242 << " gamma_ (" << gamma_ << ") != 0.5+alpha_f_ ("
243 << gamma_expected << "),\n"
244 << " AND/OR\n"
245 << " beta_ (" << beta_ << ") != 0.25*(1.0+alpha_f_)^2 ("
246 << beta_expected << "),\n"
247 << " thus making the algorithm first-order accurate and/or "
248 "conditionally stable!\n"
249 << " To obtain second-order accuracy, set\n"
250 << " alpha_f_ = " << alpha_f_ << "\n"
251 << " gamma_ = " << gamma_expected << "\n"
252 << " To obtain unconditional stability, set\n"
253 << " beta_ = " << beta_expected << "\n"
254 << " Current values are\n"
255 << " alpha_f_ = " << alpha_f_ << "\n"
256 << " gamma_ = " << gamma_ << "\n"
257 << " beta_ = " << beta_ << "\n"
258 << std::endl;
259 }
260 else if (!gamma_ok) {
261 out_->setOutputToRootOnly(0);
262 *out_ << "\nWARNING: For HHT-Alpha,\n"
263 << " gamma_ (" << gamma_ << ") != 0.5+alpha_f_ ("
264 << gamma_expected << "),\n"
265 << " thus making the algorithm first-order accurate!\n"
266 << " To obtain second-order accuracy, set\n"
267 << " alpha_f_ = " << alpha_f_ << "\n"
268 << " gamma_ = " << gamma_expected << "\n"
269 << " Current values are\n"
270 << " alpha_f_ = " << alpha_f_ << "\n"
271 << " gamma_ = " << gamma_ << "\n"
272 << " beta_ = " << beta_ << "\n"
273 << std::endl;
274 }
275 else if (!beta_ok) {
276 out_->setOutputToRootOnly(0);
277 *out_ << "\nWARNING: For HHT-Alpha,\n"
278 << " beta_ (" << beta_ << ") != 0.25*(1.0+alpha_f_)^2 ("
279 << beta_expected << "),\n"
280 << " thus making the algorithm conditionally stable!\n"
281 << " To obtain unconditional stability, set\n"
282 << " alpha_f_ = " << alpha_f_ << "\n"
283 << " beta_ = " << beta_expected << "\n"
284 << " Current values are\n"
285 << " alpha_f_ = " << alpha_f_ << "\n"
286 << " gamma_ = " << gamma_ << "\n"
287 << " beta_ = " << beta_ << "\n"
288 << std::endl;
289 }
290}
291
292template <class Scalar>
294 : out_(Teuchos::VerboseObjectBase::getDefaultOStream())
295{
296#ifdef VERBOSE_DEBUG_OUTPUT
297 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
298#endif
299
300 this->setStepperName("HHT-Alpha");
301 this->setStepperType("HHT-Alpha");
302 this->setUseFSAL(false);
303 this->setICConsistency("None");
304 this->setICConsistencyCheck(false);
305 this->setZeroInitialGuess(false);
306 this->setSchemeName("Newmark Beta Average Acceleration");
307 this->setAlphaF(0.0);
308 this->setAlphaM(0.0);
309 this->setAppAction(Teuchos::null);
310 this->setDefaultSolver();
311}
312
313template <class Scalar>
315 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
316 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
317 bool useFSAL, std::string ICConsistency, bool ICConsistencyCheck,
318 bool zeroInitialGuess, std::string schemeName, Scalar beta, Scalar gamma,
319 Scalar alpha_f, Scalar alpha_m,
320 const Teuchos::RCP<StepperHHTAlphaAppAction<Scalar> >&
321 stepperHHTAlphaAppAction)
322 : out_(Teuchos::VerboseObjectBase::getDefaultOStream())
323{
324 this->setStepperName("HHT-Alpha");
325 this->setStepperType("HHT-Alpha");
326 this->setUseFSAL(useFSAL);
327 this->setICConsistency(ICConsistency);
328 this->setICConsistencyCheck(ICConsistencyCheck);
329 this->setZeroInitialGuess(zeroInitialGuess);
330 this->setSchemeName(schemeName);
331 if (schemeName == "Newmark Beta User Defined") {
332 this->setBeta(beta);
333 this->setGamma(gamma);
334 }
335 this->setAlphaF(alpha_f);
336 this->setAlphaM(alpha_m);
337 this->setAppAction(stepperHHTAlphaAppAction);
338 this->setSolver(solver);
339
340 if (appModel != Teuchos::null) {
341 this->setModel(appModel);
342 this->initialize();
343 }
344}
345
346template <class Scalar>
348 Teuchos::RCP<StepperHHTAlphaAppAction<Scalar> > appAction)
349{
350 if (appAction == Teuchos::null) {
351 // Create default appAction
353 Teuchos::rcp(new StepperHHTAlphaModifierDefault<Scalar>());
354 }
355 else {
356 stepperHHTAlphaAppAction_ = appAction;
357 }
358}
359
360template <class Scalar>
362 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel)
363{
364#ifdef VERBOSE_DEBUG_OUTPUT
365 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
366#endif
367 validSecondOrderODE_DAE(appModel);
368 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
369 Teuchos::rcp(
370 new WrapperModelEvaluatorSecondOrder<Scalar>(appModel, "HHT-Alpha"));
371 this->wrapperModel_ = wrapperModel;
372
373 TEUCHOS_TEST_FOR_EXCEPTION(this->solver_ == Teuchos::null, std::logic_error,
374 "Error - Solver is not set!\n");
375 if (this->wrapperModel_ != Teuchos::null)
376 this->solver_->setModel(this->wrapperModel_);
377
378 this->isInitialized_ = false;
379}
380
381template <class Scalar>
383 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
384{
385#ifdef VERBOSE_DEBUG_OUTPUT
386 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
387#endif
388 this->checkInitialized();
389
390 using Teuchos::RCP;
391
392 TEMPUS_FUNC_TIME_MONITOR("Tempus::StepperHHTAlpha::takeStep()");
393 {
394 TEUCHOS_TEST_FOR_EXCEPTION(
395 solutionHistory->getNumStates() < 2, std::logic_error,
396 "Error - StepperHHTAlpha<Scalar>::takeStep(...)\n"
397 << "Need at least two SolutionStates for HHTAlpha.\n"
398 << " Number of States = " << solutionHistory->getNumStates()
399 << "\nTry setting in \"Solution History\" \"Storage Type\" = "
400 << "\"Undo\"\n or \"Storage Type\" = \"Static\" and \"Storage Limit\" = "
401 << "\"2\"\n");
402
403 RCP<StepperHHTAlpha<Scalar> > thisStepper = Teuchos::rcpFromRef(*this);
405 solutionHistory, thisStepper,
407
408 RCP<SolutionState<Scalar> > workingState =
409 solutionHistory->getWorkingState();
410 RCP<SolutionState<Scalar> > currentState =
411 solutionHistory->getCurrentState();
412
413 Teuchos::RCP<WrapperModelEvaluatorSecondOrder<Scalar> > wrapperModel =
414 Teuchos::rcp_dynamic_cast<WrapperModelEvaluatorSecondOrder<Scalar> >(
415 this->wrapperModel_);
416
417 // Get values of d, v and a from previous step
418 RCP<const Thyra::VectorBase<Scalar> > d_old = currentState->getX();
419 RCP<const Thyra::VectorBase<Scalar> > v_old = currentState->getXDot();
420 RCP<Thyra::VectorBase<Scalar> > a_old = currentState->getXDotDot();
421
422#ifdef DEBUG_OUTPUT
423 // IKT, 3/21/17, debug output: pring d_old, v_old, a_old to check for
424 // correctness.
425 *out_ << "IKT d_old = " << Thyra::max(*d_old) << "\n";
426 *out_ << "IKT v_old = " << Thyra::max(*v_old) << "\n";
427#endif
428
429 // Get new values of d, v and a from current workingState
430 //(to be updated here)
431 RCP<Thyra::VectorBase<Scalar> > d_new = workingState->getX();
432 RCP<Thyra::VectorBase<Scalar> > v_new = workingState->getXDot();
433 RCP<Thyra::VectorBase<Scalar> > a_new = workingState->getXDotDot();
434
435 // Get time and dt
436 const Scalar time = currentState->getTime();
437 const Scalar dt = workingState->getTimeStep();
438 // HHT/generalized-alpha residual evaluation time.
439 // For alpha_f = 0 this reduces to t_{n+1}.
440 Scalar t_alpha_f = time + (1.0 - alpha_f_) * dt;
441
442 // Compute initial acceleration, a_old, using initial displacement (d_old)
443 // and initial velocity (v_old) if in 1st time step
444 if (time == solutionHistory->minTime()) {
445 RCP<Thyra::VectorBase<Scalar> > d_init =
446 Thyra::createMember(d_old->space());
447 RCP<Thyra::VectorBase<Scalar> > v_init =
448 Thyra::createMember(v_old->space());
449 RCP<Thyra::VectorBase<Scalar> > a_init =
450 Thyra::createMember(a_old->space());
451 Thyra::copy(*d_old, d_init.ptr());
452 Thyra::copy(*v_old, v_init.ptr());
453 if (this->initialGuess_ !=
454 Teuchos::null) { // set initial guess for Newton, if provided
455 // Throw an exception if initial_guess is not compatible with solution
456 bool is_compatible =
457 (a_init->space())->isCompatible(*this->initialGuess_->space());
458 TEUCHOS_TEST_FOR_EXCEPTION(
459 is_compatible != true, std::logic_error,
460 "Error in Tempus::NemwarkImplicitAForm takeStep(): user-provided "
461 "initial guess'!\n"
462 << "for Newton is not compatible with solution vector!\n");
463 Thyra::copy(*this->initialGuess_, a_init.ptr());
464 }
465 else { // if no initialGuess_ provide, set 0 initial guess
466 Thyra::put_scalar(0.0, a_init.ptr());
467 }
468 wrapperModel->initializeNewmark(v_init, d_init, 0.0, time, beta_, gamma_);
469 const Thyra::SolveStatus<Scalar> sStatus =
470 (*(this->solver_)).solve(&*a_init);
471
472 workingState->setSolutionStatus(sStatus); // Converged --> pass.
473 Thyra::copy(*a_init, a_old.ptr());
474 }
475#ifdef DEBUG_OUTPUT
476 // IKT, 3/30/17, debug output: pring a_old to check for correctness.
477 *out_ << "IKT a_old = " << Thyra::max(*a_old) << "\n";
478#endif
479
480 // allocate d and v predictors
481 RCP<Thyra::VectorBase<Scalar> > d_pred =
482 Thyra::createMember(d_old->space());
483 RCP<Thyra::VectorBase<Scalar> > v_pred =
484 Thyra::createMember(v_old->space());
485 // Separate alpha_f-blended predictors used only in the residual
486 // evaluation. The committed state update must use the original,
487 // unblended Newmark predictors.
488 RCP<Thyra::VectorBase<Scalar> > d_pred_alpha_f =
489 Thyra::createMember(d_old->space());
490 RCP<Thyra::VectorBase<Scalar> > v_pred_alpha_f =
491 Thyra::createMember(v_old->space());
492
493 // compute displacement and velocity predictors
494 predictDisplacement(*d_pred, *d_old, *v_old, *a_old, dt);
495 predictVelocity(*v_pred, *v_old, *a_old, dt);
496
497 // Form alpha_f-blended predictors for the residual/equilibrium only:
498 // d_{n+1-alpha_f} = (1-alpha_f)*d_{n+1}^{pred} + alpha_f*d_n
499 // v_{n+1-alpha_f} = (1-alpha_f)*v_{n+1}^{pred} + alpha_f*v_n
500 Thyra::copy(*d_pred, d_pred_alpha_f.ptr());
501 Thyra::copy(*v_pred, v_pred_alpha_f.ptr());
502 predictDisplacement_alpha_f(*d_pred_alpha_f, *d_old);
503 predictVelocity_alpha_f(*v_pred_alpha_f, *v_old);
504
505 // Inject blended predictors for residual evaluation at t_{n+1-alpha_f}.
506 wrapperModel->initializeNewmark(
507 v_pred_alpha_f, d_pred_alpha_f, dt, t_alpha_f, beta_, gamma_);
508
510 solutionHistory, thisStepper,
512
513 // Solve for new acceleration
514 const Thyra::SolveStatus<Scalar> sStatus =
515 (*(this->solver_)).solve(&*a_new);
516
518 solutionHistory, thisStepper,
520
521 // Correct acceleration (function of alpha_m)
522 correctAcceleration(*a_new, *a_old);
523
524 // Correct velocity and displacement using the original, unblended
525 // Newmark predictors. The alpha_f blending is used only in the
526 // residual/equilibrium evaluation above.
527 correctVelocity(*v_new, *v_pred, *a_new, dt);
528 correctDisplacement(*d_new, *d_pred, *a_new, dt);
529
530 workingState->setSolutionStatus(sStatus); // Converged --> pass.
531 workingState->setOrder(this->getOrder());
532 workingState->computeNorms(currentState);
533
535 solutionHistory, thisStepper,
537 }
538 return;
539}
540
547template <class Scalar>
548Teuchos::RCP<Tempus::StepperState<Scalar> >
550{
551#ifdef VERBOSE_DEBUG_OUTPUT
552 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
553#endif
554 Teuchos::RCP<Tempus::StepperState<Scalar> > stepperState =
555 rcp(new StepperState<Scalar>(this->getStepperType()));
556 return stepperState;
557}
558
559template <class Scalar>
561 Teuchos::FancyOStream& out, const Teuchos::EVerbosityLevel verbLevel) const
562{
563 auto l_out = Teuchos::fancyOStream(out.getOStream());
564 Teuchos::OSTab ostab(*l_out, 2, this->description());
565 l_out->setOutputToRootOnly(0);
566
567#ifdef VERBOSE_DEBUG_OUTPUT
568 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
569#endif
570
571 *l_out << std::endl;
572 Stepper<Scalar>::describe(*l_out, verbLevel);
573 StepperImplicit<Scalar>::describe(*l_out, verbLevel);
574
575 *l_out << "--- StepperHHTAlpha ---\n";
576 *l_out << " schemeName_ = " << schemeName_ << std::endl;
577 *l_out << " beta_ = " << beta_ << std::endl;
578 *l_out << " gamma_ = " << gamma_ << std::endl;
579 *l_out << " alpha_f_ = " << alpha_f_ << std::endl;
580 *l_out << " alpha_m_ = " << alpha_m_ << std::endl;
581 *l_out << "-----------------------" << std::endl;
582}
583
584template <class Scalar>
585bool StepperHHTAlpha<Scalar>::isValidSetup(Teuchos::FancyOStream& out) const
586{
587 out.setOutputToRootOnly(0);
588 bool isValidSetup = true;
589
591
592 // if ( !StepperImplicit<Scalar>::isValidSetup(out) ) isValidSetup = false;
593 if (this->wrapperModel_->getAppModel() == Teuchos::null) {
594 isValidSetup = false;
595 out << "The application ModelEvaluator is not set!\n";
596 }
597
598 if (this->wrapperModel_ == Teuchos::null) {
599 isValidSetup = false;
600 out << "The wrapper ModelEvaluator is not set!\n";
601 }
602
603 if (this->solver_ == Teuchos::null) {
604 isValidSetup = false;
605 out << "The solver is not set!\n";
606 }
607
608 return isValidSetup;
609}
610
611template <class Scalar>
612Teuchos::RCP<const Teuchos::ParameterList>
614{
615#ifdef VERBOSE_DEBUG_OUTPUT
616 *out_ << "DEBUG: " << __PRETTY_FUNCTION__ << "\n";
617#endif
618 auto pl = this->getValidParametersBasicImplicit();
619
620 auto hhtalphaPL = Teuchos::parameterList("HHT-Alpha Parameters");
621 hhtalphaPL->set<std::string>("Scheme Name", schemeName_);
622 hhtalphaPL->set<double>("Beta", beta_);
623 hhtalphaPL->set<double>("Gamma", gamma_);
624 hhtalphaPL->set<double>("Alpha_f", alpha_f_);
625 hhtalphaPL->set<double>("Alpha_m", alpha_m_);
626 pl->set("HHT-Alpha Parameters", *hhtalphaPL);
627
628 return pl;
629}
630
631// Nonmember constructor - ModelEvaluator and ParameterList
632// ------------------------------------------------------------------------
633template <class Scalar>
634Teuchos::RCP<StepperHHTAlpha<Scalar> > createStepperHHTAlpha(
635 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
636 Teuchos::RCP<Teuchos::ParameterList> pl)
637{
638 auto stepper = Teuchos::rcp(new StepperHHTAlpha<Scalar>());
639 stepper->setStepperImplicitValues(pl);
640
641 if (pl != Teuchos::null) {
642 if (pl->isSublist("HHT-Alpha Parameters")) {
643 auto hhtalphaPL = pl->sublist("HHT-Alpha Parameters", true);
644 std::string schemeName = hhtalphaPL.get<std::string>(
645 "Scheme Name", "Newmark Beta Average Acceleration");
646 stepper->setSchemeName(schemeName);
647 stepper->setAlphaF(hhtalphaPL.get<double>("Alpha_f", 0.0));
648 stepper->setAlphaM(hhtalphaPL.get<double>("Alpha_m", 0.0));
649 if (schemeName == "Newmark Beta User Defined") {
650 stepper->setBeta(hhtalphaPL.get<double>("Beta", 0.25));
651 stepper->setGamma(hhtalphaPL.get<double>("Gamma", 0.5));
652 }
653 }
654 else {
655 stepper->setSchemeName("Newmark Beta Average Acceleration");
656 stepper->setAlphaF(0.0);
657 stepper->setAlphaM(0.0);
658 }
659 stepper->validateSchemeParameters();
660 }
661
662 if (model != Teuchos::null) {
663 stepper->setModel(model);
664 stepper->initialize();
665 }
666
667 return stepper;
668}
669
670} // namespace Tempus
671#endif // Tempus_StepperHHTAlpha_impl_hpp
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
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
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 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)
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
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.
void validateSchemeParameters() const
Validate final scheme parameters and emit any consistency warnings.
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
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 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)
StepperState is a simple class to hold state information about the stepper.
A ModelEvaluator for residual evaluations given a state. This ModelEvaluator takes a state,...
bool approxEqual(Scalar a, Scalar b, Scalar relTol=numericalTol< Scalar >())
Test if values are approximately equal within the relative tolerance.
void validSecondOrderODE_DAE(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Teuchos::RCP< StepperHHTAlpha< Scalar > > createStepperHHTAlpha(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.