17#include "../TestModels/DahlquistTestModel.hpp"
23using Teuchos::rcp_const_cast;
24using Teuchos::rcp_dynamic_cast;
118class StepperRKModifierBogackiShampineTest
122 StepperRKModifierBogackiShampineTest(Teuchos::FancyOStream &Out,
124 : out(Out), success(Success)
129 virtual ~StepperRKModifierBogackiShampineTest() {}
137 const double relTol = 1.0e-14;
138 auto stageNumber = stepper->getStageNumber();
139 Teuchos::SerialDenseVector<int, double> c = stepper->getTableau()->c();
141 auto currentState = sh->getCurrentState();
142 auto workingState = sh->getWorkingState();
143 const double dt = workingState->getTimeStep();
144 double time = currentState->getTime();
145 if (stageNumber >= 0) time += c(stageNumber) * dt;
147 auto x = workingState->getX();
148 auto xDot = workingState->getXDot();
149 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
151 if (actLoc == StepperRKAppAction<double>::BEGIN_STEP) {
153 auto DME = Teuchos::rcp_dynamic_cast<
155 stepper->getModel());
156 TEST_FLOATING_EQUALITY(DME->getLambda(), -1.0, relTol);
158 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
160 const double x_0 = get_ele(*(x), 0);
161 const double xDot_0 = get_ele(*(xDot), 0);
162 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
163 TEST_FLOATING_EQUALITY(xDot_0, -1.0, relTol);
164 TEST_ASSERT(std::abs(time) < relTol);
165 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
166 TEST_COMPARE(stageNumber, ==, -1);
168 else if (actLoc == StepperRKAppAction<double>::BEGIN_STAGE ||
169 actLoc == StepperRKAppAction<double>::BEFORE_SOLVE ||
170 actLoc == StepperRKAppAction<double>::AFTER_SOLVE ||
171 actLoc == StepperRKAppAction<double>::BEFORE_EXPLICIT_EVAL ||
172 actLoc == StepperRKAppAction<double>::END_STAGE) {
173 const double X_i = get_ele(*(x), 0);
174 const double f_i = get_ele(*(xDot), 0);
175 if (stageNumber == 0) {
176 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
177 TEST_ASSERT(std::abs(time) < relTol);
178 if (actLoc == StepperRKAppAction<double>::END_STAGE ||
179 !stepper->getUseFSAL()) {
180 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
183 TEST_ASSERT(std::abs(f_i) < relTol);
186 else if (stageNumber == 1) {
187 TEST_FLOATING_EQUALITY(X_i, 0.5, relTol);
188 TEST_FLOATING_EQUALITY(time, 0.5, relTol);
189 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
190 TEST_FLOATING_EQUALITY(f_i, -0.5, relTol);
193 TEST_ASSERT(std::abs(f_i) < relTol);
196 else if (stageNumber == 2) {
197 TEST_FLOATING_EQUALITY(X_i, 5.0 / 8.0, relTol);
198 TEST_FLOATING_EQUALITY(time, 0.75, relTol);
199 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
200 TEST_FLOATING_EQUALITY(f_i, -5.0 / 8.0,
204 TEST_ASSERT(std::abs(f_i) < relTol);
207 else if (stageNumber == 3) {
208 TEST_FLOATING_EQUALITY(X_i, 1.0 / 3.0, relTol);
209 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
210 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
211 TEST_FLOATING_EQUALITY(f_i, -1.0 / 3.0,
214 else if (workingState->getNConsecutiveFailures() > 0) {
215 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
218 TEST_ASSERT(std::abs(f_i) < relTol);
222 TEUCHOS_TEST_FOR_EXCEPT(!(-1 < stageNumber && stageNumber < 4));
224 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
226 else if (actLoc == StepperRKAppAction<double>::END_STEP) {
227 const double x_1 = get_ele(*(x), 0);
228 time = workingState->getTime();
229 TEST_FLOATING_EQUALITY(x_1, 1.0 / 3.0, relTol);
230 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
231 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
232 TEST_COMPARE(stageNumber, ==, -1);
234 if (stepper->getUseEmbedded() ==
true) {
235 TEST_FLOATING_EQUALITY(workingState->getTolRel(), 1.0, relTol);
236 TEST_ASSERT(std::abs(workingState->getTolAbs()) < relTol);
238 TEST_ASSERT(std::abs(workingState->getErrorRel()) < relTol);
242 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
243 "Error - unknown action location.\n");
248 Teuchos::FancyOStream &out;
257 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
259 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
261 stepper->setModel(model);
262 stepper->setAppAction(modifier);
263 stepper->setICConsistency(
"Consistent");
264 stepper->setUseFSAL(
false);
265 stepper->initialize();
271 stepper->setInitialConditions(solutionHistory);
272 solutionHistory->initWorkingState();
274 solutionHistory->getWorkingState()->setTimeStep(dt);
275 solutionHistory->getWorkingState()->setTime(dt);
276 stepper->takeStep(solutionHistory);
279 TEUCHOS_ASSERT(stepper->getOrder() == 3);
287 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
289 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
291 stepper->setModel(model);
292 stepper->setAppAction(modifier);
293 stepper->setICConsistency(
"Consistent");
294 stepper->setUseFSAL(
true);
295 stepper->initialize();
301 stepper->setInitialConditions(solutionHistory);
302 solutionHistory->initWorkingState();
304 solutionHistory->getWorkingState()->setTimeStep(dt);
305 solutionHistory->getWorkingState()->setTime(dt);
306 stepper->takeStep(solutionHistory);
309 TEUCHOS_ASSERT(stepper->getOrder() == 3);
317 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
319 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
321 stepper->setModel(model);
322 stepper->setAppAction(modifier);
323 stepper->setICConsistency(
"Consistent");
324 stepper->setUseFSAL(
true);
325 stepper->initialize();
331 stepper->setInitialConditions(solutionHistory);
332 solutionHistory->initWorkingState();
334 solutionHistory->getWorkingState()->setTimeStep(dt);
335 solutionHistory->getWorkingState()->setTime(dt);
336 solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
337 stepper->takeStep(solutionHistory);
340 TEUCHOS_ASSERT(stepper->getOrder() == 3);
348 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
350 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
352 stepper->setModel(model);
353 stepper->setAppAction(modifier);
354 stepper->setICConsistency(
"Consistent");
355 stepper->setUseFSAL(
false);
356 stepper->setUseEmbedded(
true);
357 stepper->initialize();
363 stepper->setInitialConditions(solutionHistory);
364 solutionHistory->initWorkingState();
366 solutionHistory->getWorkingState()->setTimeStep(dt);
367 solutionHistory->getWorkingState()->setTime(dt);
368 solutionHistory->getWorkingState()->setTolRel(1.0);
369 solutionHistory->getWorkingState()->setTolAbs(0.0);
370 stepper->takeStep(solutionHistory);
373 TEUCHOS_ASSERT(stepper->getOrder() == 3);
383class StepperRKModifierXBogackiShampineTest
387 StepperRKModifierXBogackiShampineTest(Teuchos::FancyOStream &Out,
389 : out(Out), success(Success)
394 virtual ~StepperRKModifierXBogackiShampineTest() {}
399 const double dt,
const int stageNumber,
403 const double relTol = 1.0e-14;
404 if (modType == StepperRKModifierXBase<double>::X_BEGIN_STEP) {
405 const double x_0 = get_ele(*(x), 0);
406 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
407 TEST_FLOATING_EQUALITY(time, 0.0, relTol);
408 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
409 TEST_COMPARE(stageNumber, ==, -1);
411 else if (modType == StepperRKModifierXBase<double>::X_BEGIN_STAGE ||
412 modType == StepperRKModifierXBase<double>::X_BEFORE_SOLVE ||
413 modType == StepperRKModifierXBase<double>::X_AFTER_SOLVE ||
415 StepperRKModifierXBase<double>::X_BEFORE_EXPLICIT_EVAL ||
416 modType == StepperRKModifierXBase<double>::X_END_STAGE) {
417 const double X_i = get_ele(*(x), 0);
418 if (stageNumber == 0) {
419 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
420 TEST_FLOATING_EQUALITY(time, 0.0, relTol);
422 else if (stageNumber == 1) {
423 TEST_FLOATING_EQUALITY(X_i, 0.5, relTol);
424 TEST_FLOATING_EQUALITY(time, 0.5, relTol);
426 else if (stageNumber == 2) {
427 TEST_FLOATING_EQUALITY(X_i, 5.0 / 8.0, relTol);
428 TEST_FLOATING_EQUALITY(time, 0.75, relTol);
430 else if (stageNumber == 3) {
431 TEST_FLOATING_EQUALITY(X_i, 1.0 / 3.0, relTol);
432 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
435 TEUCHOS_TEST_FOR_EXCEPT(!(-1 < stageNumber && stageNumber < 4));
437 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
439 else if (modType == StepperRKModifierXBase<double>::X_END_STEP) {
440 const double x_1 = get_ele(*(x), 0);
441 TEST_FLOATING_EQUALITY(x_1, 1.0 / 3.0, relTol);
442 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
443 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
444 TEST_COMPARE(stageNumber, ==, -1);
447 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
448 "Error - unknown action location.\n");
453 Teuchos::FancyOStream &out;
462 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
464 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
466 stepper->setModel(model);
467 stepper->setAppAction(modifierX);
468 stepper->setICConsistency(
"Consistent");
469 stepper->setUseFSAL(
false);
470 stepper->initialize();
476 stepper->setInitialConditions(solutionHistory);
477 solutionHistory->initWorkingState();
479 solutionHistory->getWorkingState()->setTimeStep(dt);
480 solutionHistory->getWorkingState()->setTime(dt);
481 stepper->takeStep(solutionHistory);
484 TEUCHOS_ASSERT(stepper->getOrder() == 3);
492 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
494 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
496 stepper->setModel(model);
497 stepper->setAppAction(modifierX);
498 stepper->setICConsistency(
"Consistent");
499 stepper->setUseFSAL(
true);
500 stepper->initialize();
506 stepper->setInitialConditions(solutionHistory);
507 solutionHistory->initWorkingState();
509 solutionHistory->getWorkingState()->setTimeStep(dt);
510 solutionHistory->getWorkingState()->setTime(dt);
511 stepper->takeStep(solutionHistory);
514 TEUCHOS_ASSERT(stepper->getOrder() == 3);
522 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
524 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
526 stepper->setModel(model);
527 stepper->setAppAction(modifierX);
528 stepper->setICConsistency(
"Consistent");
529 stepper->setUseFSAL(
true);
530 stepper->initialize();
536 stepper->setInitialConditions(solutionHistory);
537 solutionHistory->initWorkingState();
539 solutionHistory->getWorkingState()->setTimeStep(dt);
540 solutionHistory->getWorkingState()->setTime(dt);
541 solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
542 stepper->takeStep(solutionHistory);
545 TEUCHOS_ASSERT(stepper->getOrder() == 3);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Explicit RK Bogacki-Shampine Butcher Tableau.
ACTION_LOCATION
Indicates the location of application action (see algorithm).
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
Base modifier for StepperRK.
Base ModifierX for StepperRK.
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > >, const double, const double, const int, const MODIFIER_TYPE modType)=0
Modify solution based on the MODIFIER_TYPE.
The classic Dahlquist Test Problem.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryME(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Nonmember contructor from a Thyra ModelEvaluator.