12#include "Teuchos_XMLParameterListHelpers.hpp"
16#include "Tempus_StepperForwardEuler.hpp"
17#include "Tempus_StepperBackwardEuler.hpp"
19#include "Tempus_StepperOperatorSplit.hpp"
27#include "../TestModels/VanDerPol_IMEX_ExplicitModel.hpp"
28#include "../TestModels/VanDerPol_IMEX_ImplicitModel.hpp"
32using Teuchos::ParameterList;
35using Teuchos::rcp_const_cast;
36using Teuchos::rcp_dynamic_cast;
37using Teuchos::sublist;
45 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
47 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
56 stepper->addStepper(subStepper1);
57 stepper->addStepper(subStepper2);
58 stepper->initialize();
59 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
68 bool useFSAL = stepper->getUseFSAL();
69 std::string ICConsistency = stepper->getICConsistency();
70 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
74 stepper->setAppAction(modifier);
75 stepper->initialize();
76 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
77 stepper->setAppAction(modifierX);
78 stepper->initialize();
79 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
80 stepper->setAppAction(observer);
81 stepper->initialize();
82 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
83 stepper->setUseFSAL(useFSAL);
84 stepper->initialize();
85 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
86 stepper->setICConsistency(ICConsistency);
87 stepper->initialize();
88 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
89 stepper->setICConsistencyCheck(ICConsistencyCheck);
90 stepper->initialize();
91 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
92 stepper->setOrder(order);
93 stepper->initialize();
94 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
95 stepper->setOrderMin(order);
96 stepper->initialize();
97 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
98 stepper->setOrderMax(order);
99 stepper->initialize();
100 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
103 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
104 models.push_back(explicitModel);
105 models.push_back(implicitModel);
107 std::vector<Teuchos::RCP<Tempus::Stepper<double> > > subStepperList;
108 subStepperList.push_back(subStepper1);
109 subStepperList.push_back(subStepper2);
112 models, subStepperList, useFSAL, ICConsistency, ICConsistencyCheck, order,
113 order, order, modifier));
115 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
118 TEUCHOS_ASSERT(stepper->getOrder() == 1);
126 auto pList = Teuchos::getParametersFromXmlFile(
127 "../test/OperatorSplit/Tempus_OperatorSplit_VanDerPol.xml");
128 auto tempusPL = sublist(pList,
"Tempus",
true);
129 auto stepperPL = sublist(tempusPL,
"Demo Stepper",
true);
135 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
136 models.push_back(explicitModel);
137 models.push_back(implicitModel);
143 auto stepper = sf->createStepper(stepperPL, models);
144 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
149class StepperOperatorSplitModifierTest
153 StepperOperatorSplitModifierTest()
154 : testBEGIN_STEP(false),
156 testCurrentValue(-0.99),
157 testWorkingValue(-0.99),
164 virtual ~StepperOperatorSplitModifierTest() {}
174 case StepperOperatorSplitAppAction<double>::BEGIN_STEP: {
175 testBEGIN_STEP =
true;
176 auto x = sh->getCurrentState()->getX();
177 testCurrentValue = get_ele(*(x), 0);
180 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER: {
181 testBEFORE_STEPPER =
true;
182 testDt = sh->getWorkingState()->getTimeStep() / 10.0;
183 sh->getWorkingState()->setTimeStep(testDt);
186 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER: {
187 testAFTER_STEPPER =
true;
188 testName =
"OperatorSplit - Modifier";
189 stepper->setStepperName(testName);
192 case StepperOperatorSplitAppAction<double>::END_STEP: {
194 auto x = sh->getWorkingState()->getX();
195 testWorkingValue = get_ele(*(x), 0);
199 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
200 "Error - unknown action location.\n");
205 bool testBEFORE_STEPPER;
206 bool testAFTER_STEPPER;
208 double testCurrentValue;
209 double testWorkingValue;
211 std::string testName;
216 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
218 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
226 auto modifier = rcp(
new StepperOperatorSplitModifierTest());
227 stepper->setAppAction(modifier);
228 stepper->addStepper(subStepper1);
229 stepper->addStepper(subStepper2);
230 stepper->initialize();
233 auto inArgsIC = stepper->getModel()->getNominalValues();
234 auto icX = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
236 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
238 icState->setTime(0.0);
239 icState->setIndex(1);
240 icState->setTimeStep(-15.0);
241 icState->setOrder(stepper->getOrder());
246 solutionHistory->setName(
"Forward States");
248 solutionHistory->setStorageLimit(2);
249 solutionHistory->addState(icState);
252 stepper->setInitialConditions(solutionHistory);
253 solutionHistory->initWorkingState();
254 solutionHistory->getWorkingState()->setTimeStep(-15.0);
255 stepper->takeStep(solutionHistory);
258 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
259 TEST_COMPARE(modifier->testBEFORE_STEPPER, ==,
true);
260 TEST_COMPARE(modifier->testAFTER_STEPPER, ==,
true);
261 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
264 auto x = solutionHistory->getCurrentState()->getX();
265 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
266 x = solutionHistory->getWorkingState()->getX();
267 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
268 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
269 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
271 TEST_COMPARE(modifier->testName, ==,
"OperatorSplit - Modifier");
276class StepperOperatorSplitObserverTest
280 StepperOperatorSplitObserverTest()
281 : testBEGIN_STEP(false),
282 testBEFORE_STEPPER(false),
283 testAFTER_STEPPER(false),
285 testCurrentValue(-0.99),
286 testWorkingValue(-0.99),
288 testName(
"Operator Split")
293 virtual ~StepperOperatorSplitObserverTest() {}
296 virtual void observe(
303 case StepperOperatorSplitAppAction<double>::BEGIN_STEP: {
304 testBEGIN_STEP =
true;
305 auto x = sh->getCurrentState()->getX();
306 testCurrentValue = get_ele(*(x), 0);
309 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER: {
310 testBEFORE_STEPPER =
true;
311 testDt = sh->getWorkingState()->getTimeStep();
314 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER: {
315 testAFTER_STEPPER =
true;
316 testName = stepper->getStepperType();
319 case StepperOperatorSplitAppAction<double>::END_STEP: {
321 auto x = sh->getWorkingState()->getX();
322 testWorkingValue = get_ele(*(x), 0);
326 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
327 "Error - unknown action location.\n");
332 bool testBEFORE_STEPPER;
333 bool testAFTER_STEPPER;
335 double testCurrentValue;
336 double testWorkingValue;
338 std::string testName;
343 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
345 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
353 auto observer = rcp(
new StepperOperatorSplitObserverTest());
354 stepper->setAppAction(observer);
355 stepper->addStepper(subStepper1);
356 stepper->addStepper(subStepper2);
357 stepper->initialize();
360 auto inArgsIC = stepper->getModel()->getNominalValues();
361 auto icX = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
363 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
365 icState->setTime(0.0);
366 icState->setIndex(1);
367 icState->setTimeStep(-1.5);
368 icState->setOrder(stepper->getOrder());
373 solutionHistory->setName(
"Forward States");
375 solutionHistory->setStorageLimit(2);
376 solutionHistory->addState(icState);
379 stepper->setInitialConditions(solutionHistory);
380 solutionHistory->initWorkingState();
381 solutionHistory->getWorkingState()->setTimeStep(-1.5);
382 stepper->takeStep(solutionHistory);
385 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
386 TEST_COMPARE(observer->testBEFORE_STEPPER, ==,
true);
387 TEST_COMPARE(observer->testAFTER_STEPPER, ==,
true);
388 TEST_COMPARE(observer->testEND_STEP, ==,
true);
391 auto x = solutionHistory->getCurrentState()->getX();
392 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
393 x = solutionHistory->getWorkingState()->getX();
394 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
395 TEST_FLOATING_EQUALITY(observer->testDt, -1.5, 1.0e-14);
397 TEST_COMPARE(observer->testName, ==,
"Operator Split");
402class StepperOperatorSplitModifierXTest
406 StepperOperatorSplitModifierXTest()
407 : testX_BEGIN_STEP(false),
408 testX_BEFORE_STEPPER(false),
409 testX_AFTER_STEPPER(false),
410 testXDOT_END_STEP(false),
419 virtual ~StepperOperatorSplitModifierXTest() {}
423 const double time,
const double dt,
428 case StepperOperatorSplitModifierXBase<double>::X_BEGIN_STEP: {
429 testX_BEGIN_STEP =
true;
430 testX = get_ele(*(x), 0);
433 case StepperOperatorSplitModifierXBase<double>::X_BEFORE_STEPPER: {
434 testX_BEFORE_STEPPER =
true;
438 case StepperOperatorSplitModifierXBase<double>::X_AFTER_STEPPER: {
439 testX_AFTER_STEPPER =
true;
443 case StepperOperatorSplitModifierXBase<double>::XDOT_END_STEP: {
444 testXDOT_END_STEP =
true;
445 testXDot = get_ele(*(x), 0);
449 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
450 "Error - unknown action location.\n");
454 bool testX_BEGIN_STEP;
455 bool testX_BEFORE_STEPPER;
456 bool testX_AFTER_STEPPER;
457 bool testXDOT_END_STEP;
466 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
468 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
476 auto modifierX = rcp(
new StepperOperatorSplitModifierXTest());
477 stepper->setAppAction(modifierX);
478 stepper->addStepper(subStepper1);
479 stepper->addStepper(subStepper2);
480 stepper->initialize();
483 auto inArgsIC = stepper->getModel()->getNominalValues();
484 auto icX = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
486 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
488 icState->setTime(0.0);
489 icState->setIndex(1);
490 icState->setTimeStep(-1.5);
491 icState->setOrder(stepper->getOrder());
496 solutionHistory->setName(
"Forward States");
498 solutionHistory->setStorageLimit(2);
499 solutionHistory->addState(icState);
502 stepper->setInitialConditions(solutionHistory);
503 solutionHistory->initWorkingState();
504 solutionHistory->getWorkingState()->setTimeStep(-1.5);
505 stepper->takeStep(solutionHistory);
508 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
509 TEST_COMPARE(modifierX->testX_BEFORE_STEPPER, ==,
true);
510 TEST_COMPARE(modifierX->testX_AFTER_STEPPER, ==,
true);
511 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
514 auto x = solutionHistory->getCurrentState()->getX();
515 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
517 auto xDot = solutionHistory->getWorkingState()->getXDot();
518 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
520 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0), 1.0e-14);
521 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
522 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
524 auto time = solutionHistory->getWorkingState()->getTime();
525 TEST_FLOATING_EQUALITY(modifierX->testTime, time, 1.0e-14);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Explicit Runge-Kutta time stepper.
StepperOperatorSplitAppAction class for StepperOperatorSplit.
Base modifier for OperatorSplit.
Default modifier for StepperOperatorSplit.
Base ModifierX for StepperOperatorSplit.
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > >, const double, const double, const MODIFIER_TYPE modType)=0
Modify solution based on the MODIFIER_TYPE.
Default ModifierX for StepperOperatorSplit.
Base observer for StepperOperatorSplit.
Default observer for StepperOperatorSplit.
OperatorSplit stepper loops through the Stepper list.
van der Pol model formulated for IMEX.
van der Pol model formulated for IMEX-RK.
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.