11 #include "Tempus_TimeStepControl.hpp"
14 #include "../TestModels/DahlquistTestModel.hpp"
16 namespace Tempus_Unit_Test {
21 using Teuchos::rcp_const_cast;
22 using Teuchos::rcp_dynamic_cast;
23 using Teuchos::sublist;
38 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.21);
39 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.10);
40 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.90);
41 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.90);
42 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 5.0);
43 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.5);
46 tscs->setController(
"I");
48 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
51 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
54 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
57 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
58 tscs->setSafetyFactor(0.8);
60 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
61 tscs->setSafetyFactorAfterReject(0.8);
63 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
66 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
69 TEUCHOS_TEST_FOR_EXCEPT(!tscs->isInitialized());
71 TEUCHOS_TEST_FOR_EXCEPT(tscs->getStepType() !=
"Variable");
72 TEUCHOS_TEST_FOR_EXCEPT(tscs->getController() !=
"I");
73 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKI() != 0.6);
74 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
75 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
76 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
77 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
78 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
79 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
87 "I", 0.6, 0.0, 0.0, 0.8, 0.8, 4.0, 0.4));
93 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
94 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
95 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
96 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
97 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
98 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
106 auto pl = Tempus::getTimeStepControlStrategyIntegralControllerPL<double>();
108 pl->set<std::string>(
"Controller Type",
"I");
109 pl->set<
double>(
"KI", 0.6);
110 pl->set<
double>(
"KP", 0.0);
111 pl->set<
double>(
"KD", 0.0);
112 pl->set<
double>(
"Safety Factor", 0.8);
113 pl->set<
double>(
"Safety Factor After Step Rejection", 0.8);
114 pl->set<
double>(
"Maximum Safety Factor", 4.0);
115 pl->set<
double>(
"Minimum Safety Factor", 0.4);
118 Tempus::createTimeStepControlStrategyIntegralController<double>(pl);
123 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKP() != 0.0);
124 TEUCHOS_TEST_FOR_EXCEPT(tscs->getKD() != 0.0);
125 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactor() != 0.8);
126 TEUCHOS_TEST_FOR_EXCEPT(tscs->getSafetyFactorAfterReject() != 0.8);
127 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMax() != 4.0);
128 TEUCHOS_TEST_FOR_EXCEPT(tscs->getFacMin() != 0.4);
138 double safetyFactor = 0.9;
139 double safetyFactorAfterReject = 0.9;
144 "PID", KI, KP, KD, safetyFactor, safetyFactorAfterReject, facMax,
149 tsc->setTimeStepControlStrategy(tscs);
150 tsc->setInitTime(0.0);
151 tsc->setFinalTime(10.0);
152 tsc->setMinTimeStep(0.01);
153 tsc->setInitTimeStep(1.0);
154 tsc->setMaxTimeStep(10.0);
155 tsc->setFinalIndex(100);
162 auto inArgsIC = model->getNominalValues();
165 auto icState = Tempus::createSolutionStateX<double>(icSolution);
169 solutionHistory->addState(icState);
170 solutionHistory->getCurrentState()->setTimeStep(1.0);
171 solutionHistory->getCurrentState()->setTime(0.0);
172 solutionHistory->getCurrentState()->setIndex(0);
173 solutionHistory->getCurrentState()->setOrder(order);
178 solutionHistory->initWorkingState();
179 auto currentState = solutionHistory->getCurrentState();
180 auto workingState = solutionHistory->getWorkingState();
186 tsc->setNextTimeStep(solutionHistory, status);
194 workingState->setErrorRel(errN);
198 solutionHistory->initWorkingState();
199 currentState = solutionHistory->getCurrentState();
200 workingState = solutionHistory->getWorkingState();
201 double dt = workingState->getTimeStep();
207 tsc->setNextTimeStep(solutionHistory, status);
209 double p = order - 1.0;
210 double dtNew = dt * safetyFactor * std::pow(errN, -KI / p);
216 workingState->setErrorRel(errN);
220 solutionHistory->initWorkingState();
221 currentState = solutionHistory->getCurrentState();
222 workingState = solutionHistory->getWorkingState();
223 dt = workingState->getTimeStep();
229 tsc->setNextTimeStep(solutionHistory, status);
232 dt * safetyFactor * std::pow(errN, -KI / p) * std::pow(errNm1, KP / p);
239 workingState->setErrorRel(errN);
243 solutionHistory->initWorkingState();
244 currentState = solutionHistory->getCurrentState();
245 workingState = solutionHistory->getWorkingState();
246 dt = workingState->getTimeStep();
252 tsc->setNextTimeStep(solutionHistory, status);
254 dtNew = dt * safetyFactor * std::pow(errN, -KI / p) *
255 std::pow(errNm1, KP / p) * std::pow(errNm2, -KD / p);
266 auto pl = tscs->getValidParameters();
269 "Integral Controller");
270 TEST_COMPARE(pl->get<std::string>(
"Controller Type"), ==,
"PID");
283 std::ostringstream unusedParameters;
284 pl->unused(unusedParameters);
The classic Dahlquist Test Problem.
#define TEST_COMPARE(v1, comp, v2)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
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.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)