12#include "Tempus_StepperForwardEuler.hpp"
25using Teuchos::rcp_const_cast;
26using Teuchos::rcp_dynamic_cast;
27using Teuchos::ParameterList;
28using Teuchos::sublist;
37 auto model = rcp(
new Tempus_Test::SinCosModel<double>());
44 stepper->setModel(model);
45 stepper->initialize();
46 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
48 bool useFSAL = stepper->getUseFSAL();
49 std::string ICConsistency = stepper->getICConsistency();
50 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
53 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
54 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
55 stepper->setAppAction(observer); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
56 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
57 stepper->setICConsistency(ICConsistency); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
58 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
61 model, useFSAL, ICConsistency, ICConsistencyCheck,modifier));
62 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
65 TEUCHOS_ASSERT(stepper->getOrder() == 1);
73 auto model = rcp(
new Tempus_Test::SinCosModel<double>());
80class StepperForwardEulerModifierTest
86 StepperForwardEulerModifierTest()
87 : testBEGIN_STEP(false), testBEFORE_EXPLICIT_EVAL(false),
88 testEND_STEP(false), testCurrentValue(-0.99), testWorkingValue(-0.99),
89 testDt(-1.5), testName(
"")
93 virtual ~StepperForwardEulerModifierTest(){}
102 case StepperForwardEulerAppAction<double>::BEGIN_STEP:
104 testBEGIN_STEP =
true;
105 auto x = sh->getCurrentState()->getX();
106 testCurrentValue = get_ele(*(x), 0);
109 case StepperForwardEulerAppAction<double>::BEFORE_EXPLICIT_EVAL:
111 testBEFORE_EXPLICIT_EVAL =
true;
112 testDt = sh->getWorkingState()->getTimeStep()/10.0;
113 sh->getWorkingState()->setTimeStep(testDt);
114 testName =
"Forward Euler - Modifier";
115 stepper->setStepperName(testName);
118 case StepperForwardEulerAppAction<double>::END_STEP:
121 auto x = sh->getWorkingState()->getX();
122 testWorkingValue = get_ele(*(x), 0);
126 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
127 "Error - unknown action location.\n");
131 bool testBEFORE_EXPLICIT_EVAL;
133 double testCurrentValue;
134 double testWorkingValue;
136 std::string testName;
141 auto model = rcp(
new Tempus_Test::SinCosModel<double>());
145 stepper->setModel(model);
146 auto modifier = rcp(
new StepperForwardEulerModifierTest());
147 stepper->setAppAction(modifier);
148 stepper->initialize();
151 auto inArgsIC = model->getNominalValues();
153 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
155 icState->setTime (0.0);
156 icState->setIndex (0);
157 icState->setTimeStep(0.0);
158 icState->setOrder (stepper->getOrder());
163 solutionHistory->setName(
"Forward States");
165 solutionHistory->setStorageLimit(2);
166 solutionHistory->addState(icState);
169 stepper->setInitialConditions(solutionHistory);
170 solutionHistory->initWorkingState();
172 solutionHistory->getWorkingState()->setTimeStep(dt);
173 stepper->takeStep(solutionHistory);
175 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
176 TEST_COMPARE(modifier->testBEFORE_EXPLICIT_EVAL, ==,
true);
177 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
179 auto x = solutionHistory->getCurrentState()->getX();
180 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
181 x = solutionHistory->getWorkingState()->getX();
182 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
183 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
184 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
186 TEST_COMPARE(modifier->testName, ==,
"Forward Euler - Modifier");
192class StepperForwardEulerObserverTest
198 StepperForwardEulerObserverTest()
199 : testBEGIN_STEP(false), testBEFORE_EXPLICIT_EVAL(false),
200 testEND_STEP(false), testCurrentValue(-0.99),
201 testWorkingValue(-0.99),testDt(-1.5), testName(
"")
205 virtual ~StepperForwardEulerObserverTest(){}
208 virtual void observe(
214 case StepperForwardEulerAppAction<double>::BEGIN_STEP:
216 testBEGIN_STEP =
true;
217 auto x = sh->getCurrentState()->getX();
218 testCurrentValue = get_ele(*(x), 0);
221 case StepperForwardEulerAppAction<double>::BEFORE_EXPLICIT_EVAL:
223 testBEFORE_EXPLICIT_EVAL =
true;
224 testDt = sh->getWorkingState()->getTimeStep();
225 testName = stepper->getStepperName();
228 case StepperForwardEulerAppAction<double>::END_STEP:
231 auto x = sh->getWorkingState()->getX();
232 testWorkingValue = get_ele(*(x), 0);
236 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
237 "Error - unknown action location.\n");
242 bool testBEFORE_EXPLICIT_EVAL;
244 double testCurrentValue;
245 double testWorkingValue;
247 std::string testName;
252 auto model = rcp(
new Tempus_Test::SinCosModel<double>());
256 stepper->setModel(model);
257 auto observer = rcp(
new StepperForwardEulerObserverTest());
258 stepper->setAppAction(observer);
259 stepper->initialize();
262 auto inArgsIC = model->getNominalValues();
264 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
266 icState->setTime (0.0);
267 icState->setIndex (0);
268 icState->setTimeStep(0.0);
269 icState->setOrder (stepper->getOrder());
274 solutionHistory->setName(
"Forward States");
276 solutionHistory->setStorageLimit(2);
277 solutionHistory->addState(icState);
280 stepper->setInitialConditions(solutionHistory);
281 solutionHistory->initWorkingState();
283 solutionHistory->getWorkingState()->setTimeStep(dt);
284 stepper->takeStep(solutionHistory);
286 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
287 TEST_COMPARE(observer->testBEFORE_EXPLICIT_EVAL, ==,
true);
288 TEST_COMPARE(observer->testEND_STEP, ==,
true);
290 auto x = solutionHistory->getCurrentState()->getX();
291 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
292 x = solutionHistory->getWorkingState()->getX();
293 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
294 TEST_FLOATING_EQUALITY(observer->testDt, dt, 1.0e-14);
296 TEST_COMPARE(observer->testName, ==,
"Forward Euler");
302class StepperForwardEulerModifierXTest
308 StepperForwardEulerModifierXTest()
309 : testX_BEGIN_STEP(false), testX_BEFORE_EXPLICIT_EVAL(false),
310 testXDOT_END_STEP(false), testX(-0.99),
311 testXDot(-0.99), testDt(-1.5), testTime(-1.5)
315 virtual ~StepperForwardEulerModifierXTest(){}
320 const double time,
const double dt,
324 case StepperForwardEulerModifierXBase<double>::X_BEGIN_STEP:
326 testX_BEGIN_STEP =
true;
327 testX = get_ele(*(x), 0);
330 case StepperForwardEulerModifierXBase<double>::X_BEFORE_EXPLICIT_EVAL:
332 testX_BEFORE_EXPLICIT_EVAL =
true;
337 case StepperForwardEulerModifierXBase<double>::XDOT_END_STEP:
339 testXDOT_END_STEP =
true;
340 testXDot = get_ele(*(x), 0);
344 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
345 "Error - unknown action location.\n");
348 bool testX_BEGIN_STEP;
349 bool testX_BEFORE_EXPLICIT_EVAL;
350 bool testXDOT_END_STEP;
359 auto model = rcp(
new Tempus_Test::SinCosModel<double>());
363 stepper->setModel(model);
364 auto modifierX = rcp(
new StepperForwardEulerModifierXTest());
365 stepper->setAppAction(modifierX);
366 stepper->initialize();
369 auto inArgsIC = model->getNominalValues();
371 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
373 icState->setTime (0.0);
374 icState->setIndex (0);
375 icState->setTimeStep(0.0);
376 icState->setOrder (stepper->getOrder());
381 solutionHistory->setName(
"Forward States");
383 solutionHistory->setStorageLimit(2);
384 solutionHistory->addState(icState);
387 stepper->setInitialConditions(solutionHistory);
388 solutionHistory->initWorkingState();
390 solutionHistory->getWorkingState()->setTimeStep(dt);
391 stepper->takeStep(solutionHistory);
393 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
394 TEST_COMPARE(modifierX->testX_BEFORE_EXPLICIT_EVAL, ==,
true);
395 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
397 auto x = solutionHistory->getCurrentState()->getX();
398 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
400 auto xDot = solutionHistory->getWorkingState()->getXDot();
401 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
403 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0),1.0e-14);
404 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
405 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
407 auto time = solutionHistory->getWorkingState()->getTime();
408 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.
ACTION_LOCATION
Indicates the location of application action (see algorithm).
Base modifier for StepperBackwardEuler.
Default modifier for StepperForwardEuler.
Base ModifierX for StepperForwardEuler.
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
Default ModifierX for StepperForwardEuler.
Base observer for StepperForwardEuler.
Default observer for StepperForwardEuler.
Forward Euler time stepper.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
void testFactoryConstruction(std::string stepperType, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model)
Unit test utility for Stepper construction through StepperFactory.
@ 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.