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