9 #include "Teuchos_UnitTestHarness.hpp" 
   10 #include "Teuchos_XMLParameterListHelpers.hpp" 
   11 #include "Teuchos_TimeMonitor.hpp" 
   13 #include "Thyra_VectorStdOps.hpp" 
   15 #include "Tempus_IntegratorBasic.hpp" 
   19 #include "../TestModels/SinCosModel.hpp" 
   20 #include "../TestModels/VanDerPolModel.hpp" 
   21 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp" 
   26 namespace Tempus_Test {
 
   29 using Teuchos::ParameterList;
 
   30 using Teuchos::sublist;
 
   31 using Teuchos::getParametersFromXmlFile;
 
   42   std::vector<double> StepSize;
 
   43   std::vector<double> ErrorNorm;
 
   44   const int nTimeStepSizes = 7;
 
   47   for (
int n=0; n<nTimeStepSizes; n++) {
 
   50     RCP<ParameterList> pList =
 
   51       getParametersFromXmlFile(
"Tempus_PhysicsState_SinCos.xml");
 
   58     RCP<ParameterList> scm_pl = sublist(pList, 
"SinCosModel", 
true);
 
   60     RCP<SinCosModel<double> > model =
 
   66     RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
   67     pl->sublist(
"Demo Integrator")
 
   68        .sublist(
"Time Step Control").set(
"Initial Time Step", dt);
 
   69     RCP<Tempus::IntegratorBasic<double> > integrator =
 
   70       Tempus::integratorBasic<double>(pl, model);
 
   74     Teuchos::RCP<Tempus::Stepper<double> > physicsStepper = Teuchos::rcp(
 
   76     integrator->setStepperWStepper(physicsStepper);
 
   77     order = integrator->getStepper()->getOrder();
 
   83     RCP<Thyra::VectorBase<double> > x0 =
 
   84       model->getNominalValues().get_x()->clone_v();
 
   85     integrator->initializeSolutionHistory(0.0, x0);
 
   90     RCP<PhysicsStateCounter<double> > pSC = Teuchos::rcp(
 
   92     integrator->getSolutionHistory()->getCurrentState()->setPhysicsState(pSC);
 
   95     bool integratorStatus = integrator->advanceTime();
 
   96     TEST_ASSERT(integratorStatus)
 
   99     Teuchos::RCP<Tempus::PhysicsState<double> > pS =
 
  100       integrator->getSolutionHistory()->getCurrentState()->getPhysicsState();
 
  101     TEST_EQUALITY(pS->getName(), 
"PhysicsStateTest");
 
  104     TEST_EQUALITY(pSC->getCounter(), (int)(1.0/dt));
 
  108     double time = integrator->getTime();
 
  109     double timeFinal = pl->sublist(
"Demo Integrator")
 
  110       .sublist(
"Time Step Control").get<
double>(
"Final Time");
 
  111     TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
 
  114     RCP<Thyra::VectorBase<double> > x = integrator->getX();
 
  115     RCP<const Thyra::VectorBase<double> > x_exact =
 
  116       model->getExactSolution(time).get_x();
 
  120       std::ofstream ftmp(
"Tempus_ForwardEuler_SinCos.dat");
 
  121       RCP<const SolutionHistory<double> > solutionHistory =
 
  122         integrator->getSolutionHistory();
 
  123       RCP<const Thyra::VectorBase<double> > x_exact_plot;
 
  124       for (
int i=0; i<solutionHistory->getNumStates(); i++) {
 
  125         RCP<const SolutionState<double> > solutionState = (*solutionHistory)[i];
 
  126         double time_i = solutionState->getTime();
 
  127         RCP<const Thyra::VectorBase<double> > x_plot = solutionState->getX();
 
  128         x_exact_plot = model->getExactSolution(time_i).get_x();
 
  129         ftmp << time_i << 
"   " 
  130              << Thyra::get_ele(*(x_plot), 0) << 
"   " 
  131              << Thyra::get_ele(*(x_plot), 1) << 
"   " 
  132              << Thyra::get_ele(*(x_exact_plot), 0) << 
"   " 
  133              << Thyra::get_ele(*(x_exact_plot), 1) << std::endl;
 
  139     RCP<Thyra::VectorBase<double> > xdiff = x->clone_v();
 
  140     Thyra::V_StVpStV(xdiff.ptr(), 1.0, *x_exact, -1.0, *(x));
 
  141     StepSize.push_back(dt);
 
  142     const double L2norm = Thyra::norm_2(*xdiff);
 
  143     ErrorNorm.push_back(L2norm);
 
  147   double slope = computeLinearRegressionLogLog<double>(StepSize, ErrorNorm);
 
  148   std::cout << 
"  Stepper = ForwardEuler" << std::endl;
 
  149   std::cout << 
"  =========================" << std::endl;
 
  150   std::cout << 
"  Expected order: " << order << std::endl;
 
  151   std::cout << 
"  Observed order: " << slope << std::endl;
 
  152   std::cout << 
"  =========================" << std::endl;
 
  153   TEST_FLOATING_EQUALITY( slope, order, 0.01 );
 
  154   TEST_FLOATING_EQUALITY( ErrorNorm[0], 0.051123, 1.0e-4 );
 
  156   std::ofstream ftmp(
"Tempus_ForwardEuler_SinCos-Error.dat");
 
  157   double error0 = 0.8*ErrorNorm[0];
 
  158   for (
int n=0; n<nTimeStepSizes; n++) {
 
  159     ftmp << StepSize[n]  << 
"   " << ErrorNorm[n] << 
"   " 
  160          << error0*(pow(StepSize[n]/StepSize[0],order)) << std::endl;
 
  164   Teuchos::TimeMonitor::summarize();
 
This is a Forward Euler time stepper to test the PhysicsState. 
 
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation  with a...
 
TEUCHOS_UNIT_TEST(BackwardEuler, SinCos_ASA)
 
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
 
PhysicsStateCounter is a simple PhysicsState that counts steps. 
 
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...