Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_UnitTest_ERK.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
10 
11 #include "../TestModels/DahlquistTestModel.hpp"
12 
13 #include "Tempus_SolutionHistory.hpp"
15 #include "Tempus_StepperRKBase.hpp"
18 
19 
20 namespace Tempus_Unit_Test {
21 
22 using Teuchos::RCP;
23 using Teuchos::rcp;
24 using Teuchos::rcp_const_cast;
25 using Teuchos::rcp_dynamic_cast;
26 
27 
118 class StepperRKModifierBogackiShampineTest
119  : virtual public Tempus::StepperRKModifierBase<double>
120 {
121 public:
122 
124  StepperRKModifierBogackiShampineTest(Teuchos::FancyOStream &Out, bool &Success)
125  : out(Out), success(Success)
126  {}
127 
129  virtual ~StepperRKModifierBogackiShampineTest(){}
130 
132  virtual void modify(
136  {
137  const double relTol = 1.0e-14;
138  auto stageNumber = stepper->getStageNumber();
139  Teuchos::SerialDenseVector<int,double> c = stepper->getTableau()->c();
140 
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;
146 
147  auto x = workingState->getX();
148  auto xDot = workingState->getXDot();
149  if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
150 
151 
153  {
154  auto DME = Teuchos::rcp_dynamic_cast<
155  const Tempus_Test::DahlquistTestModel<double> > (stepper->getModel());
156  TEST_FLOATING_EQUALITY(DME->getLambda(), -1.0, relTol);
157  }
158  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
159 
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); // Should be x_0
163  TEST_FLOATING_EQUALITY(xDot_0, -1.0, relTol); // Should be xDot_0
164  TEST_ASSERT(std::abs(time) < relTol);
165  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
166  TEST_COMPARE(stageNumber, ==, -1);
167 
168  } else if (actLoc == StepperRKAppAction<double>::BEGIN_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); // Should be X_1
177  TEST_ASSERT(std::abs(time) < relTol);
179  !stepper->getUseFSAL()) {
180  TEST_FLOATING_EQUALITY(f_i, -1.0, relTol); // Should be \bar{f}_1
181  } else {
182  TEST_ASSERT(std::abs(f_i) < relTol); // Not set yet.
183  }
184 
185  } else if (stageNumber == 1) {
186  TEST_FLOATING_EQUALITY(X_i, 0.5, relTol); // Should be X_2
187  TEST_FLOATING_EQUALITY(time, 0.5, relTol);
189  TEST_FLOATING_EQUALITY(f_i, -0.5, relTol); // Should be \bar{f}_2
190  } else {
191  TEST_ASSERT(std::abs(f_i) < relTol); // Not set yet.
192  }
193 
194  } else if (stageNumber == 2) {
195  TEST_FLOATING_EQUALITY(X_i, 5.0/8.0, relTol); // Should be X_3
196  TEST_FLOATING_EQUALITY(time, 0.75, relTol);
198  TEST_FLOATING_EQUALITY(f_i, -5.0/8.0, relTol); // Should be \bar{f}_3
199  } else {
200  TEST_ASSERT(std::abs(f_i) < relTol); // Not set yet.
201  }
202 
203  } else if (stageNumber == 3) {
204  TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol); // Should be X_4
205  TEST_FLOATING_EQUALITY(time, 1.0, relTol);
207  TEST_FLOATING_EQUALITY(f_i, -1.0/3.0, relTol); // Should be \bar{f}_4
208  } else if (workingState->getNConsecutiveFailures() > 0) {
209  TEST_FLOATING_EQUALITY(f_i, -1.0, relTol); // From IC and FSAL swap.
210  } else {
211  TEST_ASSERT(std::abs(f_i) < relTol); // Not set yet.
212  }
213 
214  } else {
215  TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 4));
216  }
217  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
218 
219  } else if (actLoc == StepperRKAppAction<double>::END_STEP) {
220  const double x_1 = get_ele(*(x), 0);
221  time = workingState->getTime();
222  TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol); // Should be x_1
223  TEST_FLOATING_EQUALITY(time, 1.0, relTol);
224  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
225  TEST_COMPARE(stageNumber, ==, -1);
226 
227  if (stepper->getUseEmbedded() == true) {
228  TEST_FLOATING_EQUALITY(workingState->getTolRel(), 1.0, relTol);
229  TEST_ASSERT(std::abs(workingState->getTolAbs()) < relTol);
230  // e = 0 from doxygen above.
231  TEST_ASSERT(std::abs(workingState->getErrorRel()) < relTol);
232  }
233 
234  } else {
235  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
236  "Error - unknown action location.\n");
237  }
238  }
239 
240 private:
241 
242  Teuchos::FancyOStream & out;
243  bool & success;
244 };
245 
246 
247 // ************************************************************
248 // ************************************************************
249 TEUCHOS_UNIT_TEST(ERK, Modifier)
250 {
254  auto modifier = rcp(new StepperRKModifierBogackiShampineTest(out, success));
255 
256  stepper->setModel(model);
257  stepper->setAppAction(modifier);
258  stepper->setICConsistency("Consistent");
259  stepper->setUseFSAL(false);
260  stepper->initialize();
261 
262  // Create a SolutionHistory.
263  auto solutionHistory = Tempus::createSolutionHistoryME(model);
264 
265  // Take one time step.
266  stepper->setInitialConditions(solutionHistory);
267  solutionHistory->initWorkingState();
268  double dt = 1.0;
269  solutionHistory->getWorkingState()->setTimeStep(dt);
270  solutionHistory->getWorkingState()->setTime(dt);
271  stepper->takeStep(solutionHistory); // Primary testing occurs in
272  // modifierX during takeStep().
273  // Test stepper properties.
274  TEUCHOS_ASSERT(stepper->getOrder() == 3);
275 }
276 
277 
278 // ************************************************************
279 // ************************************************************
280 TEUCHOS_UNIT_TEST(ERK, Modifier_FSAL)
281 {
285  auto modifier = rcp(new StepperRKModifierBogackiShampineTest(out, success));
286 
287  stepper->setModel(model);
288  stepper->setAppAction(modifier);
289  stepper->setICConsistency("Consistent");
290  stepper->setUseFSAL(true);
291  stepper->initialize();
292 
293  // Create a SolutionHistory.
294  auto solutionHistory = Tempus::createSolutionHistoryME(model);
295 
296  // Take one time step.
297  stepper->setInitialConditions(solutionHistory);
298  solutionHistory->initWorkingState();
299  double dt = 1.0;
300  solutionHistory->getWorkingState()->setTimeStep(dt);
301  solutionHistory->getWorkingState()->setTime(dt);
302  stepper->takeStep(solutionHistory); // Primary testing occurs in
303  // modifierX during takeStep().
304  // Test stepper properties.
305  TEUCHOS_ASSERT(stepper->getOrder() == 3);
306 }
307 
308 
309 // ************************************************************
310 // ************************************************************
311 TEUCHOS_UNIT_TEST(ERK, Modifier_FSAL_Failure)
312 {
316  auto modifier = rcp(new StepperRKModifierBogackiShampineTest(out, success));
317 
318  stepper->setModel(model);
319  stepper->setAppAction(modifier);
320  stepper->setICConsistency("Consistent");
321  stepper->setUseFSAL(true);
322  stepper->initialize();
323 
324  // Create a SolutionHistory.
325  auto solutionHistory = Tempus::createSolutionHistoryME(model);
326 
327  // Take one time step.
328  stepper->setInitialConditions(solutionHistory);
329  solutionHistory->initWorkingState();
330  double dt = 1.0;
331  solutionHistory->getWorkingState()->setTimeStep(dt);
332  solutionHistory->getWorkingState()->setTime(dt);
333  solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
334  stepper->takeStep(solutionHistory); // Primary testing occurs in
335  // modifierX during takeStep().
336  // Test stepper properties.
337  TEUCHOS_ASSERT(stepper->getOrder() == 3);
338 }
339 
340 
341 // ************************************************************
342 // ************************************************************
343 TEUCHOS_UNIT_TEST(ERK, Modifier_Embedded)
344 {
348  auto modifier = rcp(new StepperRKModifierBogackiShampineTest(out, success));
349 
350  stepper->setModel(model);
351  stepper->setAppAction(modifier);
352  stepper->setICConsistency("Consistent");
353  stepper->setUseFSAL(false);
354  stepper->setUseEmbedded(true);
355  stepper->initialize();
356 
357  // Create a SolutionHistory.
358  auto solutionHistory = Tempus::createSolutionHistoryME(model);
359 
360  // Take one time step.
361  stepper->setInitialConditions(solutionHistory);
362  solutionHistory->initWorkingState();
363  double dt = 1.0;
364  solutionHistory->getWorkingState()->setTimeStep(dt);
365  solutionHistory->getWorkingState()->setTime(dt);
366  solutionHistory->getWorkingState()->setTolRel(1.0);
367  solutionHistory->getWorkingState()->setTolAbs(0.0);
368  stepper->takeStep(solutionHistory); // Primary testing occurs in
369  // modifierX during takeStep().
370  // Test stepper properties.
371  TEUCHOS_ASSERT(stepper->getOrder() == 3);
372 }
373 
374 
381 class StepperRKModifierXBogackiShampineTest
382  : virtual public Tempus::StepperRKModifierXBase<double>
383 {
384 public:
385 
387  StepperRKModifierXBogackiShampineTest(Teuchos::FancyOStream &Out, bool &Success)
388  : out(Out), success(Success)
389  {}
390 
392  virtual ~StepperRKModifierXBogackiShampineTest(){}
393 
395  virtual void modify(
397  const double time, const double dt, const int stageNumber,
399  {
400  const double relTol = 1.0e-14;
402  const double x_0 = get_ele(*(x), 0); // Should be x_0
403  TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
404  TEST_FLOATING_EQUALITY(time, 0.0, relTol);
405  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
406  TEST_COMPARE(stageNumber, ==, -1);
407 
408  } else if (modType == StepperRKModifierXBase<double>::X_BEGIN_STAGE ||
413  const double X_i = get_ele(*(x), 0);
414  if (stageNumber == 0) {
415  TEST_FLOATING_EQUALITY(X_i, 1.0, relTol); // Should be X_1
416  TEST_FLOATING_EQUALITY(time, 0.0, relTol);
417  } else if (stageNumber == 1) {
418  TEST_FLOATING_EQUALITY(X_i, 0.5, relTol); // Should be X_2
419  TEST_FLOATING_EQUALITY(time, 0.5, relTol);
420  } else if (stageNumber == 2) {
421  TEST_FLOATING_EQUALITY(X_i, 5.0/8.0, relTol); // Should be X_3
422  TEST_FLOATING_EQUALITY(time, 0.75, relTol);
423  } else if (stageNumber == 3) {
424  TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol); // Should be X_4
425  TEST_FLOATING_EQUALITY(time, 1.0, relTol);
426  } else {
427  TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 4));
428  }
429  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
430 
431  } else if (modType == StepperRKModifierXBase<double>::X_END_STEP) {
432  const double x_1 = get_ele(*(x), 0);
433  TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol); // Should be x_1
434  TEST_FLOATING_EQUALITY(time, 1.0, relTol);
435  TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
436  TEST_COMPARE(stageNumber, ==, -1);
437 
438  } else {
439  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
440  "Error - unknown action location.\n");
441  }
442  }
443 
444 private:
445 
446  Teuchos::FancyOStream & out;
447  bool & success;
448 };
449 
450 
451 // ************************************************************
452 // ************************************************************
453 TEUCHOS_UNIT_TEST(ERK, ModifierX)
454 {
458  auto modifierX = rcp(new StepperRKModifierXBogackiShampineTest(out, success));
459 
460  stepper->setModel(model);
461  stepper->setAppAction(modifierX);
462  stepper->setICConsistency("Consistent");
463  stepper->setUseFSAL(false);
464  stepper->initialize();
465 
466  // Create a SolutionHistory.
467  auto solutionHistory = Tempus::createSolutionHistoryME(model);
468 
469  // Take one time step.
470  stepper->setInitialConditions(solutionHistory);
471  solutionHistory->initWorkingState();
472  double dt = 1.0;
473  solutionHistory->getWorkingState()->setTimeStep(dt);
474  solutionHistory->getWorkingState()->setTime(dt);
475  stepper->takeStep(solutionHistory); // Primary testing occurs in
476  // modifierX during takeStep().
477  // Test stepper properties.
478  TEUCHOS_ASSERT(stepper->getOrder() == 3);
479 }
480 
481 
482 // ************************************************************
483 // ************************************************************
484 TEUCHOS_UNIT_TEST(ERK, ModifierX_FSAL)
485 {
489  auto modifierX = rcp(new StepperRKModifierXBogackiShampineTest(out, success));
490 
491  stepper->setModel(model);
492  stepper->setAppAction(modifierX);
493  stepper->setICConsistency("Consistent");
494  stepper->setUseFSAL(true);
495  stepper->initialize();
496 
497  // Create a SolutionHistory.
498  auto solutionHistory = Tempus::createSolutionHistoryME(model);
499 
500  // Take one time step.
501  stepper->setInitialConditions(solutionHistory);
502  solutionHistory->initWorkingState();
503  double dt = 1.0;
504  solutionHistory->getWorkingState()->setTimeStep(dt);
505  solutionHistory->getWorkingState()->setTime(dt);
506  stepper->takeStep(solutionHistory); // Primary testing occurs in
507  // modifierX during takeStep().
508  // Test stepper properties.
509  TEUCHOS_ASSERT(stepper->getOrder() == 3);
510 }
511 
512 
513 // ************************************************************
514 // ************************************************************
515 TEUCHOS_UNIT_TEST(ERK, ModifierX_FSAL_Failure)
516 {
520  auto modifierX = rcp(new StepperRKModifierXBogackiShampineTest(out, success));
521 
522  stepper->setModel(model);
523  stepper->setAppAction(modifierX);
524  stepper->setICConsistency("Consistent");
525  stepper->setUseFSAL(true);
526  stepper->initialize();
527 
528  // Create a SolutionHistory.
529  auto solutionHistory = Tempus::createSolutionHistoryME(model);
530 
531  // Take one time step.
532  stepper->setInitialConditions(solutionHistory);
533  solutionHistory->initWorkingState();
534  double dt = 1.0;
535  solutionHistory->getWorkingState()->setTimeStep(dt);
536  solutionHistory->getWorkingState()->setTime(dt);
537  solutionHistory->getWorkingState()->setNConsecutiveFailures(1);
538  stepper->takeStep(solutionHistory); // Primary testing occurs in
539  // modifierX during takeStep().
540  // Test stepper properties.
541  TEUCHOS_ASSERT(stepper->getOrder() == 3);
542 }
543 
544 
545 } // namespace Tempus_Test
The classic Dahlquist Test Problem.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEST_COMPARE(v1, comp, v2)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
#define TEST_ASSERT(v1)
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryME(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Nonmember contructor from a Thyra ModelEvaluator.
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Explicit RK Bogacki-Shampine Butcher Tableau.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
ACTION_LOCATION
Indicates the location of application action (see algorithm).
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
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.