9 #include "Teuchos_UnitTestHarness.hpp"
10 #include "Teuchos_XMLParameterListHelpers.hpp"
11 #include "Teuchos_TimeMonitor.hpp"
12 #include "Teuchos_DefaultComm.hpp"
14 #include "Thyra_VectorStdOps.hpp"
28 #include "../TestModels/VanDerPol_IMEX_ExplicitModel.hpp"
29 #include "../TestModels/VanDerPol_IMEX_ImplicitModel.hpp"
30 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp"
39 using Teuchos::rcp_const_cast;
40 using Teuchos::rcp_dynamic_cast;
41 using Teuchos::ParameterList;
42 using Teuchos::sublist;
43 using Teuchos::getParametersFromXmlFile;
60 sf->createStepperForwardEuler(explicitModel, Teuchos::null);
62 sf->createStepperBackwardEuler(implicitModel, Teuchos::null);
63 stepper->addStepper(subStepper1);
64 stepper->addStepper(subStepper2);
65 stepper->initialize();
66 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
69 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
75 bool useFSAL = stepper->getUseFSALDefault();
76 std::string ICConsistency = stepper->getICConsistencyDefault();
77 bool ICConsistencyCheck = stepper->getICConsistencyCheckDefault();
81 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
82 stepper->setObserver(obs); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
84 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
85 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
86 stepper->setAppAction(observer); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
87 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
88 stepper->setICConsistency(ICConsistency); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
89 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
90 stepper->setOrder(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
91 stepper->setOrderMin(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
92 stepper->setOrderMax(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
96 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
97 models.push_back(explicitModel);
98 models.push_back(implicitModel);
100 std::vector<Teuchos::RCP<Tempus::Stepper<double> > > subStepperList;
101 subStepperList.push_back(subStepper1);
102 subStepperList.push_back(subStepper2);
104 #ifndef TEMPUS_HIDE_DEPRECATED_CODE
106 models, subStepperList, obs, useFSAL, ICConsistency, ICConsistencyCheck,
107 order, order, order));
110 models, subStepperList, useFSAL, ICConsistency, ICConsistencyCheck,order, order, order,modifier));
112 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
115 TEUCHOS_ASSERT(stepper->getOrder() == 1);
124 auto pList = getParametersFromXmlFile(
125 "../test/OperatorSplit/Tempus_OperatorSplit_VanDerPol.xml");
126 auto tempusPL = sublist(pList,
"Tempus",
true);
127 auto stepperPL = sublist(tempusPL,
"Demo Stepper",
true);
131 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
132 models.push_back(explicitModel);
133 models.push_back(implicitModel);
140 auto stepper = sf->createMultiSteppers(stepperPL, models);
141 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
169 case StepperOperatorSplitAppAction<double>::BEGIN_STEP:
172 auto x = sh->getCurrentState()->getX();
176 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER:
179 testDt = sh->getWorkingState()->getTimeStep()/10.0;
180 sh->getWorkingState()->setTimeStep(
testDt);
183 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER:
186 testType =
"OperatorSplit - Modifier";
190 case StepperOperatorSplitAppAction<double>::END_STEP:
193 auto x = sh->getWorkingState()->getX();
198 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
199 "Error - unknown action location.\n");
221 sf->createStepperForwardEuler(explicitModel, Teuchos::null);
223 sf->createStepperBackwardEuler(implicitModel, Teuchos::null);
225 stepper->setAppAction(modifier);
226 stepper->addStepper(subStepper1);
227 stepper->addStepper(subStepper2);
228 stepper->initialize();
231 Thyra::ModelEvaluatorBase::InArgs<double> inArgsIC =
232 stepper->getModel()->getNominalValues();
233 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
234 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
236 icState->setTime (0.0);
237 icState->setIndex (1);
238 icState->setTimeStep(-15.0);
239 icState->setOrder (stepper->getOrder());
244 solutionHistory->setName(
"Forward States");
246 solutionHistory->setStorageLimit(2);
247 solutionHistory->addState(icState);
250 stepper->setInitialConditions(solutionHistory);
251 solutionHistory->initWorkingState();
252 solutionHistory->getWorkingState()->setTimeStep(-15.0);
253 stepper->takeStep(solutionHistory);
256 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
257 TEST_COMPARE(modifier->testBEFORE_STEPPER, ==,
true);
258 TEST_COMPARE(modifier->testAFTER_STEPPER, ==,
true);
259 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
262 auto x = solutionHistory->getCurrentState()->getX();
263 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-15);
264 x = solutionHistory->getWorkingState()->getX();
265 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-15);
266 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
267 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-15);
269 TEST_COMPARE(modifier->testType, ==,
"OperatorSplit - Modifier");
297 case StepperOperatorSplitAppAction<double>::BEGIN_STEP:
300 auto x = sh->getCurrentState()->getX();
304 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER:
307 testDt = sh->getWorkingState()->getTimeStep();
310 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER:
313 testType = stepper->getStepperType();
316 case StepperOperatorSplitAppAction<double>::END_STEP:
319 auto x = sh->getWorkingState()->getX();
324 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
325 "Error - unknown action location.\n");
347 sf->createStepperForwardEuler(explicitModel, Teuchos::null);
349 sf->createStepperBackwardEuler(implicitModel, Teuchos::null);
351 stepper->setAppAction(observer);
352 stepper->addStepper(subStepper1);
353 stepper->addStepper(subStepper2);
354 stepper->initialize();
357 Thyra::ModelEvaluatorBase::InArgs<double> inArgsIC =
358 stepper->getModel()->getNominalValues();
359 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
360 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
362 icState->setTime (0.0);
363 icState->setIndex (1);
364 icState->setTimeStep(-1.5);
365 icState->setOrder (stepper->getOrder());
370 solutionHistory->setName(
"Forward States");
372 solutionHistory->setStorageLimit(2);
373 solutionHistory->addState(icState);
376 stepper->setInitialConditions(solutionHistory);
377 solutionHistory->initWorkingState();
378 solutionHistory->getWorkingState()->setTimeStep(-1.5);
379 stepper->takeStep(solutionHistory);
382 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
383 TEST_COMPARE(observer->testBEFORE_STEPPER, ==,
true);
384 TEST_COMPARE(observer->testAFTER_STEPPER, ==,
true);
385 TEST_COMPARE(observer->testEND_STEP, ==,
true);
388 auto x = solutionHistory->getCurrentState()->getX();
389 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-15);
390 x = solutionHistory->getWorkingState()->getX();
391 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-15);
392 TEST_FLOATING_EQUALITY(observer->testDt, -1.5, 1.0e-15);
394 TEST_COMPARE(observer->testType, ==,
"Operator Split");
417 Teuchos::RCP<Thyra::VectorBase<double> > x,
418 const double time,
const double dt,
425 testX = get_ele(*(x), 0);
447 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
448 "Error - unknown action location.\n");
470 sf->createStepperForwardEuler(explicitModel, Teuchos::null);
472 sf->createStepperBackwardEuler(implicitModel, Teuchos::null);
474 stepper->setAppAction(modifierX);
475 stepper->addStepper(subStepper1);
476 stepper->addStepper(subStepper2);
477 stepper->initialize();
480 Thyra::ModelEvaluatorBase::InArgs<double> inArgsIC =
481 stepper->getModel()->getNominalValues();
482 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
483 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
485 icState->setTime (0.0);
486 icState->setIndex (1);
487 icState->setTimeStep(-1.5);
488 icState->setOrder (stepper->getOrder());
493 solutionHistory->setName(
"Forward States");
495 solutionHistory->setStorageLimit(2);
496 solutionHistory->addState(icState);
499 stepper->setInitialConditions(solutionHistory);
500 solutionHistory->initWorkingState();
501 solutionHistory->getWorkingState()->setTimeStep(-1.5);
502 stepper->takeStep(solutionHistory);
505 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
506 TEST_COMPARE(modifierX->testX_BEFORE_STEPPER, ==,
true);
507 TEST_COMPARE(modifierX->testX_AFTER_STEPPER, ==,
true);
508 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
511 auto x = solutionHistory->getCurrentState()->getX();
512 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-15);
514 auto xDot = stepper->getStepperXDot(solutionHistory->getWorkingState());
515 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0),1.0e-15);
516 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
517 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-15);
519 auto time = solutionHistory->getWorkingState()->getTime();
520 TEST_FLOATING_EQUALITY(modifierX->testTime, time, 1.0e-15);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Explicit Runge-Kutta time stepper.
Base modifier for OperatorSplit.
Default modifier for StepperOperatorSplit.
Base ModifierX for StepperOperatorSplit.
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
@ XDOT_END_STEP
Modify at the end of the step.
@ X_BEGIN_STEP
Modify at the beginning of the step.
@ X_BEFORE_STEPPER
Modify before the implicit solve.
Default ModifierX for StepperOperatorSplit.
Base observer for StepperOperatorSplit.
Default observer for StepperOperatorSplit.
StepperOperatorSplitObserver class for StepperOperatorSplit.
OperatorSplit stepper loops through the Stepper list.
van der Pol model formulated for IMEX.
van der Pol model formulated for IMEX-RK.
StepperOperatorSplitModifierTest()
Constructor.
virtual ~StepperOperatorSplitModifierTest()
Destructor.
virtual void modify(Teuchos::RCP< Tempus::SolutionHistory< double > > sh, Teuchos::RCP< Tempus::StepperOperatorSplit< double > > stepper, const typename Tempus::StepperOperatorSplitAppAction< double >::ACTION_LOCATION actLoc)
Modify OperatorSplit Stepper at action location.
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > > x, const double time, const double dt, const typename Tempus::StepperOperatorSplitModifierXBase< double >::MODIFIER_TYPE modType)
Modify OperatorSplit Stepper at action location.
StepperOperatorSplitModifierXTest()
Constructor.
virtual ~StepperOperatorSplitModifierXTest()
Destructor.
bool testX_BEFORE_STEPPER
StepperOperatorSplitObserverTest()
Constructor.
virtual void observe(Teuchos::RCP< const Tempus::SolutionHistory< double > > sh, Teuchos::RCP< const Tempus::StepperOperatorSplit< double > > stepper, const typename Tempus::StepperOperatorSplitAppAction< double >::ACTION_LOCATION actLoc)
Observe OperatorSplit Stepper at action location.
virtual ~StepperOperatorSplitObserverTest()
Destructor.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
@ STORAGE_TYPE_STATIC
Keep a fix number of states.
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.