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")
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();
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")
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());
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
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.
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
TimeStepControlStrategy()
Constructor.
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
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")
const Scalar numericalTol()
Numerical Tolerance (approx. max. significant digits minus two)