12#include "Teuchos_XMLParameterListHelpers.hpp" 
   16#include "Tempus_StepperForwardEuler.hpp" 
   17#include "Tempus_StepperBackwardEuler.hpp" 
   19#include "Tempus_StepperOperatorSplit.hpp" 
   27#include "../TestModels/VanDerPol_IMEX_ExplicitModel.hpp" 
   28#include "../TestModels/VanDerPol_IMEX_ImplicitModel.hpp" 
   32using Teuchos::ParameterList;
 
   35using Teuchos::rcp_const_cast;
 
   36using Teuchos::rcp_dynamic_cast;
 
   37using Teuchos::sublist;
 
   45  RCP<const Thyra::ModelEvaluator<double> > explicitModel =
 
   47  RCP<const Thyra::ModelEvaluator<double> > implicitModel =
 
   56  stepper->addStepper(subStepper1);
 
   57  stepper->addStepper(subStepper2);
 
   58  stepper->initialize();
 
   59  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   68  bool useFSAL              = stepper->getUseFSAL();
 
   69  std::string ICConsistency = stepper->getICConsistency();
 
   70  bool ICConsistencyCheck   = stepper->getICConsistencyCheck();
 
   74  stepper->setAppAction(modifier);
 
   75  stepper->initialize();
 
   76  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   77  stepper->setAppAction(modifierX);
 
   78  stepper->initialize();
 
   79  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   80  stepper->setAppAction(observer);
 
   81  stepper->initialize();
 
   82  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   83  stepper->setUseFSAL(useFSAL);
 
   84  stepper->initialize();
 
   85  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   86  stepper->setICConsistency(ICConsistency);
 
   87  stepper->initialize();
 
   88  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   89  stepper->setICConsistencyCheck(ICConsistencyCheck);
 
   90  stepper->initialize();
 
   91  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   92  stepper->setOrder(order);
 
   93  stepper->initialize();
 
   94  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   95  stepper->setOrderMin(order);
 
   96  stepper->initialize();
 
   97  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
   98  stepper->setOrderMax(order);
 
   99  stepper->initialize();
 
  100  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
  103  std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
 
  104  models.push_back(explicitModel);
 
  105  models.push_back(implicitModel);
 
  107  std::vector<Teuchos::RCP<Tempus::Stepper<double> > > subStepperList;
 
  108  subStepperList.push_back(subStepper1);
 
  109  subStepperList.push_back(subStepper2);
 
  112      models, subStepperList, useFSAL, ICConsistency, ICConsistencyCheck, order,
 
  113      order, order, modifier));
 
  115  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
  118  TEUCHOS_ASSERT(stepper->getOrder() == 1);
 
 
  126  auto pList = Teuchos::getParametersFromXmlFile(
 
  127      "../test/OperatorSplit/Tempus_OperatorSplit_VanDerPol.xml");
 
  128  auto tempusPL  = sublist(pList, 
"Tempus", 
true);
 
  129  auto stepperPL = sublist(tempusPL, 
"Demo Stepper", 
true);
 
  135  std::vector<RCP<const Thyra::ModelEvaluator<double> > > models;
 
  136  models.push_back(explicitModel);
 
  137  models.push_back(implicitModel);
 
  143  auto stepper = sf->createStepper(stepperPL, models);
 
  144  TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
 
 
  149class StepperOperatorSplitModifierTest
 
  153  StepperOperatorSplitModifierTest()
 
  154    : testBEGIN_STEP(false),
 
  156      testCurrentValue(-0.99),
 
  157      testWorkingValue(-0.99),
 
  164  virtual ~StepperOperatorSplitModifierTest() {}
 
  174      case StepperOperatorSplitAppAction<double>::BEGIN_STEP: {
 
  175        testBEGIN_STEP   = 
true;
 
  176        auto x           = sh->getCurrentState()->getX();
 
  177        testCurrentValue = get_ele(*(x), 0);
 
  180      case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER: {
 
  181        testBEFORE_STEPPER = 
true;
 
  182        testDt             = sh->getWorkingState()->getTimeStep() / 10.0;
 
  183        sh->getWorkingState()->setTimeStep(testDt);
 
  186      case StepperOperatorSplitAppAction<double>::AFTER_STEPPER: {
 
  187        testAFTER_STEPPER = 
true;
 
  188        testName          = 
"OperatorSplit - Modifier";
 
  189        stepper->setStepperName(testName);
 
  192      case StepperOperatorSplitAppAction<double>::END_STEP: {
 
  194        auto x           = sh->getWorkingState()->getX();
 
  195        testWorkingValue = get_ele(*(x), 0);
 
  199        TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
 
  200                                   "Error - unknown action location.\n");
 
  205  bool testBEFORE_STEPPER;
 
  206  bool testAFTER_STEPPER;
 
  208  double testCurrentValue;
 
  209  double testWorkingValue;
 
  211  std::string testName;
 
  216  RCP<const Thyra::ModelEvaluator<double> > explicitModel =
 
  218  RCP<const Thyra::ModelEvaluator<double> > implicitModel =
 
  226  auto modifier = rcp(
new StepperOperatorSplitModifierTest());
 
  227  stepper->setAppAction(modifier);
 
  228  stepper->addStepper(subStepper1);
 
  229  stepper->addStepper(subStepper2);
 
  230  stepper->initialize();
 
  233  auto inArgsIC = stepper->getModel()->getNominalValues();
 
  234  auto icX      = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
 
  236      rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
 
  238  icState->setTime(0.0);
 
  239  icState->setIndex(1);
 
  240  icState->setTimeStep(-15.0);
 
  241  icState->setOrder(stepper->getOrder());
 
  246  solutionHistory->setName(
"Forward States");
 
  248  solutionHistory->setStorageLimit(2);
 
  249  solutionHistory->addState(icState);
 
  252  stepper->setInitialConditions(solutionHistory);
 
  253  solutionHistory->initWorkingState();
 
  254  solutionHistory->getWorkingState()->setTimeStep(-15.0);
 
  255  stepper->takeStep(solutionHistory);
 
  258  TEST_COMPARE(modifier->testBEGIN_STEP, ==, 
true);
 
  259  TEST_COMPARE(modifier->testBEFORE_STEPPER, ==, 
true);
 
  260  TEST_COMPARE(modifier->testAFTER_STEPPER, ==, 
true);
 
  261  TEST_COMPARE(modifier->testEND_STEP, ==, 
true);
 
  264  auto x = solutionHistory->getCurrentState()->getX();
 
  265  TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
 
  266  x = solutionHistory->getWorkingState()->getX();
 
  267  TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
 
  268  auto Dt = solutionHistory->getWorkingState()->getTimeStep();
 
  269  TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
 
  271  TEST_COMPARE(modifier->testName, ==, 
"OperatorSplit - Modifier");
 
 
  276class StepperOperatorSplitObserverTest
 
  280  StepperOperatorSplitObserverTest()
 
  281    : testBEGIN_STEP(false),
 
  282      testBEFORE_STEPPER(false),
 
  283      testAFTER_STEPPER(false),
 
  285      testCurrentValue(-0.99),
 
  286      testWorkingValue(-0.99),
 
  288      testName(
"Operator Split")
 
  293  virtual ~StepperOperatorSplitObserverTest() {}
 
  296  virtual void observe(
 
  303      case StepperOperatorSplitAppAction<double>::BEGIN_STEP: {
 
  304        testBEGIN_STEP   = 
true;
 
  305        auto x           = sh->getCurrentState()->getX();
 
  306        testCurrentValue = get_ele(*(x), 0);
 
  309      case StepperOperatorSplitAppAction<double>::BEFORE_STEPPER: {
 
  310        testBEFORE_STEPPER = 
true;
 
  311        testDt             = sh->getWorkingState()->getTimeStep();
 
  314      case StepperOperatorSplitAppAction<double>::AFTER_STEPPER: {
 
  315        testAFTER_STEPPER = 
true;
 
  316        testName          = stepper->getStepperType();
 
  319      case StepperOperatorSplitAppAction<double>::END_STEP: {
 
  321        auto x           = sh->getWorkingState()->getX();
 
  322        testWorkingValue = get_ele(*(x), 0);
 
  326        TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
 
  327                                   "Error - unknown action location.\n");
 
  332  bool testBEFORE_STEPPER;
 
  333  bool testAFTER_STEPPER;
 
  335  double testCurrentValue;
 
  336  double testWorkingValue;
 
  338  std::string testName;
 
  343  RCP<const Thyra::ModelEvaluator<double> > explicitModel =
 
  345  RCP<const Thyra::ModelEvaluator<double> > implicitModel =
 
  353  auto observer = rcp(
new StepperOperatorSplitObserverTest());
 
  354  stepper->setAppAction(observer);
 
  355  stepper->addStepper(subStepper1);
 
  356  stepper->addStepper(subStepper2);
 
  357  stepper->initialize();
 
  360  auto inArgsIC = stepper->getModel()->getNominalValues();
 
  361  auto icX      = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
 
  363      rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
 
  365  icState->setTime(0.0);
 
  366  icState->setIndex(1);
 
  367  icState->setTimeStep(-1.5);
 
  368  icState->setOrder(stepper->getOrder());
 
  373  solutionHistory->setName(
"Forward States");
 
  375  solutionHistory->setStorageLimit(2);
 
  376  solutionHistory->addState(icState);
 
  379  stepper->setInitialConditions(solutionHistory);
 
  380  solutionHistory->initWorkingState();
 
  381  solutionHistory->getWorkingState()->setTimeStep(-1.5);
 
  382  stepper->takeStep(solutionHistory);
 
  385  TEST_COMPARE(observer->testBEGIN_STEP, ==, 
true);
 
  386  TEST_COMPARE(observer->testBEFORE_STEPPER, ==, 
true);
 
  387  TEST_COMPARE(observer->testAFTER_STEPPER, ==, 
true);
 
  388  TEST_COMPARE(observer->testEND_STEP, ==, 
true);
 
  391  auto x = solutionHistory->getCurrentState()->getX();
 
  392  TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
 
  393  x = solutionHistory->getWorkingState()->getX();
 
  394  TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
 
  395  TEST_FLOATING_EQUALITY(observer->testDt, -1.5, 1.0e-14);
 
  397  TEST_COMPARE(observer->testName, ==, 
"Operator Split");
 
 
  402class StepperOperatorSplitModifierXTest
 
  406  StepperOperatorSplitModifierXTest()
 
  407    : testX_BEGIN_STEP(false),
 
  408      testX_BEFORE_STEPPER(false),
 
  409      testX_AFTER_STEPPER(false),
 
  410      testXDOT_END_STEP(false),
 
  419  virtual ~StepperOperatorSplitModifierXTest() {}
 
  423                      const double time, 
const double dt,
 
  428      case StepperOperatorSplitModifierXBase<double>::X_BEGIN_STEP: {
 
  429        testX_BEGIN_STEP = 
true;
 
  430        testX            = get_ele(*(x), 0);
 
  433      case StepperOperatorSplitModifierXBase<double>::X_BEFORE_STEPPER: {
 
  434        testX_BEFORE_STEPPER = 
true;
 
  438      case StepperOperatorSplitModifierXBase<double>::X_AFTER_STEPPER: {
 
  439        testX_AFTER_STEPPER = 
true;
 
  443      case StepperOperatorSplitModifierXBase<double>::XDOT_END_STEP: {
 
  444        testXDOT_END_STEP = 
true;
 
  445        testXDot          = get_ele(*(x), 0);
 
  449        TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
 
  450                                   "Error - unknown action location.\n");
 
  454  bool testX_BEGIN_STEP;
 
  455  bool testX_BEFORE_STEPPER;
 
  456  bool testX_AFTER_STEPPER;
 
  457  bool testXDOT_END_STEP;
 
  466  RCP<const Thyra::ModelEvaluator<double> > explicitModel =
 
  468  RCP<const Thyra::ModelEvaluator<double> > implicitModel =
 
  476  auto modifierX = rcp(
new StepperOperatorSplitModifierXTest());
 
  477  stepper->setAppAction(modifierX);
 
  478  stepper->addStepper(subStepper1);
 
  479  stepper->addStepper(subStepper2);
 
  480  stepper->initialize();
 
  483  auto inArgsIC = stepper->getModel()->getNominalValues();
 
  484  auto icX      = rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
 
  486      rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x_dot());
 
  488  icState->setTime(0.0);
 
  489  icState->setIndex(1);
 
  490  icState->setTimeStep(-1.5);
 
  491  icState->setOrder(stepper->getOrder());
 
  496  solutionHistory->setName(
"Forward States");
 
  498  solutionHistory->setStorageLimit(2);
 
  499  solutionHistory->addState(icState);
 
  502  stepper->setInitialConditions(solutionHistory);
 
  503  solutionHistory->initWorkingState();
 
  504  solutionHistory->getWorkingState()->setTimeStep(-1.5);
 
  505  stepper->takeStep(solutionHistory);
 
  508  TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==, 
true);
 
  509  TEST_COMPARE(modifierX->testX_BEFORE_STEPPER, ==, 
true);
 
  510  TEST_COMPARE(modifierX->testX_AFTER_STEPPER, ==, 
true);
 
  511  TEST_COMPARE(modifierX->testXDOT_END_STEP, ==, 
true);
 
  514  auto x = solutionHistory->getCurrentState()->getX();
 
  515  TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
 
  517  auto xDot = solutionHistory->getWorkingState()->getXDot();
 
  518  if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
 
  520  TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0), 1.0e-14);
 
  521  auto Dt = solutionHistory->getWorkingState()->getTimeStep();
 
  522  TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
 
  524  auto time = solutionHistory->getWorkingState()->getTime();
 
  525  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.
 
StepperOperatorSplitAppAction class for StepperOperatorSplit.
 
Base modifier for OperatorSplit.
 
Default modifier for StepperOperatorSplit.
 
Base ModifierX for StepperOperatorSplit.
 
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
 
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > >, const double, const double, const MODIFIER_TYPE modType)=0
Modify solution based on the MODIFIER_TYPE.
 
Default ModifierX for StepperOperatorSplit.
 
Base observer for StepperOperatorSplit.
 
Default observer for StepperOperatorSplit.
 
OperatorSplit stepper loops through the Stepper list.
 
van der Pol model formulated for IMEX.
 
van der Pol model formulated for IMEX-RK.
 
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
 
@ STORAGE_TYPE_STATIC
Keep a fix number of states.
 
Teuchos::RCP< StepperBackwardEuler< Scalar > > createStepperBackwardEuler(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
 
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.
 
Teuchos::RCP< StepperForwardEuler< Scalar > > createStepperForwardEuler(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.