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 =
47 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
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);
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 =
197 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
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 =
321 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
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 =
442 RCP<const Thyra::ModelEvaluator<double> > implicitModel =
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).
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.