11#include "Teuchos_XMLParameterListHelpers.hpp"
15#include "Tempus_StepperForwardEuler.hpp"
16#include "Tempus_StepperBackwardEuler.hpp"
18#include "Tempus_StepperOperatorSplit.hpp"
26#include "../TestModels/VanDerPol_IMEX_ExplicitModel.hpp"
27#include "../TestModels/VanDerPol_IMEX_ImplicitModel.hpp"
33using Teuchos::rcp_const_cast;
34using Teuchos::rcp_dynamic_cast;
35using Teuchos::ParameterList;
36using Teuchos::sublist;
45 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
46 rcp(
new Tempus_Test::VanDerPol_IMEX_ExplicitModel<double>());
47 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
48 rcp(
new Tempus_Test::VanDerPol_IMEX_ImplicitModel<double>());
54 stepper->addStepper(subStepper1);
55 stepper->addStepper(subStepper2);
56 stepper->initialize();
57 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
63 bool useFSAL = stepper->getUseFSAL();
64 std::string ICConsistency = stepper->getICConsistency();
65 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
69 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
70 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
71 stepper->setAppAction(observer); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
72 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
73 stepper->setICConsistency(ICConsistency); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
74 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
75 stepper->setOrder(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
76 stepper->setOrderMin(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
77 stepper->setOrderMax(order); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
81 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
82 models.push_back(explicitModel);
83 models.push_back(implicitModel);
85 std::vector<Teuchos::RCP<Tempus::Stepper<double> > > subStepperList;
86 subStepperList.push_back(subStepper1);
87 subStepperList.push_back(subStepper2);
90 models, subStepperList, useFSAL, ICConsistency, ICConsistencyCheck,order, order, order,modifier));
92 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
95 TEUCHOS_ASSERT(stepper->getOrder() == 1);
104 auto pList = Teuchos::getParametersFromXmlFile(
105 "../test/OperatorSplit/Tempus_OperatorSplit_VanDerPol.xml");
106 auto tempusPL = sublist(pList,
"Tempus",
true);
107 auto stepperPL = sublist(tempusPL,
"Demo Stepper",
true);
109 auto explicitModel = rcp(
new Tempus_Test::VanDerPol_IMEX_ExplicitModel<double>());
110 auto implicitModel = rcp(
new Tempus_Test::VanDerPol_IMEX_ImplicitModel<double>());
111 std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
112 models.push_back(explicitModel);
113 models.push_back(implicitModel);
120 auto stepper = sf->createStepper(stepperPL, models);
121 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
127class StepperOperatorSplitModifierTest
133 StepperOperatorSplitModifierTest()
134 : testBEGIN_STEP(false), testEND_STEP(false),
135 testCurrentValue(-0.99), testWorkingValue(-0.99),
136 testDt(-1.5), testName(
"")
140 virtual ~StepperOperatorSplitModifierTest(){}
149 case StepperOperatorSplitAppAction<double>::BEGIN_STEP:
151 testBEGIN_STEP =
true;
152 auto x = sh->getCurrentState()->getX();
153 testCurrentValue = get_ele(*(x), 0);
156 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER:
158 testBEFORE_STEPPER =
true;
159 testDt = sh->getWorkingState()->getTimeStep()/10.0;
160 sh->getWorkingState()->setTimeStep(testDt);
163 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER:
165 testAFTER_STEPPER =
true;
166 testName =
"OperatorSplit - Modifier";
167 stepper->setStepperName(testName);
170 case StepperOperatorSplitAppAction<double>::END_STEP:
173 auto x = sh->getWorkingState()->getX();
174 testWorkingValue = get_ele(*(x), 0);
178 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
179 "Error - unknown action location.\n");
184 bool testBEFORE_STEPPER;
185 bool testAFTER_STEPPER;
187 double testCurrentValue;
188 double testWorkingValue;
190 std::string testName;
195 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
196 rcp(
new Tempus_Test::VanDerPol_IMEX_ExplicitModel<double>());
197 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
198 rcp(
new Tempus_Test::VanDerPol_IMEX_ImplicitModel<double>());
203 auto modifier = rcp(
new StepperOperatorSplitModifierTest());
204 stepper->setAppAction(modifier);
205 stepper->addStepper(subStepper1);
206 stepper->addStepper(subStepper2);
207 stepper->initialize();
210 auto inArgsIC = stepper->getModel()->getNominalValues();
211 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
212 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
214 icState->setTime (0.0);
215 icState->setIndex (1);
216 icState->setTimeStep(-15.0);
217 icState->setOrder (stepper->getOrder());
222 solutionHistory->setName(
"Forward States");
224 solutionHistory->setStorageLimit(2);
225 solutionHistory->addState(icState);
228 stepper->setInitialConditions(solutionHistory);
229 solutionHistory->initWorkingState();
230 solutionHistory->getWorkingState()->setTimeStep(-15.0);
231 stepper->takeStep(solutionHistory);
234 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
235 TEST_COMPARE(modifier->testBEFORE_STEPPER, ==,
true);
236 TEST_COMPARE(modifier->testAFTER_STEPPER, ==,
true);
237 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
240 auto x = solutionHistory->getCurrentState()->getX();
241 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
242 x = solutionHistory->getWorkingState()->getX();
243 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
244 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
245 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
247 TEST_COMPARE(modifier->testName, ==,
"OperatorSplit - Modifier");
252class StepperOperatorSplitObserverTest
258 StepperOperatorSplitObserverTest()
259 : testBEGIN_STEP(false), testBEFORE_STEPPER(false),
260 testAFTER_STEPPER(false), testEND_STEP(false),
261 testCurrentValue(-0.99), testWorkingValue(-0.99),
262 testDt(-1.5), testName(
"Operator Split")
266 virtual ~StepperOperatorSplitObserverTest(){}
269 virtual void observe(
275 case StepperOperatorSplitAppAction<double>::BEGIN_STEP:
277 testBEGIN_STEP =
true;
278 auto x = sh->getCurrentState()->getX();
279 testCurrentValue = get_ele(*(x), 0);
282 case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER:
284 testBEFORE_STEPPER =
true;
285 testDt = sh->getWorkingState()->getTimeStep();
288 case StepperOperatorSplitAppAction<double>::AFTER_STEPPER:
290 testAFTER_STEPPER =
true;
291 testName = stepper->getStepperType();
294 case StepperOperatorSplitAppAction<double>::END_STEP:
297 auto x = sh->getWorkingState()->getX();
298 testWorkingValue = get_ele(*(x), 0);
302 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
303 "Error - unknown action location.\n");
308 bool testBEFORE_STEPPER;
309 bool testAFTER_STEPPER;
311 double testCurrentValue;
312 double testWorkingValue;
314 std::string testName;
319 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
320 rcp(
new Tempus_Test::VanDerPol_IMEX_ExplicitModel<double>());
321 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
322 rcp(
new Tempus_Test::VanDerPol_IMEX_ImplicitModel<double>());
327 auto observer = rcp(
new StepperOperatorSplitObserverTest());
328 stepper->setAppAction(observer);
329 stepper->addStepper(subStepper1);
330 stepper->addStepper(subStepper2);
331 stepper->initialize();
334 auto inArgsIC = stepper->getModel()->getNominalValues();
335 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
336 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
338 icState->setTime (0.0);
339 icState->setIndex (1);
340 icState->setTimeStep(-1.5);
341 icState->setOrder (stepper->getOrder());
346 solutionHistory->setName(
"Forward States");
348 solutionHistory->setStorageLimit(2);
349 solutionHistory->addState(icState);
352 stepper->setInitialConditions(solutionHistory);
353 solutionHistory->initWorkingState();
354 solutionHistory->getWorkingState()->setTimeStep(-1.5);
355 stepper->takeStep(solutionHistory);
358 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
359 TEST_COMPARE(observer->testBEFORE_STEPPER, ==,
true);
360 TEST_COMPARE(observer->testAFTER_STEPPER, ==,
true);
361 TEST_COMPARE(observer->testEND_STEP, ==,
true);
364 auto x = solutionHistory->getCurrentState()->getX();
365 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
366 x = solutionHistory->getWorkingState()->getX();
367 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
368 TEST_FLOATING_EQUALITY(observer->testDt, -1.5, 1.0e-14);
370 TEST_COMPARE(observer->testName, ==,
"Operator Split");
375class StepperOperatorSplitModifierXTest
381 StepperOperatorSplitModifierXTest()
382 : testX_BEGIN_STEP(false), testX_BEFORE_STEPPER(false),
383 testX_AFTER_STEPPER(false), testXDOT_END_STEP(false),
384 testX(-0.99), testXDot(-0.99),
385 testDt(-1.5), testTime(-1.5)
389 virtual ~StepperOperatorSplitModifierXTest(){}
394 const double time,
const double dt,
398 case StepperOperatorSplitModifierXBase<double>::X_BEGIN_STEP:
400 testX_BEGIN_STEP =
true;
401 testX = get_ele(*(x), 0);
404 case StepperOperatorSplitModifierXBase<double>::X_BEFORE_STEPPER:
406 testX_BEFORE_STEPPER =
true;
410 case StepperOperatorSplitModifierXBase<double>::X_AFTER_STEPPER:
412 testX_AFTER_STEPPER =
true;
416 case StepperOperatorSplitModifierXBase<double>::XDOT_END_STEP:
418 testXDOT_END_STEP =
true;
419 testXDot = get_ele(*(x), 0);
423 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
424 "Error - unknown action location.\n");
428 bool testX_BEGIN_STEP;
429 bool testX_BEFORE_STEPPER;
430 bool testX_AFTER_STEPPER;
431 bool testXDOT_END_STEP;
440 RCP<const Thyra::ModelEvaluator<double> > explicitModel =
441 rcp(
new Tempus_Test::VanDerPol_IMEX_ExplicitModel<double>());
442 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
443 rcp(
new Tempus_Test::VanDerPol_IMEX_ImplicitModel<double>());
448 auto modifierX = rcp(
new StepperOperatorSplitModifierXTest());
449 stepper->setAppAction(modifierX);
450 stepper->addStepper(subStepper1);
451 stepper->addStepper(subStepper2);
452 stepper->initialize();
455 auto inArgsIC = stepper->getModel()->getNominalValues();
456 auto icX = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
457 auto icXDot = rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
459 icState->setTime (0.0);
460 icState->setIndex (1);
461 icState->setTimeStep(-1.5);
462 icState->setOrder (stepper->getOrder());
467 solutionHistory->setName(
"Forward States");
469 solutionHistory->setStorageLimit(2);
470 solutionHistory->addState(icState);
473 stepper->setInitialConditions(solutionHistory);
474 solutionHistory->initWorkingState();
475 solutionHistory->getWorkingState()->setTimeStep(-1.5);
476 stepper->takeStep(solutionHistory);
479 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
480 TEST_COMPARE(modifierX->testX_BEFORE_STEPPER, ==,
true);
481 TEST_COMPARE(modifierX->testX_AFTER_STEPPER, ==,
true);
482 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
485 auto x = solutionHistory->getCurrentState()->getX();
486 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
488 auto xDot = solutionHistory->getWorkingState()->getXDot();
489 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
491 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0),1.0e-14);
492 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
493 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
495 auto time = solutionHistory->getWorkingState()->getTime();
496 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.
Base modifier for OperatorSplit.
Default modifier for StepperOperatorSplit.
Base ModifierX for StepperOperatorSplit.
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
Default ModifierX for StepperOperatorSplit.
Base observer for StepperOperatorSplit.
Default observer for StepperOperatorSplit.
OperatorSplit stepper loops through the Stepper list.
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.