9 #include "Teuchos_UnitTestHarness.hpp" 10 #include "Teuchos_XMLParameterListHelpers.hpp" 11 #include "Teuchos_TimeMonitor.hpp" 12 #include "Teuchos_DefaultComm.hpp" 14 #include "Thyra_VectorStdOps.hpp" 16 #include "Tempus_StepperFactory.hpp" 17 #include "Tempus_TimeStepControl.hpp" 20 #include "../TestModels/SinCosModel.hpp" 21 #include "../TestModels/DahlquistTestModel.hpp" 22 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp" 31 using Teuchos::rcp_const_cast;
32 using Teuchos::rcp_dynamic_cast;
33 using Teuchos::ParameterList;
34 using Teuchos::sublist;
35 using Teuchos::getParametersFromXmlFile;
43 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
46 TEUCHOS_TEST_FOR_EXCEPT(tscs->getStepType() !=
"Variable");
47 TEUCHOS_TEST_FOR_EXCEPT(tscs->getController() !=
"PID");
48 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKI() != 0.58);
49 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.21);
50 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.10);
51 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.90);
52 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.90);
53 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 5.0);
54 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.5);
57 tscs->setController(
"I"); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
58 tscs->setKI(0.6); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
59 tscs->setKP(0.0); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
60 tscs->setKD(0.0); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
61 tscs->setSafetyFactor(0.8); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
62 tscs->setSafetyFactorAfterReject(0.8); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
63 tscs->setFacMax(4.0); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
64 tscs->setFacMin(0.4); tscs->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
66 TEUCHOS_TEST_FOR_EXCEPT(tscs->getStepType() !=
"Variable");
67 TEUCHOS_TEST_FOR_EXCEPT(tscs->getController() !=
"I");
68 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKI() != 0.6);
69 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
70 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
71 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
72 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
73 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
74 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
83 "I", 0.6, 0.0, 0.0, 0.8, 0.8, 4.0, 0.4));
84 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
86 TEUCHOS_TEST_FOR_EXCEPT(tscs->getStepType() !=
"Variable");
87 TEUCHOS_TEST_FOR_EXCEPT(tscs->getController() !=
"I");
88 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKI() != 0.6);
89 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
90 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
91 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
92 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
93 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
94 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
102 auto pl = Tempus::getTimeStepControlStrategyIntegralControllerPL<double>();
104 pl->set<std::string>(
"Controller Type",
"I");
105 pl->set<
double>(
"KI", 0.6);
106 pl->set<
double>(
"KP", 0.0);
107 pl->set<
double>(
"KD", 0.0);
108 pl->set<
double>(
"Safety Factor", 0.8);
109 pl->set<
double>(
"Safety Factor After Step Rejection", 0.8);
110 pl->set<
double>(
"Maximum Safety Factor", 4.0);
111 pl->set<
double>(
"Minimum Safety Factor", 0.4);
113 auto tscs = Tempus::createTimeStepControlStrategyIntegralController<double>(pl);
115 TEUCHOS_TEST_FOR_EXCEPT(tscs->getStepType() !=
"Variable");
116 TEUCHOS_TEST_FOR_EXCEPT(tscs->getController() !=
"I");
117 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKI() != 0.6);
118 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
119 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
120 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
121 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
122 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
123 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
134 double safetyFactor = 0.9;
135 double safetyFactorAfterReject = 0.9;
141 "PID", KI, KP, KD, safetyFactor, safetyFactorAfterReject,
146 tsc->setTimeStepControlStrategy(tscs);
147 tsc->setInitTime(0.0);
148 tsc->setFinalTime(10.0);
149 tsc->setMinTimeStep (0.01);
150 tsc->setInitTimeStep(1.0);
151 tsc->setMaxTimeStep (10.0);
152 tsc->setFinalIndex(100);
154 TEUCHOS_TEST_FOR_EXCEPT(!tsc->isInitialized());
159 auto inArgsIC = model->getNominalValues();
161 auto icState = Tempus::createSolutionStateX<double>(icSolution);
165 solutionHistory->addState(icState);
166 solutionHistory->getCurrentState()->setTimeStep(1.0);
167 solutionHistory->getCurrentState()->setTime(0.0);
168 solutionHistory->getCurrentState()->setIndex(0);
169 solutionHistory->getCurrentState()->setOrder(order);
175 solutionHistory->initWorkingState();
176 auto currentState = solutionHistory->getCurrentState();
177 auto workingState = solutionHistory->getWorkingState();
179 TEST_FLOATING_EQUALITY(workingState->getErrorRel() , 0.0, 1.0e-14);
180 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm1(), 0.0, 1.0e-14);
181 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm2(), 0.0, 1.0e-14);
183 tsc->setNextTimeStep(solutionHistory, status);
187 TEST_FLOATING_EQUALITY(workingState->getTimeStep(), 1.0, 1.0e-14);
191 workingState->setErrorRel(errN);
197 solutionHistory->initWorkingState();
198 currentState = solutionHistory->getCurrentState();
199 workingState = solutionHistory->getWorkingState();
200 double dt = workingState->getTimeStep();
202 TEST_FLOATING_EQUALITY(workingState->getErrorRel() , 0.1, 1.0e-14);
203 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm1(), 0.0, 1.0e-14);
204 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm2(), 0.0, 1.0e-14);
206 tsc->setNextTimeStep(solutionHistory, status);
208 double p = order - 1.0;
209 double dtNew = dt*safetyFactor*std::pow(errN, -KI/p);
210 TEST_FLOATING_EQUALITY(workingState->getTimeStep(), dtNew, 1.0e-14);
215 workingState->setErrorRel(errN);
221 solutionHistory->initWorkingState();
222 currentState = solutionHistory->getCurrentState();
223 workingState = solutionHistory->getWorkingState();
224 dt = workingState->getTimeStep();
226 TEST_FLOATING_EQUALITY(workingState->getErrorRel() , 0.2, 1.0e-14);
227 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm1(), 0.1, 1.0e-14);
228 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm2(), 0.0, 1.0e-14);
230 tsc->setNextTimeStep(solutionHistory, status);
232 dtNew = dt*safetyFactor*std::pow(errN, -KI/p)
233 *std::pow(errNm1, KP/p);
234 TEST_FLOATING_EQUALITY(workingState->getTimeStep(), dtNew, 1.0e-14);
240 workingState->setErrorRel(errN);
246 solutionHistory->initWorkingState();
247 currentState = solutionHistory->getCurrentState();
248 workingState = solutionHistory->getWorkingState();
249 dt = workingState->getTimeStep();
251 TEST_FLOATING_EQUALITY(workingState->getErrorRel() , 0.3, 1.0e-14);
252 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm1(), 0.2, 1.0e-14);
253 TEST_FLOATING_EQUALITY(workingState->getErrorRelNm2(), 0.1, 1.0e-14);
255 tsc->setNextTimeStep(solutionHistory, status);
257 dtNew = dt*safetyFactor*std::pow(errN, -KI/p)
258 *std::pow(errNm1, KP/p)
259 *std::pow(errNm2, -KD/p);
260 TEST_FLOATING_EQUALITY(workingState->getTimeStep(), dtNew, 1.0e-14);
271 auto pl = tscs->getValidParameters();
273 TEST_COMPARE ( pl->get<std::string>(
"Strategy Type"), ==,
"Integral Controller");
274 TEST_COMPARE ( pl->get<std::string>(
"Controller Type"), ==,
"PID");
275 TEST_FLOATING_EQUALITY( pl->get<
double>(
"KI"), 0.58, 1.0e-14);
276 TEST_FLOATING_EQUALITY( pl->get<
double>(
"KP"), 0.21, 1.0e-14);
277 TEST_FLOATING_EQUALITY( pl->get<
double>(
"KD"), 0.10, 1.0e-14);
278 TEST_FLOATING_EQUALITY( pl->get<
double>(
"Safety Factor"), 0.9, 1.0e-14);
279 TEST_FLOATING_EQUALITY( pl->get<
double>(
"Safety Factor After Step Rejection"), 0.9, 1.0e-14);
280 TEST_FLOATING_EQUALITY( pl->get<
double>(
"Maximum Safety Factor"), 5.0, 1.0e-14);
281 TEST_FLOATING_EQUALITY( pl->get<
double>(
"Minimum Safety Factor"), 0.5, 1.0e-14);
284 std::ostringstream unusedParameters;
285 pl->unused(unusedParameters);
286 TEST_COMPARE ( unusedParameters.str(), ==,
"");
The classic Dahlquist Test Problem.
Status
Status for the Integrator, the Stepper and the SolutionState.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
StepControlStrategy class for TimeStepControl.