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.
OperatorSplit stepper loops through the Stepper list.
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.
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.