9#ifndef Tempus_TimeStepControlStrategy_IntegralController_hpp
10#define Tempus_TimeStepControlStrategy_IntegralController_hpp
12#include "Tempus_config.hpp"
15#include "Tempus_SolutionState.hpp"
16#include "Tempus_SolutionHistory.hpp"
74 this->
setName(
"Integral Controller");
80 Scalar KI, Scalar KP, Scalar KD,
81 Scalar safetyFactor, Scalar safetyFactorAfterReject,
82 Scalar facMax, Scalar facMin, std::string name =
"Integral Controller")
102 Teuchos::RCP<SolutionHistory<Scalar> > solutionHistory,
115 RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
119 int order = workingState->getOrder() - 1;
120 Scalar dt = workingState->getTimeStep();
123 Scalar errN = workingState->getErrorRel();
124 Scalar errNm1 = workingState->getErrorRelNm1();
125 Scalar errNm2 = workingState->getErrorRelNm2();
127 if ( errN < numericalTol<Scalar>()) errN = 1.0;
128 if ( errNm1 < numericalTol<Scalar>()) errNm1 = 1.0;
129 if ( errNm2 < numericalTol<Scalar>()) errNm2 = 1.0;
131 Scalar k1 = Teuchos::as<Scalar>(-
KI_ / order);
132 Scalar k2 = Teuchos::as<Scalar>(
KP_ / order);
133 Scalar k3 = Teuchos::as<Scalar>(-
KD_ / order);
135 k1 = std::pow(errN, k1);
136 k2 = std::pow(errNm1, k2);
137 k3 = std::pow(errNm2, k3);
146 beta = std::max(
facMin_, beta);
147 beta = std::min(
facMax_, beta);
155 dt = std::min(dt, workingState->getTimeStep());
166 workingState->setTimeStep(dt);
167 workingState->setTime(solutionHistory->getCurrentState()->getTime() + dt);
174 {
return "Tempus::TimeStepControlStrategyIntegralController"; }
177 const Teuchos::EVerbosityLevel verbLevel)
const override
179 auto l_out = Teuchos::fancyOStream( out.getOStream() );
180 Teuchos::OSTab ostab(*l_out, 2, this->
description());
181 l_out->setOutputToRootOnly(0);
183 *l_out <<
"\n--- " << this->
description() <<
" ---" << std::endl;
185 if (Teuchos::as<int>(verbLevel) >= Teuchos::as<int>(Teuchos::VERB_MEDIUM)) {
187 <<
" Step Type = " << this->
getStepType() << std::endl
189 <<
" KI = " <<
getKI() << std::endl
190 <<
" KP = " <<
getKP() << std::endl
191 <<
" KD = " <<
getKD() << std::endl
194 <<
" Maximum Safety Factor (INPUT) = " <<
facMaxINPUT_ << std::endl
195 <<
" Maximum Safety Factor = " <<
getFacMax() << std::endl
196 <<
" Minimum Safety Factor = " <<
getFacMin() << std::endl;
197 *l_out << std::string(this->
description().length()+8,
'-') <<std::endl;
205 Teuchos::RCP<Teuchos::ParameterList> pl =
206 Teuchos::parameterList(
"Time Step Control Strategy");
208 pl->set<std::string>(
"Strategy Type", this->
getStrategyType(),
"Integral Controller");
210 "Proportional-Integral-Derivative");
211 pl->set<Scalar>(
"KI" ,
getKI(),
"Integral gain");
212 pl->set<Scalar>(
"KP" ,
getKP(),
"Proportional gain");
213 pl->set<Scalar>(
"KD" ,
getKD(),
"Derivative gain");
215 pl->set<Scalar>(
"Safety Factor After Step Rejection",
217 "Safety Factor Following Step Rejection");
218 pl->set<Scalar>(
"Maximum Safety Factor" ,
getFacMax(),
"Maximum Safety Factor");
219 pl->set<Scalar>(
"Minimum Safety Factor" ,
getFacMin(),
"Minimum Safety Factor");
226 TEUCHOS_TEST_FOR_EXCEPTION(
safetyFactor_ <= 0.0, std::out_of_range,
227 "Error - Invalid value of Safety Factory= " <<
safetyFactor_ <<
"! \n"
228 <<
"Safety Factor must be > 0.0.\n");
230 TEUCHOS_TEST_FOR_EXCEPTION(
facMax_ <= 0.0, std::out_of_range,
231 "Error - Invalid value of Maximum Safety Factory= " <<
facMax_ <<
"! \n"
232 <<
"Maximum Safety Factor must be > 0.0.\n");
234 TEUCHOS_TEST_FOR_EXCEPTION(
facMax_<= 0.0, std::out_of_range,
235 "Error - Invalid value of Minimum Safety Factory= " <<
facMin_ <<
"! \n"
236 <<
"Minimum Safety Factor must be > 0.0.\n");
238 TEUCHOS_TEST_FOR_EXCEPTION(((
controller_ !=
"I") &&
241 "Error - Invalid choice of Controller Type = " <<
controller_ <<
"! \n"
242 <<
"Valid Choice are ['I', 'PI', 'PID'].\n");
284template <
class Scalar>
285Teuchos::RCP<TimeStepControlStrategyIntegralController<Scalar> >
287 const Teuchos::RCP<Teuchos::ParameterList> pList,
288 std::string name =
"Integral Controller")
291 auto tscs = rcp(
new TimeStepControlStrategyIntegralController<Scalar>());
292 if (pList == Teuchos::null || pList->numParams() == 0)
return tscs;
294 TEUCHOS_TEST_FOR_EXCEPTION(
295 pList->get<std::string>(
"Strategy Type") !=
296 "Integral Controller", std::logic_error,
297 "Error - Strategy Type != 'Integral Controller'. (='"
298 +pList->get<std::string>(
"Strategy Type")+
"')\n");
300 pList->validateParametersAndSetDefaults(*tscs->getValidParameters());
302 tscs->setController (pList->get<std::string>(
"Controller Type"));
303 tscs->setKI (pList->get<Scalar>(
"KI"));
304 tscs->setKP (pList->get<Scalar>(
"KP"));
305 tscs->setKD (pList->get<Scalar>(
"KD"));
306 tscs->setSafetyFactor(pList->get<Scalar>(
"Safety Factor"));
307 tscs->setSafetyFactorAfterReject(pList->get<Scalar>(
"Safety Factor After Step Rejection"));
308 tscs->setFacMax (pList->get<Scalar>(
"Maximum Safety Factor"));
309 tscs->setFacMin (pList->get<Scalar>(
"Minimum Safety Factor"));
319template<
class Scalar>
323 return Teuchos::rcp_const_cast<Teuchos::ParameterList> (t->getValidParameters());
StepControlStrategy class for TimeStepControl.
virtual Scalar getKD() const
virtual void setKP(Scalar k)
Scalar KP_
Proportional gain.
std::string description() const override
virtual Scalar getSafetyFactorAfterReject() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual Scalar getKI() const
virtual ~TimeStepControlStrategyIntegralController()
Destructor.
virtual Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Return ParameterList with current values.
std::string controller_
Control type ['I', 'PI', 'PID'].
TimeStepControlStrategyIntegralController(std::string controller, Scalar KI, Scalar KP, Scalar KD, Scalar safetyFactor, Scalar safetyFactorAfterReject, Scalar facMax, Scalar facMin, std::string name="Integral Controller")
Full Constructor.
virtual Scalar getKP() const
Scalar KD_
Derivative gain.
virtual Scalar getSafetyFactor() const
Scalar facMaxINPUT_
Maximum Safety Factor from input.
virtual void setSafetyFactorAfterReject(Scalar f)
virtual Scalar getFacMin() const
Scalar facMax_
Maximum Safety Factor.
virtual void setKD(Scalar k)
virtual std::string getController() const
virtual void setNextTimeStep(const TimeStepControl< Scalar > &tsc, Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory, Status &) override
Set the time step size.
Scalar safetyFactorAfterReject_
Safety Factor Following Step Rejection.
virtual void setFacMax(Scalar f)
virtual void setController(std::string c)
virtual Scalar getFacMax() const
virtual void setKI(Scalar k)
Scalar safetyFactor_
Safety Factor.
virtual void initialize() const override
TimeStepControlStrategyIntegralController()
Default Constructor.
virtual void setFacMin(Scalar f)
virtual void setSafetyFactor(Scalar f)
bool firstSuccessfulStep_
Scalar facMin_
Minimum Safety Factor.
TimeStepControlStrategy class for TimeStepControl.
virtual void setStrategyType(std::string s)
virtual void checkInitialized()
bool isInitialized_
Bool if strategy is initialized.
virtual void setStepType(std::string s)
virtual std::string getStrategyType() const
virtual void setName(std::string s)
virtual std::string getStepType() const
Status
Status for the Integrator, the Stepper and the SolutionState.
Teuchos::RCP< Teuchos::ParameterList > getTimeStepControlStrategyIntegralControllerPL()
Nonmember function to return ParameterList with default values.
Teuchos::RCP< TimeStepControlStrategyIntegralController< Scalar > > createTimeStepControlStrategyIntegralController(const Teuchos::RCP< Teuchos::ParameterList > pList, std::string name="Integral Controller")