16#include "../TestModels/DahlquistTestModel.hpp"
23using Teuchos::rcp_const_cast;
24using Teuchos::rcp_dynamic_cast;
117class StepperRKModifierBogackiShampineTest
123 StepperRKModifierBogackiShampineTest(Teuchos::FancyOStream &Out,
bool &Success)
124 : out(Out), success(Success)
128 virtual ~StepperRKModifierBogackiShampineTest(){}
136 const double relTol = 1.0e-14;
137 auto stageNumber = stepper->getStageNumber();
138 Teuchos::SerialDenseVector<int,double> c = stepper->getTableau()->c();
140 auto currentState = sh->getCurrentState();
141 auto workingState = sh->getWorkingState();
142 const double dt = workingState->getTimeStep();
143 double time = currentState->getTime();
144 if (stageNumber >= 0) time += c(stageNumber)*dt;
146 auto x = workingState->getX();
147 auto xDot = workingState->getXDot();
148 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
151 if (actLoc == StepperRKAppAction<double>::BEGIN_STEP) {
153 auto DME = Teuchos::rcp_dynamic_cast<
155 TEST_FLOATING_EQUALITY(DME->getLambda(), -1.0, relTol);
157 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
159 const double x_0 = get_ele(*(x), 0);
160 const double xDot_0 = get_ele(*(xDot), 0);
161 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
162 TEST_FLOATING_EQUALITY(xDot_0, -1.0, relTol);
163 TEST_ASSERT(std::abs(time) < relTol);
164 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
165 TEST_COMPARE(stageNumber, ==, -1);
167 }
else if (actLoc == StepperRKAppAction<double>::BEGIN_STAGE ||
168 actLoc == StepperRKAppAction<double>::BEFORE_SOLVE ||
169 actLoc == StepperRKAppAction<double>::AFTER_SOLVE ||
170 actLoc == StepperRKAppAction<double>::BEFORE_EXPLICIT_EVAL ||
171 actLoc == StepperRKAppAction<double>::END_STAGE) {
172 const double X_i = get_ele(*(x), 0);
173 const double f_i = get_ele(*(xDot), 0);
174 if (stageNumber == 0) {
175 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
176 TEST_ASSERT(std::abs(time) < relTol);
177 if (actLoc == StepperRKAppAction<double>::END_STAGE ||
178 !stepper->getUseFSAL()) {
179 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
181 TEST_ASSERT(std::abs(f_i) < relTol);
184 }
else if (stageNumber == 1) {
185 TEST_FLOATING_EQUALITY(X_i, 0.5, relTol);
186 TEST_FLOATING_EQUALITY(time, 0.5, relTol);
187 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
188 TEST_FLOATING_EQUALITY(f_i, -0.5, relTol);
190 TEST_ASSERT(std::abs(f_i) < relTol);
193 }
else if (stageNumber == 2) {
194 TEST_FLOATING_EQUALITY(X_i, 5.0/8.0, relTol);
195 TEST_FLOATING_EQUALITY(time, 0.75, relTol);
196 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
197 TEST_FLOATING_EQUALITY(f_i, -5.0/8.0, relTol);
199 TEST_ASSERT(std::abs(f_i) < relTol);
202 }
else if (stageNumber == 3) {
203 TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol);
204 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
205 if (actLoc == StepperRKAppAction<double>::END_STAGE) {
206 TEST_FLOATING_EQUALITY(f_i, -1.0/3.0, relTol);
207 }
else if (workingState->getNConsecutiveFailures() > 0) {
208 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
210 TEST_ASSERT(std::abs(f_i) < relTol);
214 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 4));
216 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
218 }
else if (actLoc == StepperRKAppAction<double>::END_STEP) {
219 const double x_1 = get_ele(*(x), 0);
220 time = workingState->getTime();
221 TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol);
222 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
223 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
224 TEST_COMPARE(stageNumber, ==, -1);
226 if (stepper->getUseEmbedded() ==
true) {
227 TEST_FLOATING_EQUALITY(workingState->getTolRel(), 1.0, relTol);
228 TEST_ASSERT(std::abs(workingState->getTolAbs()) < relTol);
230 TEST_ASSERT(std::abs(workingState->getErrorRel()) < relTol);
234 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
235 "Error - unknown action location.\n");
241 Teuchos::FancyOStream & out;
251 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
253 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
255 stepper->setModel(model);
256 stepper->setAppAction(modifier);
257 stepper->setICConsistency(
"Consistent");
258 stepper->setUseFSAL(
false);
259 stepper->initialize();
265 stepper->setInitialConditions(solutionHistory);
266 solutionHistory->initWorkingState();
268 solutionHistory->getWorkingState()->setTimeStep(dt);
269 solutionHistory->getWorkingState()->setTime(dt);
270 stepper->takeStep(solutionHistory);
273 TEUCHOS_ASSERT(stepper->getOrder() == 3);
282 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
284 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
286 stepper->setModel(model);
287 stepper->setAppAction(modifier);
288 stepper->setICConsistency(
"Consistent");
289 stepper->setUseFSAL(
true);
290 stepper->initialize();
296 stepper->setInitialConditions(solutionHistory);
297 solutionHistory->initWorkingState();
299 solutionHistory->getWorkingState()->setTimeStep(dt);
300 solutionHistory->getWorkingState()->setTime(dt);
301 stepper->takeStep(solutionHistory);
304 TEUCHOS_ASSERT(stepper->getOrder() == 3);
313 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
315 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
317 stepper->setModel(model);
318 stepper->setAppAction(modifier);
319 stepper->setICConsistency(
"Consistent");
320 stepper->setUseFSAL(
true);
321 stepper->initialize();
327 stepper->setInitialConditions(solutionHistory);
328 solutionHistory->initWorkingState();
330 solutionHistory->getWorkingState()->setTimeStep(dt);
331 solutionHistory->getWorkingState()->setTime(dt);
332 solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
333 stepper->takeStep(solutionHistory);
336 TEUCHOS_ASSERT(stepper->getOrder() == 3);
345 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
347 auto modifier = rcp(
new StepperRKModifierBogackiShampineTest(out, success));
349 stepper->setModel(model);
350 stepper->setAppAction(modifier);
351 stepper->setICConsistency(
"Consistent");
352 stepper->setUseFSAL(
false);
353 stepper->setUseEmbedded(
true);
354 stepper->initialize();
360 stepper->setInitialConditions(solutionHistory);
361 solutionHistory->initWorkingState();
363 solutionHistory->getWorkingState()->setTimeStep(dt);
364 solutionHistory->getWorkingState()->setTime(dt);
365 solutionHistory->getWorkingState()->setTolRel(1.0);
366 solutionHistory->getWorkingState()->setTolAbs(0.0);
367 stepper->takeStep(solutionHistory);
370 TEUCHOS_ASSERT(stepper->getOrder() == 3);
380class StepperRKModifierXBogackiShampineTest
386 StepperRKModifierXBogackiShampineTest(Teuchos::FancyOStream &Out,
bool &Success)
387 : out(Out), success(Success)
391 virtual ~StepperRKModifierXBogackiShampineTest(){}
396 const double time,
const double dt,
const int stageNumber,
399 const double relTol = 1.0e-14;
400 if (modType == StepperRKModifierXBase<double>::X_BEGIN_STEP) {
401 const double x_0 = get_ele(*(x), 0);
402 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
403 TEST_FLOATING_EQUALITY(time, 0.0, relTol);
404 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
405 TEST_COMPARE(stageNumber, ==, -1);
407 }
else if (modType == StepperRKModifierXBase<double>::X_BEGIN_STAGE ||
408 modType == StepperRKModifierXBase<double>::X_BEFORE_SOLVE ||
409 modType == StepperRKModifierXBase<double>::X_AFTER_SOLVE ||
410 modType == StepperRKModifierXBase<double>::X_BEFORE_EXPLICIT_EVAL ||
411 modType == StepperRKModifierXBase<double>::X_END_STAGE) {
412 const double X_i = get_ele(*(x), 0);
413 if (stageNumber == 0) {
414 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
415 TEST_FLOATING_EQUALITY(time, 0.0, relTol);
416 }
else if (stageNumber == 1) {
417 TEST_FLOATING_EQUALITY(X_i, 0.5, relTol);
418 TEST_FLOATING_EQUALITY(time, 0.5, relTol);
419 }
else if (stageNumber == 2) {
420 TEST_FLOATING_EQUALITY(X_i, 5.0/8.0, relTol);
421 TEST_FLOATING_EQUALITY(time, 0.75, relTol);
422 }
else if (stageNumber == 3) {
423 TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol);
424 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
426 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 4));
428 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
430 }
else if (modType == StepperRKModifierXBase<double>::X_END_STEP) {
431 const double x_1 = get_ele(*(x), 0);
432 TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol);
433 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
434 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
435 TEST_COMPARE(stageNumber, ==, -1);
438 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
439 "Error - unknown action location.\n");
445 Teuchos::FancyOStream & out;
455 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
457 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
459 stepper->setModel(model);
460 stepper->setAppAction(modifierX);
461 stepper->setICConsistency(
"Consistent");
462 stepper->setUseFSAL(
false);
463 stepper->initialize();
469 stepper->setInitialConditions(solutionHistory);
470 solutionHistory->initWorkingState();
472 solutionHistory->getWorkingState()->setTimeStep(dt);
473 solutionHistory->getWorkingState()->setTime(dt);
474 stepper->takeStep(solutionHistory);
477 TEUCHOS_ASSERT(stepper->getOrder() == 3);
486 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
488 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
490 stepper->setModel(model);
491 stepper->setAppAction(modifierX);
492 stepper->setICConsistency(
"Consistent");
493 stepper->setUseFSAL(
true);
494 stepper->initialize();
500 stepper->setInitialConditions(solutionHistory);
501 solutionHistory->initWorkingState();
503 solutionHistory->getWorkingState()->setTimeStep(dt);
504 solutionHistory->getWorkingState()->setTime(dt);
505 stepper->takeStep(solutionHistory);
508 TEUCHOS_ASSERT(stepper->getOrder() == 3);
517 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
519 auto modifierX = rcp(
new StepperRKModifierXBogackiShampineTest(out, success));
521 stepper->setModel(model);
522 stepper->setAppAction(modifierX);
523 stepper->setICConsistency(
"Consistent");
524 stepper->setUseFSAL(
true);
525 stepper->initialize();
531 stepper->setInitialConditions(solutionHistory);
532 solutionHistory->initWorkingState();
534 solutionHistory->getWorkingState()->setTimeStep(dt);
535 solutionHistory->getWorkingState()->setTime(dt);
536 solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
537 stepper->takeStep(solutionHistory);
540 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.