12#include "Tempus_StepperForwardEuler.hpp"
13#include "Tempus_StepperBackwardEuler.hpp"
15#include "Tempus_StepperSubcycling.hpp"
25using Teuchos::ParameterList;
28using Teuchos::rcp_const_cast;
29using Teuchos::rcp_dynamic_cast;
30using Teuchos::sublist;
32using Tempus::StepperFactory;
39 auto modelME = rcp_dynamic_cast<const Thyra::ModelEvaluator<double> >(model);
42 auto inArgsIC = model->getNominalValues();
44 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
47 solutionHistory->addState(icState);
48 solutionHistory->initWorkingState();
53 stepper->setSubcyclingStepper(stepperBE);
54 stepper->setInitialConditions(solutionHistory);
55 stepper->initialize();
56 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
65 bool useFSAL = stepper->getUseFSAL();
66 std::string ICConsistency = stepper->getICConsistency();
67 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
70 stepper->setSolver(solver);
71 stepper->initialize();
72 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
73 stepper->setAppAction(modifier);
74 stepper->initialize();
75 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
76 stepper->setAppAction(modifierX);
77 stepper->initialize();
78 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
79 stepper->setAppAction(observer);
80 stepper->initialize();
81 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
82 stepper->setUseFSAL(useFSAL);
83 stepper->initialize();
84 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
85 stepper->setICConsistency(ICConsistency);
86 stepper->initialize();
87 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
88 stepper->setICConsistencyCheck(ICConsistencyCheck);
89 stepper->initialize();
90 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
95 scIntegrator->setStepper(stepperFE);
96 scIntegrator->setSolutionHistory(solutionHistory);
97 scIntegrator->initialize();
100 model, scIntegrator, useFSAL, ICConsistency, ICConsistencyCheck,
102 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
105 TEUCHOS_ASSERT(stepper->getOrder() == 1);
114 auto modelME = rcp_dynamic_cast<const Thyra::ModelEvaluator<double> >(model);
117 stepper->setSubcyclingStepper(stepperBE);
120 auto inArgsIC = model->getNominalValues();
122 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
125 solutionHistory->addState(icState);
126 solutionHistory->initWorkingState();
129 stepper->setInitialConditions(solutionHistory);
130 stepper->initialize();
133 stepper->setSubcyclingInitTimeStep(0.25);
134 stepper->setSubcyclingMaxTimeStep(0.5);
135 double maxTimeStep_Set = stepper->getSubcyclingMaxTimeStep();
136 stepper->takeStep(solutionHistory);
137 double maxTimeStep_After = stepper->getSubcyclingMaxTimeStep();
139 TEST_FLOATING_EQUALITY(maxTimeStep_Set, maxTimeStep_After, 1.0e-14);
144class StepperSubcyclingModifierTest
148 StepperSubcyclingModifierTest()
149 : testBEGIN_STEP(false),
151 testCurrentValue(-0.99),
152 testWorkingValue(-0.99),
158 virtual ~StepperSubcyclingModifierTest() {}
162 Teuchos::RCP<Tempus::SolutionHistory<double> > sh,
163 Teuchos::RCP<Tempus::StepperSubcycling<double> > stepper,
169 testBEGIN_STEP =
true;
170 auto x = sh->getCurrentState()->getX();
171 testCurrentValue = get_ele(*(x), 0);
172 testName =
"Subcycling - Modifier";
173 stepper->setStepperName(testName);
178 auto x = sh->getWorkingState()->getX();
179 testWorkingValue = get_ele(*(x), 0);
180 testDt = sh->getWorkingState()->getTimeStep() / 10.0;
181 sh->getWorkingState()->setTimeStep(testDt);
185 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
186 "Error - unknown action location.\n");
192 double testCurrentValue;
193 double testWorkingValue;
195 std::string testName;
202 auto modelME = rcp_dynamic_cast<const Thyra::ModelEvaluator<double> >(model);
207 auto modifier = rcp(
new StepperSubcyclingModifierTest());
208 stepper->setAppAction(modifier);
209 stepper->setSubcyclingStepper(stepperFE);
211 stepper->setSubcyclingMinTimeStep(15);
212 stepper->setSubcyclingInitTimeStep(15.0);
213 stepper->setSubcyclingMaxTimeStep(15.0);
214 stepper->setSubcyclingMaxFailures(10);
215 stepper->setSubcyclingMaxConsecFailures(5);
216 stepper->setSubcyclingScreenOutputIndexInterval(1);
217 stepper->setSubcyclingPrintDtChanges(
true);
221 timeStepControl->setInitIndex(0);
222 timeStepControl->setInitTime(0.0);
223 timeStepControl->setFinalTime(1.0);
224 timeStepControl->setInitTimeStep(15.0);
225 timeStepControl->initialize();
228 auto inArgsIC = model->getNominalValues();
230 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
232 icState->setTime(timeStepControl->getInitTime());
233 icState->setIndex(timeStepControl->getInitIndex());
234 icState->setTimeStep(0.0);
239 solutionHistory->setName(
"Forward States");
241 solutionHistory->setStorageLimit(2);
242 solutionHistory->addState(icState);
245 stepper->setInitialConditions(solutionHistory);
246 stepper->initialize();
249 stepper->setInitialConditions(solutionHistory);
250 solutionHistory->initWorkingState();
251 solutionHistory->getWorkingState()->setTimeStep(15.0);
252 stepper->takeStep(solutionHistory);
255 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
256 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
259 auto x = solutionHistory->getCurrentState()->getX();
260 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
261 x = solutionHistory->getWorkingState()->getX();
262 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
263 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
264 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
266 TEST_COMPARE(modifier->testName, ==,
"Subcycling - Modifier");
271class StepperSubcyclingObserverTest
275 StepperSubcyclingObserverTest()
276 : testBEGIN_STEP(false),
278 testCurrentValue(-0.99),
279 testWorkingValue(-0.99),
281 testName(
"Subcyling")
286 virtual ~StepperSubcyclingObserverTest() {}
289 virtual void observe(
290 Teuchos::RCP<
const Tempus::SolutionHistory<double> > sh,
291 Teuchos::RCP<
const Tempus::StepperSubcycling<double> > ,
297 testBEGIN_STEP =
true;
298 auto x = sh->getCurrentState()->getX();
299 testCurrentValue = get_ele(*(x), 0);
304 auto x = sh->getWorkingState()->getX();
305 testWorkingValue = get_ele(*(x), 0);
309 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
310 "Error - unknown action location.\n");
316 double testCurrentValue;
317 double testWorkingValue;
319 std::string testName;
326 auto modelME = rcp_dynamic_cast<const Thyra::ModelEvaluator<double> >(model);
331 auto observer = rcp(
new StepperSubcyclingObserverTest());
332 stepper->setAppAction(observer);
333 stepper->setSubcyclingStepper(stepperFE);
335 stepper->setSubcyclingMinTimeStep(15);
336 stepper->setSubcyclingInitTimeStep(15.0);
337 stepper->setSubcyclingMaxTimeStep(15.0);
338 stepper->setSubcyclingMaxFailures(10);
339 stepper->setSubcyclingMaxConsecFailures(5);
340 stepper->setSubcyclingScreenOutputIndexInterval(1);
341 stepper->setSubcyclingPrintDtChanges(
true);
345 timeStepControl->setInitIndex(0);
346 timeStepControl->setInitTime(0.0);
347 timeStepControl->setFinalTime(1.0);
348 timeStepControl->setInitTimeStep(15.0);
349 timeStepControl->initialize();
352 auto inArgsIC = model->getNominalValues();
354 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
356 icState->setTime(timeStepControl->getInitTime());
357 icState->setIndex(timeStepControl->getInitIndex());
358 icState->setTimeStep(0.0);
363 solutionHistory->setName(
"Forward States");
365 solutionHistory->setStorageLimit(2);
366 solutionHistory->addState(icState);
369 stepper->setInitialConditions(solutionHistory);
370 stepper->initialize();
373 stepper->setInitialConditions(solutionHistory);
374 solutionHistory->initWorkingState();
375 solutionHistory->getWorkingState()->setTimeStep(15.0);
376 stepper->takeStep(solutionHistory);
379 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
380 TEST_COMPARE(observer->testEND_STEP, ==,
true);
383 auto x = solutionHistory->getCurrentState()->getX();
384 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
385 x = solutionHistory->getWorkingState()->getX();
386 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
387 TEST_FLOATING_EQUALITY(observer->testDt, 15.0, 1.0e-14);
389 TEST_COMPARE(observer->testName, ==,
"Subcyling");
394class StepperSubcyclingModifierXTest
398 StepperSubcyclingModifierXTest()
399 : testX_BEGIN_STEP(false),
400 testXDOT_END_STEP(false),
409 virtual ~StepperSubcyclingModifierXTest() {}
412 virtual void modify(Teuchos::RCP<Thyra::VectorBase<double> > x,
413 const double time,
const double dt,
414 const typename Tempus::StepperSubcyclingModifierXBase<
418 case StepperSubcyclingModifierXBase<double>::X_BEGIN_STEP: {
419 testX_BEGIN_STEP =
true;
420 testX = get_ele(*(x), 0);
424 case StepperSubcyclingModifierXBase<double>::XDOT_END_STEP: {
425 testXDOT_END_STEP =
true;
426 testXDot = get_ele(*(x), 0);
431 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
432 "Error - unknown action location.\n");
436 bool testX_BEGIN_STEP;
437 bool testXDOT_END_STEP;
448 auto modelME = rcp_dynamic_cast<const Thyra::ModelEvaluator<double> >(model);
453 auto modifierX = rcp(
new StepperSubcyclingModifierXTest());
454 stepper->setAppAction(modifierX);
455 stepper->setSubcyclingStepper(stepperFE);
457 stepper->setSubcyclingMinTimeStep(15);
458 stepper->setSubcyclingInitTimeStep(15.0);
459 stepper->setSubcyclingMaxTimeStep(15.0);
460 stepper->setSubcyclingMaxFailures(10);
461 stepper->setSubcyclingMaxConsecFailures(5);
462 stepper->setSubcyclingScreenOutputIndexInterval(1);
463 stepper->setSubcyclingPrintDtChanges(
true);
467 timeStepControl->setInitIndex(0);
468 timeStepControl->setInitTime(0.0);
469 timeStepControl->setFinalTime(1.0);
470 timeStepControl->setInitTimeStep(15.0);
471 timeStepControl->initialize();
474 auto inArgsIC = model->getNominalValues();
476 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
478 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
480 icState->setTime(timeStepControl->getInitTime());
481 icState->setIndex(timeStepControl->getInitIndex());
482 icState->setTimeStep(0.0);
487 solutionHistory->setName(
"Forward States");
489 solutionHistory->setStorageLimit(2);
490 solutionHistory->addState(icState);
493 stepper->setInitialConditions(solutionHistory);
494 stepper->initialize();
497 stepper->setInitialConditions(solutionHistory);
498 solutionHistory->initWorkingState();
499 solutionHistory->getWorkingState()->setTimeStep(15.0);
500 stepper->takeStep(solutionHistory);
503 stepper->setInitialConditions(solutionHistory);
504 solutionHistory->initWorkingState();
505 solutionHistory->getWorkingState()->setTimeStep(15.0);
506 stepper->takeStep(solutionHistory);
509 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
510 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
513 auto x = solutionHistory->getCurrentState()->getX();
514 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
516 auto xDot = solutionHistory->getWorkingState()->getXDot();
517 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
519 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0), 1.0e-14);
520 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
521 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
523 auto time = solutionHistory->getWorkingState()->getTime();
524 TEST_FLOATING_EQUALITY(modifierX->testTime, time, 1.0e-14);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
StepperSubcyclingAppAction()
ACTION_LOCATION
Indicates the location of application action (see algorithm).
Base modifier for StepperSubcycling.
Default modifier for StepperSubcycling.
Base ModifierX for StepperSubcycling.
Default ModifierX for StepperSubcycling.
Base observer for StepperSubcycling.
Default observer for StepperSubcycling.
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
@ STORAGE_TYPE_STATIC
Keep a fix number of states.
Teuchos::RCP< StepperBackwardEuler< Scalar > > createStepperBackwardEuler(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
Teuchos::RCP< SolutionState< Scalar > > createSolutionStateX(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdot=Teuchos::null, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdotdot=Teuchos::null)
Nonmember constructor from non-const solution vectors, x.
Teuchos::RCP< StepperForwardEuler< Scalar > > createStepperForwardEuler(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
Teuchos::RCP< Teuchos::ParameterList > defaultSolverParameters()
Returns the default solver ParameterList for implicit Steppers.