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.