9 #ifndef Tempus_TimeStepControlStrategy_BasicVS_hpp 10 #define Tempus_TimeStepControlStrategy_BasicVS_hpp 12 #include "Tempus_TimeStepControl.hpp" 14 #include "Tempus_SolutionState.hpp" 15 #include "Tempus_SolutionStateMetaData.hpp" 16 #include "Tempus_SolutionHistory.hpp" 20 #include "Thyra_VectorStdOps.hpp" 104 template<
class Scalar>
112 Teuchos::RCP<Teuchos::ParameterList> pList = Teuchos::null){
123 Status & integratorStatus)
override 126 RCP<SolutionState<Scalar> > workingState=
solutionHistory->getWorkingState();
127 RCP<SolutionStateMetaData<Scalar> > metaData = workingState->getMetaData();
128 const Scalar errorAbs = metaData->getErrorAbs();
129 const Scalar errorRel = metaData->getErrorRel();
130 int order = metaData->getOrder();
131 Scalar dt = metaData->getDt();
133 Teuchos::as<int>(Teuchos::VERB_NONE);
135 RCP<Teuchos::FancyOStream> out = tsc.getOStream();
136 Teuchos::OSTab ostab(out,1,
"getNextTimeStep");
138 auto changeDT = [] (Scalar dt_old, Scalar dt_new, std::string reason) {
139 std::stringstream message;
141 " (dt = "<<std::scientific<<std::setw(9)<<std::setprecision(3)<<dt_old
142 <<
", new = "<<std::scientific<<std::setw(9)<<std::setprecision(3)<<dt_new
143 <<
") " << reason << std::endl;
144 return message.str();
153 if (printChanges) *out << changeDT(dt, dt*sigma,
154 "Stepper failure - Decreasing dt.");
159 if (printChanges) *out << changeDT(dt, dt*rho,
160 "Monitoring Value (eta) is too small (" 161 + std::to_string(eta) +
" < " + std::to_string(
getMinEta())
162 +
"). Increasing dt.");
166 if (printChanges) *out << changeDT(dt, dt*sigma,
167 "Monitoring Value (eta) is too large (" 168 + std::to_string(eta) +
" > " + std::to_string(
getMaxEta())
169 +
"). Decreasing dt.");
173 if (printChanges) *out << changeDT(dt, dt*sigma,
174 "Absolute error is too large (" 175 + std::to_string(errorAbs)+
" > "+std::to_string(tsc.
getMaxAbsError())
176 +
"). Decreasing dt.");
180 if (printChanges) *out << changeDT(dt, dt*sigma,
181 "Relative error is too large (" 182 + std::to_string(errorRel)+
" > "+std::to_string(tsc.
getMaxRelError())
183 +
"). Decreasing dt.");
187 if (printChanges) *out << changeDT(dt, dt*rho,
188 "Order is too small (" 189 + std::to_string(order) +
" < " + std::to_string(tsc.
getMinOrder())
190 +
"). Increasing dt.");
194 if (printChanges) *out << changeDT(dt, dt*sigma,
195 "Order is too large (" 196 + std::to_string(order) +
" > " + std::to_string(tsc.
getMaxOrder())
197 +
"). Decreasing dt.");
204 "dt is too small. Resetting to minimum dt.");
209 "dt is too large. Resetting to maximum dt.");
213 metaData->setOrder(order);
220 const Teuchos::RCP<Teuchos::ParameterList> & pList)
override 222 if (pList == Teuchos::null) {
224 if (
tscsPL_ == Teuchos::null) {
225 tscsPL_ = Teuchos::parameterList(
"TimeStepControlStrategyBasicVS");
233 TEUCHOS_TEST_FOR_EXCEPTION(
getAmplFactor() <= 1.0, std::out_of_range,
234 "Error - Invalid value of Amplification Factor = " <<
getAmplFactor()
235 <<
"! \n" <<
"Amplification Factor must be > 1.0.\n");
237 TEUCHOS_TEST_FOR_EXCEPTION(
getReductFactor() >= 1.0, std::out_of_range,
239 <<
"! \n" <<
"Reduction Factor must be < 1.0.\n");
242 "Error - Invalid values of 'Minimum Value Monitoring Function' = " 243 <<
getMinEta() <<
"\n and 'Maximum Value Monitoring Function' = " 244 <<
getMaxEta() <<
"! \n Mininum Value cannot be > Maximum Value! \n");
248 Teuchos::RCP<const Teuchos::ParameterList>
250 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
254 pl->set<
double>(
"Amplification Factor", 1.75,
"Amplification factor");
255 pl->set<
double>(
"Reduction Factor" , 0.5 ,
"Reduction factor");
258 pl->set<
double>(
"Minimum Value Monitoring Function", 0.0 ,
"Min value eta");
259 pl->set<
double>(
"Maximum Value Monitoring Function", 1.0e-16,
"Max value eta");
260 pl->set<std::string>(
"Name",
"Basic VS");
269 Teuchos::RCP<Teuchos::ParameterList> temp_plist =
tscsPL_;
276 {
return tscsPL_->get<
double>(
"Amplification Factor"); }
278 {
return tscsPL_->get<
double>(
"Reduction Factor");}
280 {
return tscsPL_->get<
double>(
"Minimum Value Monitoring Function"); }
282 {
return tscsPL_->get<
double>(
"Maximum Value Monitoring Function"); }
289 const double eps = 1.0e4*std::numeric_limits<double>::epsilon();
290 RCP<Teuchos::FancyOStream> out = tsc.getOStream();
297 RCP<const Thyra::VectorBase<Scalar> > xOld = (*solutionHistory)[numStates-3]->getX();
298 RCP<const Thyra::VectorBase<Scalar> > x = (*solutionHistory)[numStates-1]->getX();
301 #ifdef VERBOSE_DEBUG_OUTPUT 302 Teuchos::Range1D range;
303 *out <<
"\n*** xOld ***\n";
304 RTOpPack::ConstSubVectorView<Scalar> xOldv;
305 xOld->acquireDetachedView(range, &xOldv);
306 auto xoa = xOldv.values();
307 for (
auto i = 0; i < xoa.size(); ++i) *out << xoa[i] <<
" ";
308 *out <<
"\n*** xOld ***\n";
309 *out <<
"\n*** x ***\n";
310 RTOpPack::ConstSubVectorView<Scalar> xv;
311 x->acquireDetachedView(range, &xv);
312 auto xa = xv.values();
313 for (
auto i = 0; i < xa.size(); ++i) *out << xa[i] <<
" ";
314 *out <<
"\n*** x ***\n";
317 RCP<Thyra::VectorBase<Scalar> > xDiff = Thyra::createMember(x->space());
318 Thyra::V_VmV(xDiff.ptr(), *x, *xOld);
319 Scalar xDiffNorm = Thyra::norm(*xDiff);
320 Scalar xOldNorm = Thyra::norm(*xOld);
322 eta = xDiffNorm/(xOldNorm + eps);
323 #ifdef VERBOSE_DEBUG_OUTPUT 324 *out <<
"IKT xDiffNorm, xOldNorm, eta = " << xDiffNorm <<
", " << xOldNorm
325 <<
", " << eta <<
"\n";
334 #endif // Tempus_TimeStepControlStrategy_BasicVS_hpp
Scalar computeEta(const TimeStepControl< Scalar > tsc, const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
StepControlStrategy class for TimeStepControl.
virtual int getMinOrder() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pList) override
virtual ~TimeStepControlStrategyBasicVS()
Destructor.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList() override
Teuchos::RCP< Teuchos::ParameterList > tscsPL_
virtual void getNextTimeStep(const TimeStepControl< Scalar > tsc, Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory, Status &integratorStatus) override
Determine the time step size.
TimeStepControlStrategyBasicVS(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Constructor.
Status
Status for the Integrator, the Stepper and the SolutionState.
virtual Scalar getMaxEta() const
virtual Scalar getMinEta() const
TimeStepControl manages the time step size. There several mechanicisms that effect the time step size...
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
virtual Scalar getMaxAbsError() const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual Scalar getMaxRelError() const
virtual Scalar getMinTimeStep() const
virtual Scalar getMaxTimeStep() const
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList() override
StepControlStrategy class for TimeStepControl.
virtual Scalar getReductFactor() const
virtual int getMaxOrder() const
virtual Scalar getAmplFactor() const