9 #include "Teuchos_UnitTestHarness.hpp" 
   10 #include "Teuchos_XMLParameterListHelpers.hpp" 
   11 #include "Teuchos_TimeMonitor.hpp" 
   12 #include "Teuchos_DefaultComm.hpp" 
   14 #include "Tempus_config.hpp" 
   15 #include "Tempus_IntegratorBasic.hpp" 
   16 #include "Tempus_StepperBackwardEuler.hpp" 
   18 #include "../TestModels/SinCosModel.hpp" 
   19 #include "../TestModels/CDR_Model.hpp" 
   20 #include "../TestModels/VanDerPolModel.hpp" 
   21 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp" 
   23 #include "Stratimikos_DefaultLinearSolverBuilder.hpp" 
   24 #include "Thyra_LinearOpWithSolveFactoryHelpers.hpp" 
   26 #ifdef Tempus_ENABLE_MPI 
   27 #include "Epetra_MpiComm.h" 
   29 #include "Epetra_SerialComm.h" 
   37 namespace Tempus_Test {
 
   41 using Teuchos::rcp_const_cast;
 
   42 using Teuchos::ParameterList;
 
   43 using Teuchos::sublist;
 
   44 using Teuchos::getParametersFromXmlFile;
 
   56   RCP<ParameterList> pList =
 
   57     getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
 
   60   RCP<ParameterList> scm_pl = sublist(pList, 
"SinCosModel", 
true);
 
   63   RCP<ParameterList> tempusPL  = sublist(pList, 
"Tempus", 
true);
 
   67     RCP<Tempus::IntegratorBasic<double> > integrator =
 
   68       Tempus::integratorBasic<double>(tempusPL, model);
 
   70     RCP<ParameterList> stepperPL = sublist(tempusPL, 
"Default Stepper", 
true);
 
   72     stepperPL->set(
"Predictor Stepper Type", 
"None");
 
   73     RCP<const ParameterList> defaultPL =
 
   74       integrator->getStepper()->getValidParameters();
 
   76     bool pass = haveSameValues(*stepperPL, *defaultPL, 
true);
 
   78       std::cout << std::endl;
 
   79       std::cout << 
"stepperPL -------------- \n" << *stepperPL << std::endl;
 
   80       std::cout << 
"defaultPL -------------- \n" << *defaultPL << std::endl;
 
   87     RCP<Tempus::IntegratorBasic<double> > integrator =
 
   88       Tempus::integratorBasic<double>(model, 
"Backward Euler");
 
   90     RCP<ParameterList> stepperPL = sublist(tempusPL, 
"Default Stepper", 
true);
 
   91     RCP<const ParameterList> defaultPL =
 
   92       integrator->getStepper()->getValidParameters();
 
   94     bool pass = haveSameValues(*stepperPL, *defaultPL, 
true);
 
   96       std::cout << std::endl;
 
   97       std::cout << 
"stepperPL -------------- \n" << *stepperPL << std::endl;
 
   98       std::cout << 
"defaultPL -------------- \n" << *defaultPL << std::endl;
 
  112   RCP<ParameterList> pList =
 
  113     getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
 
  114   RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
  117   RCP<ParameterList> scm_pl = sublist(pList, 
"SinCosModel", 
true);
 
  123   stepper->setModel(model);
 
  124   stepper->initialize();
 
  128   ParameterList tscPL = pl->sublist(
"Default Integrator")
 
  129                            .sublist(
"Time Step Control");
 
  130   timeStepControl->setStepType (tscPL.get<std::string>(
"Integrator Step Type"));
 
  131   timeStepControl->setInitIndex(tscPL.get<
int>   (
"Initial Time Index"));
 
  132   timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
 
  133   timeStepControl->setFinalTime(tscPL.get<
double>(
"Final Time"));
 
  134   timeStepControl->setInitTimeStep(dt);
 
  135   timeStepControl->initialize();
 
  138   Thyra::ModelEvaluatorBase::InArgs<double> inArgsIC =
 
  139     stepper->getModel()->getNominalValues();
 
  141     rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
 
  143   icState->setTime    (timeStepControl->getInitTime());
 
  144   icState->setIndex   (timeStepControl->getInitIndex());
 
  145   icState->setTimeStep(0.0);
 
  146   icState->setOrder   (stepper->getOrder());
 
  151   solutionHistory->setName(
"Forward States");
 
  153   solutionHistory->setStorageLimit(2);
 
  154   solutionHistory->addState(icState);
 
  157   RCP<Tempus::IntegratorBasic<double> > integrator =
 
  158     Tempus::integratorBasic<double>();
 
  159   integrator->setStepperWStepper(stepper);
 
  160   integrator->setTimeStepControl(timeStepControl);
 
  161   integrator->setSolutionHistory(solutionHistory);
 
  163   integrator->initialize();
 
  167   bool integratorStatus = integrator->advanceTime();
 
  168   TEST_ASSERT(integratorStatus)
 
  172   double time = integrator->getTime();
 
  173   double timeFinal =pl->sublist(
"Default Integrator")
 
  174      .sublist(
"Time Step Control").get<
double>(
"Final Time");
 
  175   TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
 
  178   RCP<Thyra::VectorBase<double> > x = integrator->getX();
 
  179   RCP<const Thyra::VectorBase<double> > x_exact =
 
  180     model->getExactSolution(time).get_x();
 
  183   RCP<Thyra::VectorBase<double> > xdiff = x->clone_v();
 
  184   Thyra::V_StVpStV(xdiff.ptr(), 1.0, *x_exact, -1.0, *(x));
 
  187   std::cout << 
"  Stepper = BackwardEuler" << std::endl;
 
  188   std::cout << 
"  =========================" << std::endl;
 
  189   std::cout << 
"  Exact solution   : " << get_ele(*(x_exact), 0) << 
"   " 
  190                                        << get_ele(*(x_exact), 1) << std::endl;
 
  191   std::cout << 
"  Computed solution: " << get_ele(*(x      ), 0) << 
"   " 
  192                                        << get_ele(*(x      ), 1) << std::endl;
 
  193   std::cout << 
"  Difference       : " << get_ele(*(xdiff  ), 0) << 
"   " 
  194                                        << get_ele(*(xdiff  ), 1) << std::endl;
 
  195   std::cout << 
"  =========================" << std::endl;
 
  196   TEST_FLOATING_EQUALITY(get_ele(*(x), 0), 0.798923, 1.0e-4 );
 
  197   TEST_FLOATING_EQUALITY(get_ele(*(x), 1), 0.516729, 1.0e-4 );
 
  205   RCP<Tempus::IntegratorBasic<double> > integrator;
 
  206   std::vector<RCP<Thyra::VectorBase<double>>> solutions;
 
  207   std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
 
  208   std::vector<double> StepSize;
 
  209   std::vector<double> xErrorNorm;
 
  210   std::vector<double> xDotErrorNorm;
 
  211   const int nTimeStepSizes = 7;
 
  214   for (
int n=0; n<nTimeStepSizes; n++) {
 
  217     RCP<ParameterList> pList =
 
  218       getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
 
  225     RCP<ParameterList> scm_pl = sublist(pList, 
"SinCosModel", 
true);
 
  232     RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
  233     pl->sublist(
"Default Integrator")
 
  234        .sublist(
"Time Step Control").set(
"Initial Time Step", dt);
 
  235     integrator = Tempus::integratorBasic<double>(pl, model);
 
  241     RCP<Thyra::VectorBase<double> > x0 =
 
  242       model->getNominalValues().get_x()->clone_v();
 
  243     integrator->initializeSolutionHistory(0.0, x0);
 
  246     bool integratorStatus = integrator->advanceTime();
 
  247     TEST_ASSERT(integratorStatus)
 
  250     time = integrator->getTime();
 
  251     double timeFinal =pl->sublist(
"Default Integrator")
 
  252        .sublist(
"Time Step Control").get<
double>(
"Final Time");
 
  253     TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
 
  257       RCP<const SolutionHistory<double> > solutionHistory =
 
  258         integrator->getSolutionHistory();
 
  259       writeSolution(
"Tempus_BackwardEuler_SinCos.dat", solutionHistory);
 
  262       for (
int i=0; i<solutionHistory->getNumStates(); i++) {
 
  263         double time_i = (*solutionHistory)[i]->getTime();
 
  265           rcp_const_cast<Thyra::VectorBase<double> > (
 
  266             model->getExactSolution(time_i).get_x()),
 
  267           rcp_const_cast<Thyra::VectorBase<double> > (
 
  268             model->getExactSolution(time_i).get_x_dot()));
 
  269         state->setTime((*solutionHistory)[i]->getTime());
 
  270         solnHistExact->addState(state);
 
  272       writeSolution(
"Tempus_BackwardEuler_SinCos-Ref.dat", solnHistExact);
 
  276     StepSize.push_back(dt);
 
  277     auto solution = Thyra::createMember(model->get_x_space());
 
  278     Thyra::copy(*(integrator->getX()),solution.ptr());
 
  279     solutions.push_back(solution);
 
  280     auto solutionDot = Thyra::createMember(model->get_x_space());
 
  281     Thyra::copy(*(integrator->getXdot()),solutionDot.ptr());
 
  282     solutionsDot.push_back(solutionDot);
 
  283     if (n == nTimeStepSizes-1) {  
 
  284       StepSize.push_back(0.0);
 
  285       auto solutionExact = Thyra::createMember(model->get_x_space());
 
  286       Thyra::copy(*(model->getExactSolution(time).get_x()),solutionExact.ptr());
 
  287       solutions.push_back(solutionExact);
 
  288       auto solutionDotExact = Thyra::createMember(model->get_x_space());
 
  289       Thyra::copy(*(model->getExactSolution(time).get_x_dot()),
 
  290                   solutionDotExact.ptr());
 
  291       solutionsDot.push_back(solutionDotExact);
 
  297   double xDotSlope = 0.0;
 
  298   RCP<Tempus::Stepper<double> > stepper = integrator->getStepper();
 
  299   double order = stepper->getOrder();
 
  302                   solutions,    xErrorNorm,    xSlope,
 
  303                   solutionsDot, xDotErrorNorm, xDotSlope);
 
  305   TEST_FLOATING_EQUALITY( xSlope,               order, 0.01   );
 
  306   TEST_FLOATING_EQUALITY( xErrorNorm[0],    0.0486418, 1.0e-4 );
 
  307   TEST_FLOATING_EQUALITY( xDotSlope,            order, 0.01   );
 
  308   TEST_FLOATING_EQUALITY( xDotErrorNorm[0], 0.0486418, 1.0e-4 );
 
  310   Teuchos::TimeMonitor::summarize();
 
  319   RCP<Epetra_Comm> comm;
 
  320 #ifdef Tempus_ENABLE_MPI 
  321   comm = rcp(
new Epetra_MpiComm(MPI_COMM_WORLD));
 
  323   comm = rcp(
new Epetra_SerialComm);
 
  326   RCP<Tempus::IntegratorBasic<double> > integrator;
 
  327   std::vector<RCP<Thyra::VectorBase<double>>> solutions;
 
  328   std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
 
  329   std::vector<double> StepSize;
 
  330   std::vector<double> xErrorNorm;
 
  331   std::vector<double> xDotErrorNorm;
 
  332   const int nTimeStepSizes = 5;
 
  334   for (
int n=0; n<nTimeStepSizes; n++) {
 
  337     RCP<ParameterList> pList =
 
  338       getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
 
  341     RCP<ParameterList> model_pl = sublist(pList, 
"CDR Model", 
true);
 
  342     const int num_elements = model_pl->get<
int>(
"num elements");
 
  343     const double left_end = model_pl->get<
double>(
"left end");
 
  344     const double right_end = model_pl->get<
double>(
"right end");
 
  345     const double a_convection = model_pl->get<
double>(
"a (convection)");
 
  346     const double k_source = model_pl->get<
double>(
"k (source)");
 
  356     ::Stratimikos::DefaultLinearSolverBuilder builder;
 
  358     auto p = rcp(
new ParameterList);
 
  359     p->set(
"Linear Solver Type", 
"Belos");
 
  360     p->set(
"Preconditioner Type", 
"None");
 
  361     builder.setParameterList(p);
 
  363     RCP< ::Thyra::LinearOpWithSolveFactoryBase<double> >
 
  364       lowsFactory = builder.createLinearSolveStrategy(
"");
 
  366     model->set_W_factory(lowsFactory);
 
  372     RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
  373     pl->sublist(
"Demo Integrator")
 
  374        .sublist(
"Time Step Control").set(
"Initial Time Step", dt);
 
  375     integrator = Tempus::integratorBasic<double>(pl, model);
 
  378     bool integratorStatus = integrator->advanceTime();
 
  379     TEST_ASSERT(integratorStatus)
 
  382     double time = integrator->getTime();
 
  383     double timeFinal =pl->sublist(
"Demo Integrator")
 
  384        .sublist(
"Time Step Control").get<
double>(
"Final Time");
 
  385     double tol = 100.0 * std::numeric_limits<double>::epsilon();
 
  386     TEST_FLOATING_EQUALITY(time, timeFinal, tol);
 
  389     StepSize.push_back(dt);
 
  390     auto solution = Thyra::createMember(model->get_x_space());
 
  391     Thyra::copy(*(integrator->getX()),solution.ptr());
 
  392     solutions.push_back(solution);
 
  393     auto solutionDot = Thyra::createMember(model->get_x_space());
 
  394     Thyra::copy(*(integrator->getXdot()),solutionDot.ptr());
 
  395     solutionsDot.push_back(solutionDot);
 
  399     if ((n == nTimeStepSizes-1) && (comm->NumProc() == 1)) {
 
  400       std::ofstream ftmp(
"Tempus_BackwardEuler_CDR.dat");
 
  401       ftmp << 
"TITLE=\"Backward Euler Solution to CDR\"\n" 
  402            << 
"VARIABLES=\"z\",\"T\"\n";
 
  403       const double dx = std::fabs(left_end-right_end) /
 
  404                         static_cast<double>(num_elements);
 
  405       RCP<const SolutionHistory<double> > solutionHistory =
 
  406         integrator->getSolutionHistory();
 
  407       int nStates = solutionHistory->getNumStates();
 
  408       for (
int i=0; i<nStates; i++) {
 
  409         RCP<const SolutionState<double> > solutionState = (*solutionHistory)[i];
 
  410         RCP<const Thyra::VectorBase<double> > x = solutionState->getX();
 
  411         double ttime = solutionState->getTime();
 
  412         ftmp << 
"ZONE T=\"Time="<<ttime<<
"\", I=" 
  413              <<num_elements+1<<
", F=BLOCK\n";
 
  414         for (
int j = 0; j < num_elements+1; j++) {
 
  415           const double x_coord = left_end + 
static_cast<double>(j) * dx;
 
  416           ftmp << x_coord << 
"   ";
 
  419         for (
int j=0; j<num_elements+1; j++) ftmp << get_ele(*x, j) << 
"   ";
 
  428   double xDotSlope = 0.0;
 
  429   RCP<Tempus::Stepper<double> > stepper = integrator->getStepper();
 
  432                   solutions,    xErrorNorm,    xSlope,
 
  433                   solutionsDot, xDotErrorNorm, xDotSlope);
 
  435   TEST_FLOATING_EQUALITY( xSlope,            1.32213, 0.01   );
 
  436   TEST_FLOATING_EQUALITY( xErrorNorm[0],    0.116919, 1.0e-4 );
 
  437   TEST_FLOATING_EQUALITY( xDotSlope,         1.32052, 0.01 );
 
  438   TEST_FLOATING_EQUALITY( xDotErrorNorm[0], 0.449888, 1.0e-4 );
 
  446   if (comm->NumProc() == 1) {
 
  447     RCP<ParameterList> pList =
 
  448       getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
 
  449     RCP<ParameterList> model_pl = sublist(pList, 
"CDR Model", 
true);
 
  450     const int num_elements = model_pl->get<
int>(
"num elements");
 
  451     const double left_end = model_pl->get<
double>(
"left end");
 
  452     const double right_end = model_pl->get<
double>(
"right end");
 
  454     const Thyra::VectorBase<double>& x = *(solutions[solutions.size()-1]);
 
  456     std::ofstream ftmp(
"Tempus_BackwardEuler_CDR-Solution.dat");
 
  457     for (
int n = 0; n < num_elements+1; n++) {
 
  458       const double dx = std::fabs(left_end-right_end) /
 
  459                         static_cast<double>(num_elements);
 
  460       const double x_coord = left_end + 
static_cast<double>(n) * dx;
 
  461       ftmp << x_coord << 
"   " <<  Thyra::get_ele(x,n) << std::endl;
 
  466   Teuchos::TimeMonitor::summarize();
 
  474   RCP<Tempus::IntegratorBasic<double> > integrator;
 
  475   std::vector<RCP<Thyra::VectorBase<double>>> solutions;
 
  476   std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
 
  477   std::vector<double> StepSize;
 
  478   std::vector<double> xErrorNorm;
 
  479   std::vector<double> xDotErrorNorm;
 
  480   const int nTimeStepSizes = 4;
 
  482   for (
int n=0; n<nTimeStepSizes; n++) {
 
  485     RCP<ParameterList> pList =
 
  486       getParametersFromXmlFile(
"Tempus_BackwardEuler_VanDerPol.xml");
 
  489     RCP<ParameterList> vdpm_pl = sublist(pList, 
"VanDerPolModel", 
true);
 
  494     if (n == nTimeStepSizes-1) dt /= 10.0;
 
  497     RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
  498     pl->sublist(
"Demo Integrator")
 
  499        .sublist(
"Time Step Control").set(
"Initial Time Step", dt);
 
  500     integrator = Tempus::integratorBasic<double>(pl, model);
 
  503     bool integratorStatus = integrator->advanceTime();
 
  504     TEST_ASSERT(integratorStatus)
 
  507     double time = integrator->getTime();
 
  508     double timeFinal =pl->sublist(
"Demo Integrator")
 
  509       .sublist(
"Time Step Control").get<
double>(
"Final Time");
 
  510     double tol = 100.0 * std::numeric_limits<double>::epsilon();
 
  511     TEST_FLOATING_EQUALITY(time, timeFinal, tol);
 
  514     StepSize.push_back(dt);
 
  515     auto solution = Thyra::createMember(model->get_x_space());
 
  516     Thyra::copy(*(integrator->getX()),solution.ptr());
 
  517     solutions.push_back(solution);
 
  518     auto solutionDot = Thyra::createMember(model->get_x_space());
 
  519     Thyra::copy(*(integrator->getXdot()),solutionDot.ptr());
 
  520     solutionsDot.push_back(solutionDot);
 
  524     if ((n == 0) or (n == nTimeStepSizes-1)) {
 
  525       std::string fname = 
"Tempus_BackwardEuler_VanDerPol-Ref.dat";
 
  526       if (n == 0) fname = 
"Tempus_BackwardEuler_VanDerPol.dat";
 
  527       RCP<const SolutionHistory<double> > solutionHistory =
 
  528         integrator->getSolutionHistory();
 
  535   double xDotSlope = 0.0;
 
  536   RCP<Tempus::Stepper<double> > stepper = integrator->getStepper();
 
  537   double order = stepper->getOrder();
 
  540                   solutions,    xErrorNorm,    xSlope,
 
  541                   solutionsDot, xDotErrorNorm, xDotSlope);
 
  543   TEST_FLOATING_EQUALITY( xSlope,            order, 0.10   );
 
  544   TEST_FLOATING_EQUALITY( xErrorNorm[0],  0.571031, 1.0e-4 );
 
  545   TEST_FLOATING_EQUALITY( xDotSlope,       1.74898, 0.10   );
 
  546   TEST_FLOATING_EQUALITY( xDotErrorNorm[0], 1.0038, 1.0e-4 );
 
  550   Teuchos::TimeMonitor::summarize();
 
  559   RCP<ParameterList> pList =
 
  560     getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
 
  563   RCP<ParameterList> scm_pl = sublist(pList, 
"SinCosModel", 
true);
 
  567   RCP<ParameterList> pl = sublist(pList, 
"Tempus", 
true);
 
  568   RCP<Tempus::IntegratorBasic<double> >integrator =
 
  569     Tempus::integratorBasic<double>(pl, model);
 
  572   bool integratorStatus = integrator->advanceTime();
 
  573   TEST_ASSERT(integratorStatus);
 
  576   RCP<const SolutionHistory<double> > solutionHistory =
 
  577     integrator->getSolutionHistory();
 
  580   RCP<Tempus::Stepper<double> > stepper = integrator->getStepper();
 
  581   RCP<Tempus::StepperOptimizationInterface<double> > opt_stepper =
 
  586   TEST_EQUALITY( opt_stepper->stencilLength(), 2);
 
  589   Teuchos::Array< RCP<const Thyra::VectorBase<double> > > x(2);
 
  590   Teuchos::Array<double> t(2);
 
  591   RCP< const Thyra::VectorBase<double> > p =
 
  592     model->getNominalValues().get_p(0);
 
  593   RCP< Thyra::VectorBase<double> > x_dot =
 
  594     Thyra::createMember(model->get_x_space());
 
  595   RCP< Thyra::VectorBase<double> > f =
 
  596     Thyra::createMember(model->get_f_space());
 
  597   RCP< Thyra::VectorBase<double> > f2 =
 
  598     Thyra::createMember(model->get_f_space());
 
  599   RCP< Thyra::LinearOpBase<double> > dfdx =
 
  600     model->create_W_op();
 
  601   RCP< Thyra::LinearOpBase<double> > dfdx2 =
 
  602     model->create_W_op();
 
  603   RCP< Thyra::MultiVectorBase<double> > dfdx_mv =
 
  604     Teuchos::rcp_dynamic_cast< Thyra::MultiVectorBase<double> >(dfdx,
true);
 
  605   RCP< Thyra::MultiVectorBase<double> > dfdx_mv2 =
 
  606     Teuchos::rcp_dynamic_cast< Thyra::MultiVectorBase<double> >(dfdx2,
true);
 
  607   const int num_p = p->range()->dim();
 
  608   RCP< Thyra::MultiVectorBase<double> > dfdp =
 
  609     Thyra::createMembers(model->get_f_space(), num_p);
 
  610   RCP< Thyra::MultiVectorBase<double> > dfdp2 =
 
  611     Thyra::createMembers(model->get_f_space(), num_p);
 
  612   RCP< Thyra::LinearOpWithSolveBase<double> > W =
 
  614   RCP< Thyra::LinearOpWithSolveBase<double> > W2 =
 
  616   RCP< Thyra::MultiVectorBase<double> > tmp =
 
  617     Thyra::createMembers(model->get_x_space(), num_p);
 
  618   RCP< Thyra::MultiVectorBase<double> > tmp2 =
 
  619     Thyra::createMembers(model->get_x_space(), num_p);
 
  620   std::vector<double> nrms(num_p);
 
  624   const int n = solutionHistory->getNumStates();
 
  625   for (
int i=1; i<n; ++i) {
 
  626     RCP<const SolutionState<double> > state = (*solutionHistory)[i];
 
  627     RCP<const SolutionState<double> > prev_state = (*solutionHistory)[i-1];
 
  630     x[0] = state->getX();
 
  631     x[1] = prev_state->getX();
 
  632     t[0] = state->getTime();
 
  633     t[1] = prev_state->getTime();
 
  636     const double dt = t[0]-t[1];
 
  637     Thyra::V_StVpStV(x_dot.ptr(), 1.0/dt, *(x[0]), -1.0/dt, *(x[1]));
 
  640     typedef Thyra::ModelEvaluatorBase MEB;
 
  641     MEB::InArgs<double> in_args = model->createInArgs();
 
  642     MEB::OutArgs<double> out_args = model->createOutArgs();
 
  644     in_args.set_x_dot(x_dot);
 
  648     const double tol = 1.0e-14;
 
  651     opt_stepper->computeStepResidual(*f, x, t, *p, 0);
 
  653     model->evalModel(in_args, out_args);
 
  654     out_args.set_f(Teuchos::null);
 
  655     Thyra::V_VmV(f.ptr(), *f, *f2);
 
  656     err = Thyra::norm(*f);
 
  657     TEST_FLOATING_EQUALITY(err, 0.0, tol);
 
  661     opt_stepper->computeStepJacobian(*dfdx, x, t, *p, 0, 0);
 
  662     out_args.set_W_op(dfdx2);
 
  663     in_args.set_alpha(1.0/dt);
 
  664     in_args.set_beta(1.0);
 
  665     model->evalModel(in_args, out_args);
 
  666     out_args.set_W_op(Teuchos::null);
 
  667     Thyra::V_VmV(dfdx_mv.ptr(), *dfdx_mv, *dfdx_mv2);
 
  668     Thyra::norms(*dfdx_mv, Teuchos::arrayViewFromVector(nrms));
 
  670     for (
auto nrm : nrms) err += nrm;
 
  671     TEST_FLOATING_EQUALITY(err, 0.0, tol);
 
  675     opt_stepper->computeStepJacobian(*dfdx, x, t, *p, 0, 1);
 
  676     out_args.set_W_op(dfdx2);
 
  677     in_args.set_alpha(-1.0/dt);
 
  678     in_args.set_beta(0.0);
 
  679     model->evalModel(in_args, out_args);
 
  680     out_args.set_W_op(Teuchos::null);
 
  681     Thyra::V_VmV(dfdx_mv.ptr(), *dfdx_mv, *dfdx_mv2);
 
  682     Thyra::norms(*dfdx_mv, Teuchos::arrayViewFromVector(nrms));
 
  684     for (
auto nrm : nrms) err += nrm;
 
  685     TEST_FLOATING_EQUALITY(err, 0.0, tol);
 
  688     opt_stepper->computeStepParamDeriv(*dfdp, x, t, *p, 0);
 
  690       0, MEB::Derivative<double>(dfdp2, MEB::DERIV_MV_JACOBIAN_FORM));
 
  691     model->evalModel(in_args, out_args);
 
  692     out_args.set_DfDp(0, MEB::Derivative<double>());
 
  693     Thyra::V_VmV(dfdp.ptr(), *dfdp, *dfdp2);
 
  694     Thyra::norms(*dfdp, Teuchos::arrayViewFromVector(nrms));
 
  696     for (
auto nrm : nrms) err += nrm;
 
  697     TEST_FLOATING_EQUALITY(err, 0.0, tol);
 
  700     opt_stepper->computeStepSolver(*W, x, t, *p, 0);
 
  702     in_args.set_alpha(1.0/dt);
 
  703     in_args.set_beta(1.0);
 
  704     model->evalModel(in_args, out_args);
 
  705     out_args.set_W(Teuchos::null);
 
  707     Thyra::solve(*W, Thyra::NOTRANS, *dfdp2, tmp.ptr());
 
  708     Thyra::solve(*W2, Thyra::NOTRANS, *dfdp2, tmp2.ptr());
 
  709     Thyra::V_VmV(tmp.ptr(), *tmp, *tmp2);
 
  710     Thyra::norms(*tmp, Teuchos::arrayViewFromVector(nrms));
 
  712     for (
auto nrm : nrms) err += nrm;
 
  713     TEST_FLOATING_EQUALITY(err, 0.0, tol);
 
  716   Teuchos::TimeMonitor::summarize();
 
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. 
 
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation  with a...
 
void writeSolution(const std::string filename, Teuchos::RCP< const Tempus::SolutionHistory< Scalar > > solutionHistory)
 
void writeOrderError(const std::string filename, Teuchos::RCP< Tempus::Stepper< Scalar > > stepper, std::vector< Scalar > &StepSize, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar >>> &solutions, std::vector< Scalar > &xErrorNorm, Scalar &xSlope, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar >>> &solutionsDot, std::vector< Scalar > &xDotErrorNorm, Scalar &xDotSlope, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar >>> &solutionsDotDot, std::vector< Scalar > &xDotDotErrorNorm, Scalar &xDotDotSlope)
 
TEUCHOS_UNIT_TEST(BackwardEuler, SinCos_ASA)
 
TimeStepControl manages the time step size. There several mechanicisms that effect the time step size...
 
Backward Euler time stepper. 
 
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
 
Keep a fix number of states. 
 
van der Pol model problem for nonlinear electrical circuit. 
 
Stepper interface to support full-space optimization. 
 
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...
 
1D CGFEM model for convection/diffusion/reaction