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"
16 #include "Tempus_StepperOperatorSplit.hpp"
17 #include "Tempus_StepperForwardEuler.hpp"
18 #include "Tempus_StepperBackwardEuler.hpp"
20 #include "../TestModels/VanDerPol_IMEX_ExplicitModel.hpp"
21 #include "../TestModels/VanDerPol_IMEX_ImplicitModel.hpp"
22 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp"
30 using Teuchos::ParameterList;
31 using Teuchos::sublist;
32 using Teuchos::getParametersFromXmlFile;
39 #define TEST_CONSTRUCTING_FROM_DEFAULTS
40 #define TEST_VANDERPOL
43 #ifdef TEST_CONSTRUCTING_FROM_DEFAULTS
51 RCP<ParameterList> pList =
52 getParametersFromXmlFile(
"Tempus_OperatorSplit_VanDerPol.xml");
53 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
56 RCP<ParameterList> vdpmPL = sublist(pList,
"VanDerPolModel",
true);
57 RCP<VanDerPol_IMEX_ExplicitModel<double> > explicitModel =
61 RCP<VanDerPol_IMEX_ImplicitModel<double> > implicitModel =
66 RCP<Tempus::StepperOperatorSplit<double> > stepper =
69 RCP<Tempus::StepperForwardEuler<double> > subStepper1 =
71 RCP<Tempus::StepperBackwardEuler<double> > subStepper2 =
74 stepper->addStepper(subStepper1);
75 stepper->addStepper(subStepper2);
76 stepper->initialize();
80 RCP<Tempus::TimeStepControl<double> > timeStepControl =
82 ParameterList tscPL = pl->sublist(
"Demo Integrator")
83 .sublist(
"Time Step Control");
84 timeStepControl->setStepType (tscPL.get<std::string>(
"Integrator Step Type"));
85 timeStepControl->setInitIndex(tscPL.get<
int> (
"Initial Time Index"));
86 timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
87 timeStepControl->setFinalTime(tscPL.get<
double>(
"Final Time"));
88 timeStepControl->setInitTimeStep(dt);
89 timeStepControl->initialize();
92 Thyra::ModelEvaluatorBase::InArgs<double> inArgsIC =
93 stepper->getModel()->getNominalValues();
94 RCP<Thyra::VectorBase<double> > icSolution =
95 Teuchos::rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
96 RCP<Tempus::SolutionState<double> > icState =
98 icState->setTime (timeStepControl->getInitTime());
99 icState->setIndex (timeStepControl->getInitIndex());
100 icState->setTimeStep(0.0);
101 icState->setOrder (stepper->getOrder());
113 RCP<Tempus::IntegratorBasic<double> > integrator =
114 Tempus::integratorBasic<double>();
115 integrator->setStepperWStepper(stepper);
116 integrator->setTimeStepControl(timeStepControl);
119 integrator->initialize();
123 bool integratorStatus = integrator->advanceTime();
124 TEST_ASSERT(integratorStatus)
128 double time = integrator->getTime();
129 double timeFinal =pl->sublist(
"Demo Integrator")
130 .sublist(
"Time Step Control").get<
double>(
"Final Time");
131 TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
134 RCP<Thyra::VectorBase<double> > x = integrator->getX();
137 std::cout <<
" Stepper = " << stepper->description() << std::endl;
138 std::cout <<
" =========================" << std::endl;
139 std::cout <<
" Computed solution: " << get_ele(*(x ), 0) <<
" "
140 << get_ele(*(x ), 1) << std::endl;
141 std::cout <<
" =========================" << std::endl;
142 TEST_FLOATING_EQUALITY(get_ele(*(x), 0), -2.223910, 1.0e-4);
143 TEST_FLOATING_EQUALITY(get_ele(*(x), 1), 0.565441, 1.0e-4);
145 #endif // TEST_CONSTRUCTING_FROM_DEFAULTS
148 #ifdef TEST_VANDERPOL
153 RCP<Tempus::IntegratorBasic<double> > integrator;
154 std::vector<RCP<Thyra::VectorBase<double>>> solutions;
155 std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
156 std::vector<double> StepSize;
157 std::vector<double> xErrorNorm;
158 std::vector<double> xDotErrorNorm;
159 const int nTimeStepSizes = 4;
162 for (
int n=0; n<nTimeStepSizes; n++) {
165 RCP<ParameterList> pList =
166 getParametersFromXmlFile(
"Tempus_OperatorSplit_VanDerPol.xml");
169 RCP<ParameterList> vdpmPL = sublist(pList,
"VanDerPolModel",
true);
170 RCP<VanDerPol_IMEX_ExplicitModel<double> > explicitModel =
174 RCP<VanDerPol_IMEX_ImplicitModel<double> > implicitModel =
178 std::vector<Teuchos::RCP<const Thyra::ModelEvaluator<double> > > models;
179 models.push_back(explicitModel);
180 models.push_back(implicitModel);
184 if (n == nTimeStepSizes-1) dt /= 10.0;
187 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
188 pl->sublist(
"Demo Integrator")
189 .sublist(
"Time Step Control").set(
"Initial Time Step", dt);
190 integrator = Tempus::integratorBasic<double>(pl, models);
193 bool integratorStatus = integrator->advanceTime();
194 TEST_ASSERT(integratorStatus)
197 time = integrator->getTime();
198 double timeFinal =pl->sublist(
"Demo Integrator")
199 .sublist(
"Time Step Control").get<
double>(
"Final Time");
200 double tol = 100.0 * std::numeric_limits<double>::epsilon();
201 TEST_FLOATING_EQUALITY(time, timeFinal, tol);
204 StepSize.push_back(dt);
205 auto solution = Thyra::createMember(implicitModel->get_x_space());
206 Thyra::copy(*(integrator->getX()),solution.ptr());
207 solutions.push_back(solution);
208 auto solutionDot = Thyra::createMember(implicitModel->get_x_space());
209 Thyra::copy(*(integrator->getXdot()),solutionDot.ptr());
210 solutionsDot.push_back(solutionDot);
214 if ((n == 0) or (n == nTimeStepSizes-1)) {
215 std::string fname =
"Tempus_OperatorSplit_VanDerPol-Ref.dat";
216 if (n == 0) fname =
"Tempus_OperatorSplit_VanDerPol.dat";
218 integrator->getSolutionHistory();
226 double xDotSlope = 0.0;
227 RCP<Tempus::Stepper<double> > stepper = integrator->getStepper();
228 double order = stepper->getOrder();
231 solutions, xErrorNorm, xSlope,
232 solutionsDot, xDotErrorNorm, xDotSlope);
234 TEST_FLOATING_EQUALITY( xSlope, order, 0.05 );
235 TEST_FLOATING_EQUALITY( xDotSlope, order, 0.05 );
236 TEST_FLOATING_EQUALITY( xErrorNorm[0], 1.27294, 1.0e-4 );
237 TEST_FLOATING_EQUALITY( xDotErrorNorm[0], 12.7102, 1.0e-4 );
239 Teuchos::TimeMonitor::summarize();
241 #endif // TEST_VANDERPOL