13#include "Tempus_StepperForwardEuler.hpp" 
   23using Teuchos::ParameterList;
 
   26using Teuchos::rcp_const_cast;
 
   27using Teuchos::rcp_dynamic_cast;
 
   28using Teuchos::sublist;
 
   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() {}
 
  116      case StepperForwardEulerAppAction<double>::BEGIN_STEP: {
 
  117        testBEGIN_STEP   = 
true;
 
  118        auto x           = sh->getCurrentState()->getX();
 
  119        testCurrentValue = get_ele(*(x), 0);
 
  122      case StepperForwardEulerAppAction<double>::BEFORE_EXPLICIT_EVAL: {
 
  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);
 
  130      case StepperForwardEulerAppAction<double>::END_STEP: {
 
  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(
 
  228      case StepperForwardEulerAppAction<double>::BEGIN_STEP: {
 
  229        testBEGIN_STEP   = 
true;
 
  230        auto x           = sh->getCurrentState()->getX();
 
  231        testCurrentValue = get_ele(*(x), 0);
 
  234      case StepperForwardEulerAppAction<double>::BEFORE_EXPLICIT_EVAL: {
 
  235        testBEFORE_EXPLICIT_EVAL = 
true;
 
  236        testDt                   = sh->getWorkingState()->getTimeStep();
 
  237        testName                 = stepper->getStepperName();
 
  240      case StepperForwardEulerAppAction<double>::END_STEP: {
 
  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() {}
 
  332                      const double time, 
const double dt,
 
  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...
 
Explicit Runge-Kutta time stepper.
 
Application Action for StepperForwardEuler.
 
ACTION_LOCATION
Indicates the location of application action (see algorithm).
 
Base modifier for StepperBackwardEuler.
 
Default modifier for StepperForwardEuler.
 
Base ModifierX for StepperForwardEuler.
 
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > >, const double, const double, const MODIFIER_TYPE modType)=0
Modify solution based on the MODIFIER_TYPE.
 
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
 
Default ModifierX for StepperForwardEuler.
 
Base observer for StepperForwardEuler.
 
Default observer for StepperForwardEuler.
 
Forward Euler time stepper.
 
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.