13#include "Tempus_StepperForwardEuler.hpp"
23using Teuchos::ParameterList;
26using Teuchos::rcp_const_cast;
27using Teuchos::rcp_dynamic_cast;
28using Teuchos::sublist;
30using Tempus::StepperExplicitRK;
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);
54 stepper->initialize();
55 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
56 stepper->setAppAction(modifierX);
57 stepper->initialize();
58 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
59 stepper->setAppAction(observer);
60 stepper->initialize();
61 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
62 stepper->setUseFSAL(useFSAL);
63 stepper->initialize();
64 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
65 stepper->setICConsistency(ICConsistency);
66 stepper->initialize();
67 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
68 stepper->setICConsistencyCheck(ICConsistencyCheck);
69 stepper->initialize();
70 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
73 model, useFSAL, ICConsistency, ICConsistencyCheck, modifier));
74 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
77 TEUCHOS_ASSERT(stepper->getOrder() == 1);
90class StepperForwardEulerModifierTest
94 StepperForwardEulerModifierTest()
95 : testBEGIN_STEP(false),
96 testBEFORE_EXPLICIT_EVAL(false),
98 testCurrentValue(-0.99),
99 testWorkingValue(-0.99),
106 virtual ~StepperForwardEulerModifierTest() {}
110 Teuchos::RCP<Tempus::SolutionHistory<double> > sh,
111 Teuchos::RCP<Tempus::StepperForwardEuler<double> > stepper,
112 const typename Tempus::StepperForwardEulerAppAction<
117 testBEGIN_STEP =
true;
118 auto x = sh->getCurrentState()->getX();
119 testCurrentValue = get_ele(*(x), 0);
123 testBEFORE_EXPLICIT_EVAL =
true;
124 testDt = sh->getWorkingState()->getTimeStep() / 10.0;
125 sh->getWorkingState()->setTimeStep(testDt);
126 testName =
"Forward Euler - Modifier";
127 stepper->setStepperName(testName);
132 auto x = sh->getWorkingState()->getX();
133 testWorkingValue = get_ele(*(x), 0);
137 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
138 "Error - unknown action location.\n");
142 bool testBEFORE_EXPLICIT_EVAL;
144 double testCurrentValue;
145 double testWorkingValue;
147 std::string testName;
156 stepper->setModel(model);
157 auto modifier = rcp(
new StepperForwardEulerModifierTest());
158 stepper->setAppAction(modifier);
159 stepper->initialize();
162 auto inArgsIC = model->getNominalValues();
164 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
166 icState->setTime(0.0);
167 icState->setIndex(0);
168 icState->setTimeStep(0.0);
169 icState->setOrder(stepper->getOrder());
174 solutionHistory->setName(
"Forward States");
176 solutionHistory->setStorageLimit(2);
177 solutionHistory->addState(icState);
180 stepper->setInitialConditions(solutionHistory);
181 solutionHistory->initWorkingState();
183 solutionHistory->getWorkingState()->setTimeStep(dt);
184 stepper->takeStep(solutionHistory);
186 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
187 TEST_COMPARE(modifier->testBEFORE_EXPLICIT_EVAL, ==,
true);
188 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
190 auto x = solutionHistory->getCurrentState()->getX();
191 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
192 x = solutionHistory->getWorkingState()->getX();
193 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
194 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
195 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
197 TEST_COMPARE(modifier->testName, ==,
"Forward Euler - Modifier");
202class StepperForwardEulerObserverTest
206 StepperForwardEulerObserverTest()
207 : testBEGIN_STEP(false),
208 testBEFORE_EXPLICIT_EVAL(false),
210 testCurrentValue(-0.99),
211 testWorkingValue(-0.99),
218 virtual ~StepperForwardEulerObserverTest() {}
221 virtual void observe(
222 Teuchos::RCP<
const Tempus::SolutionHistory<double> > sh,
223 Teuchos::RCP<
const Tempus::StepperForwardEuler<double> > stepper,
224 const typename Tempus::StepperForwardEulerAppAction<
229 testBEGIN_STEP =
true;
230 auto x = sh->getCurrentState()->getX();
231 testCurrentValue = get_ele(*(x), 0);
235 testBEFORE_EXPLICIT_EVAL =
true;
236 testDt = sh->getWorkingState()->getTimeStep();
237 testName = stepper->getStepperName();
242 auto x = sh->getWorkingState()->getX();
243 testWorkingValue = get_ele(*(x), 0);
247 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
248 "Error - unknown action location.\n");
253 bool testBEFORE_EXPLICIT_EVAL;
255 double testCurrentValue;
256 double testWorkingValue;
258 std::string testName;
267 stepper->setModel(model);
268 auto observer = rcp(
new StepperForwardEulerObserverTest());
269 stepper->setAppAction(observer);
270 stepper->initialize();
273 auto inArgsIC = model->getNominalValues();
275 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
277 icState->setTime(0.0);
278 icState->setIndex(0);
279 icState->setTimeStep(0.0);
280 icState->setOrder(stepper->getOrder());
285 solutionHistory->setName(
"Forward States");
287 solutionHistory->setStorageLimit(2);
288 solutionHistory->addState(icState);
291 stepper->setInitialConditions(solutionHistory);
292 solutionHistory->initWorkingState();
294 solutionHistory->getWorkingState()->setTimeStep(dt);
295 stepper->takeStep(solutionHistory);
297 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
298 TEST_COMPARE(observer->testBEFORE_EXPLICIT_EVAL, ==,
true);
299 TEST_COMPARE(observer->testEND_STEP, ==,
true);
301 auto x = solutionHistory->getCurrentState()->getX();
302 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
303 x = solutionHistory->getWorkingState()->getX();
304 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
305 TEST_FLOATING_EQUALITY(observer->testDt, dt, 1.0e-14);
307 TEST_COMPARE(observer->testName, ==,
"Forward Euler");
312class StepperForwardEulerModifierXTest
316 StepperForwardEulerModifierXTest()
317 : testX_BEGIN_STEP(false),
318 testX_BEFORE_EXPLICIT_EVAL(false),
319 testXDOT_END_STEP(false),
328 virtual ~StepperForwardEulerModifierXTest() {}
331 virtual void modify(Teuchos::RCP<Thyra::VectorBase<double> > x,
332 const double time,
const double dt,
333 const typename Tempus::StepperForwardEulerModifierXBase<
337 case StepperForwardEulerModifierXBase<double>::X_BEGIN_STEP: {
338 testX_BEGIN_STEP =
true;
339 testX = get_ele(*(x), 0);
342 case StepperForwardEulerModifierXBase<double>::X_BEFORE_EXPLICIT_EVAL: {
343 testX_BEFORE_EXPLICIT_EVAL =
true;
348 case StepperForwardEulerModifierXBase<double>::XDOT_END_STEP: {
349 testXDOT_END_STEP =
true;
350 testXDot = get_ele(*(x), 0);
354 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
355 "Error - unknown action location.\n");
358 bool testX_BEGIN_STEP;
359 bool testX_BEFORE_EXPLICIT_EVAL;
360 bool testXDOT_END_STEP;
373 stepper->setModel(model);
374 auto modifierX = rcp(
new StepperForwardEulerModifierXTest());
375 stepper->setAppAction(modifierX);
376 stepper->initialize();
379 auto inArgsIC = model->getNominalValues();
381 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
383 icState->setTime(0.0);
384 icState->setIndex(0);
385 icState->setTimeStep(0.0);
386 icState->setOrder(stepper->getOrder());
391 solutionHistory->setName(
"Forward States");
393 solutionHistory->setStorageLimit(2);
394 solutionHistory->addState(icState);
397 stepper->setInitialConditions(solutionHistory);
398 solutionHistory->initWorkingState();
400 solutionHistory->getWorkingState()->setTimeStep(dt);
401 stepper->takeStep(solutionHistory);
403 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
404 TEST_COMPARE(modifierX->testX_BEFORE_EXPLICIT_EVAL, ==,
true);
405 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
407 auto x = solutionHistory->getCurrentState()->getX();
408 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
410 auto xDot = solutionHistory->getWorkingState()->getXDot();
411 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
413 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0), 1.0e-14);
414 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
415 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
417 auto time = solutionHistory->getWorkingState()->getTime();
418 TEST_FLOATING_EQUALITY(modifierX->testTime, time, 1.0e-14);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
StepperForwardEulerAppAction()
Forward Euler time stepper.
Base modifier for StepperBackwardEuler.
Default modifier for StepperForwardEuler.
Base ModifierX for StepperForwardEuler.
Default ModifierX for StepperForwardEuler.
Base observer for StepperForwardEuler.
Default observer for StepperForwardEuler.
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation.
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.