29 #ifndef Rythmos_IMPLICITBDF_STEPPER_DEF_H 
   30 #define Rythmos_IMPLICITBDF_STEPPER_DEF_H 
   32 #include "Rythmos_ImplicitBDFStepper_decl.hpp" 
   33 #include "Rythmos_StepperHelpers.hpp" 
   34 #include "Rythmos_ImplicitBDFStepperStepControl.hpp" 
   42 template<
class Scalar>
 
   43 RCP<ImplicitBDFStepper<Scalar> > implicitBDFStepper() {
 
   44   RCP<ImplicitBDFStepper<Scalar> >
 
   45     stepper = rcp(
new ImplicitBDFStepper<Scalar>() );
 
   49 template<
class Scalar>
 
   50 RCP<ImplicitBDFStepper<Scalar> > implicitBDFStepper(
 
   51   const RCP<Thyra::ModelEvaluator<Scalar> >& model,
 
   52   const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
 
   55   RCP<ImplicitBDFStepper<Scalar> >
 
   56     stepper = Teuchos::rcp(
new ImplicitBDFStepper<Scalar>(model, solver));
 
   60 template<
class Scalar>
 
   61 RCP<ImplicitBDFStepper<Scalar> > implicitBDFStepper(
 
   62   const RCP<Thyra::ModelEvaluator<Scalar> >& model,
 
   63   const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
 
   64   const RCP<Teuchos::ParameterList>& parameterList
 
   67   RCP<ImplicitBDFStepper<Scalar> >
 
   68     stepper = Teuchos::rcp(
new ImplicitBDFStepper<Scalar>(model,
 
   77 template<
class Scalar>
 
   80   this->defaultInitializeAll_();
 
   81   haveInitialCondition_ = 
false;
 
   86 template<
class Scalar>
 
   88   const RCP<Thyra::ModelEvaluator<Scalar> >& model
 
   89   ,
const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
 
   90   ,
const RCP<Teuchos::ParameterList>& parameterList
 
   93   this->defaultInitializeAll_();
 
   94   this->setParameterList(parameterList);
 
   98   haveInitialCondition_ = 
false;
 
  103 template<
class Scalar>
 
  105   const RCP<Thyra::ModelEvaluator<Scalar> >& model
 
  106   ,
const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver
 
  109   this->defaultInitializeAll_();
 
  113   haveInitialCondition_ = 
false;
 
  114   isInitialized_=
false;
 
  117 template<
class Scalar>
 
  118 const Thyra::VectorBase<Scalar>&
 
  121   TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_,std::logic_error,
 
  122       "Error, attempting to call getxHistory before initialization!\n");
 
  123   TEUCHOS_TEST_FOR_EXCEPT( !(( 0 <= index ) && ( index <= maxOrder_ )) );
 
  124   TEUCHOS_TEST_FOR_EXCEPT( !( index <= usedOrder_+1 ) );
 
  125   return(*(xHistory_[index]));
 
  128 template<
class Scalar>
 
  131   TEUCHOS_TEST_FOR_EXCEPTION(stepControl == Teuchos::null,std::logic_error,
"Error, stepControl == Teuchos::null!\n");
 
  132   stepControl_ = stepControl;
 
  135 template<
class Scalar>
 
  138   return(stepControl_);
 
  141 template<
class Scalar>
 
  144   return(stepControl_);
 
  151 template<
class Scalar>
 
  154   TEUCHOS_TEST_FOR_EXCEPT(solver == Teuchos::null)
 
  159 template<
class Scalar>
 
  160 RCP<Thyra::NonlinearSolverBase<Scalar> >
 
  167 template<
class Scalar>
 
  168 RCP<const Thyra::NonlinearSolverBase<Scalar> >
 
  178 template<
class Scalar>
 
  184 template<
class Scalar>
 
  191 template<
class Scalar>
 
  192 RCP<StepperBase<Scalar> >
 
  199   RCP<ImplicitBDFStepper<Scalar> >
 
  202   if (!is_null(model_))
 
  203     stepper->setModel(model_); 
 
  205   if (!is_null(solver_))
 
  206     stepper->setSolver(solver_->cloneNonlinearSolver().assert_not_null());
 
  208   if (!is_null(parameterList_))
 
  209     stepper->setParameterList(Teuchos::parameterList(*parameterList_));
 
  211   if (!is_null(stepControl_)) {
 
  212     if (stepControl_->supportsCloning())
 
  213       stepper->setStepControlStrategy(
 
  214         stepControl_->cloneStepControlStrategyAlgorithm().assert_not_null());
 
  227 template<
class Scalar>
 
  229   const RCP<
const Thyra::ModelEvaluator<Scalar> >& model
 
  233   TEUCHOS_TEST_FOR_EXCEPT( is_null(model) );
 
  234   assertValidModel( *
this, *model );
 
  238 template<
class Scalar>
 
  240   const RCP<Thyra::ModelEvaluator<Scalar> >& model
 
  243   this->setModel(model); 
 
  247 template<
class Scalar>
 
  248 RCP<const Thyra::ModelEvaluator<Scalar> >
 
  255 template<
class Scalar>
 
  256 RCP<Thyra::ModelEvaluator<Scalar> >
 
  259   return Teuchos::null;
 
  263 template<
class Scalar>
 
  265   const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
 
  268   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  270   TEUCHOS_TEST_FOR_EXCEPT(is_null(initialCondition.get_x()));
 
  271   TEUCHOS_TEST_FOR_EXCEPT(is_null(initialCondition.get_x_dot()));
 
  272   basePoint_ = initialCondition;
 
  273   xn0_ = initialCondition.get_x()->clone_v();
 
  274   xpn0_ = initialCondition.get_x_dot()->clone_v();
 
  275   time_ = initialCondition.get_t();
 
  277   x_dot_base_ = createMember(xpn0_->space());
 
  278   V_S(x_dot_base_.ptr(),ST::zero());
 
  279   ee_ = createMember(xn0_->space());
 
  280   V_S(ee_.ptr(),ST::zero());
 
  283   xHistory_.push_back(xn0_->clone_v());
 
  284   xHistory_.push_back(xpn0_->clone_v());
 
  286   haveInitialCondition_ = 
true;
 
  287   if (isInitialized_) {
 
  293 template<
class Scalar>
 
  294 Thyra::ModelEvaluatorBase::InArgs<Scalar>
 
  301 template<
class Scalar>
 
  305   RYTHMOS_FUNC_TIME_MONITOR(
"Rythmos::ImplicitBDFStepper::takeStep");
 
  308   using Teuchos::incrVerbLevel;
 
  309   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  311   typedef Thyra::NonlinearSolverBase<Scalar> NSB;
 
  312   typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
 
  314   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  315   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  316   Teuchos::OSTab ostab(out,1,
"takeStep");
 
  317   VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
 
  319   if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
 
  321       << 
"\nEntering " << this->Teuchos::Describable::description()
 
  322       << 
"::takeStep("<<dt<<
","<<toString(stepType)<<
") ...\n";
 
  325   if (!isInitialized_) {
 
  329   stepControl_->setOStream(out);
 
  330   stepControl_->setVerbLevel(verbLevel);
 
  331   stepControl_->setRequestedStepSize(*
this,dt,stepType);
 
  333   AttemptedStepStatusFlag status;
 
  338     stepControl_->nextStepSize(*
this,&hh_,&stepType,&desiredOrder);
 
  339     TEUCHOS_TEST_FOR_EXCEPT(!((1 <= desiredOrder) &&
 
  340                               (desiredOrder <= maxOrder_)));
 
  341     TEUCHOS_TEST_FOR_EXCEPT(!(desiredOrder <= usedOrder_+1));
 
  342     currentOrder_ = desiredOrder;
 
  343     if (numberOfSteps_ == 0) {
 
  346         Vt_S(xHistory_[1].ptr(),hh_);
 
  348         Vt_S(xHistory_[1].ptr(),hh_/hh_old);
 
  351     this->updateCoeffs_();
 
  367     Scalar coeff_x_dot = Scalar(-ST::one())*alpha_s_/hh_;
 
  368     V_StVpStV( x_dot_base_.ptr(), ST::one(), *xpn0_, alpha_s_/hh_, *xn0_ );
 
  369     if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_EXTREME) ) {
 
  370       *out << 
"model_ = " << std::endl;
 
  371       model_->describe(*out,verbLevel);
 
  372       *out << 
"basePoint_ = " << std::endl;
 
  373       basePoint_.describe(*out,verbLevel);
 
  374       *out << 
"coeff_x_dot = " << coeff_x_dot << std::endl;
 
  375       *out << 
"x_dot_base_ = " << std::endl;
 
  376       x_dot_base_->describe(*out,verbLevel);
 
  377       *out << 
"time_+hh_ = " << time_+hh_ << std::endl;
 
  378       *out << 
"xn0_ = " << std::endl;
 
  379       xn0_->describe(*out,verbLevel);
 
  381     neModel_.initializeSingleResidualModel(
 
  383       coeff_x_dot, x_dot_base_,
 
  384       ST::one(), Teuchos::null,
 
  391     if (solver_->getModel().get() != &neModel_) {
 
  392       solver_->setModel( Teuchos::rcpFromRef(neModel_) );
 
  407     if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_EXTREME) ) {
 
  408       *out << 
"xn0 = " << std::endl;
 
  409       xn0_->describe(*out,verbLevel);
 
  410       *out << 
"ee = " << std::endl;
 
  411       ee_->describe(*out,verbLevel);
 
  413     nonlinearSolveStatus_ = solver_->solve( &*xn0_, NULL, &*ee_ );
 
  414     if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_EXTREME) ) {
 
  415       *out << 
"xn0 = " << std::endl;
 
  416       xn0_->describe(*out,verbLevel);
 
  417       *out << 
"ee = " << std::endl;
 
  418       ee_->describe(*out,verbLevel);
 
  424     if (nonlinearSolveStatus_.solveStatus == Thyra::SOLVE_STATUS_CONVERGED)  {
 
  425       newtonConvergenceStatus_ = 0;
 
  428       newtonConvergenceStatus_ = -1;
 
  432     stepControl_->setCorrection(*
this,xn0_,ee_,newtonConvergenceStatus_);
 
  433     bool stepPass = stepControl_->acceptStep(*
this,&LETvalue_);
 
  435     if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  436       *out << 
"xn0_ = " << std::endl;
 
  437       xn0_->describe(*out,verbLevel);
 
  438       *out << 
"xpn0_ = " << std::endl;
 
  439       xpn0_->describe(*out,verbLevel);
 
  440       *out << 
"ee_ = " << std::endl;
 
  441       ee_->describe(*out,verbLevel);
 
  442       for (
int i=0; i<std::max(2,maxOrder_); ++i) {
 
  443         *out << 
"xHistory_[" << i << 
"] = " << std::endl;
 
  444         xHistory_[i]->describe(*out,verbLevel);
 
  450       stepLETStatus_ = STEP_LET_STATUS_FAILED;
 
  451       status = stepControl_->rejectStep(*
this);
 
  453       if (status == CONTINUE_ANYWAY) {
 
  459       stepLETStatus_ = STEP_LET_STATUS_PASSED;
 
  467   stepControl_->completeStep(*
this);
 
  469   if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
 
  471       << 
"\nLeaving " << this->Teuchos::Describable::description()
 
  472       << 
"::takeStep("<<dt<<
","<<toString(stepType)<<
") ...\n";
 
  479 template<
class Scalar>
 
  486   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  488   if (!isInitialized_) {
 
  489     stepStatus.
message = 
"This stepper is uninitialized.";
 
  490     stepStatus.
stepStatus = STEP_STATUS_UNINITIALIZED;
 
  491     stepStatus.
stepSize = Scalar(-ST::one());
 
  492     stepStatus.
order = -1;
 
  493     stepStatus.
time = Scalar(-ST::one());
 
  496   else if (numberOfSteps_ > 0) {
 
  497     stepStatus.
stepStatus = STEP_STATUS_CONVERGED;
 
  504   stepStatus.
order = usedOrder_;
 
  505   stepStatus.
time = time_;
 
  507   if(xHistory_.size() > 0)
 
  510     stepStatus.
solution = Teuchos::null;
 
  512   stepStatus.
residual = Teuchos::null; 
 
  522 template<
class Scalar>
 
  523 RCP<const Thyra::VectorSpaceBase<Scalar> >
 
  527   return ( !is_null(model_) ? model_->get_x_space() : Teuchos::null );
 
  531 template<
class Scalar>
 
  533   const Array<Scalar>& ,
 
  534   const Array<RCP<
const Thyra::VectorBase<Scalar> > >& ,
 
  535   const Array<RCP<
const Thyra::VectorBase<Scalar> > >& 
 
  538   TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
 
  539     "Error, addPoints is not implemented for ImplicitBDFStepper.\n");
 
  543 template<
class Scalar>
 
  546   if ( !isInitialized_ && haveInitialCondition_ )
 
  547     return timeRange<Scalar>(time_,time_);
 
  548   if ( !isInitialized_ && !haveInitialCondition_ )
 
  549     return invalidTimeRange<Scalar>();
 
  550   return timeRange<Scalar>(time_-usedStep_,time_);
 
  554 template<
class Scalar>
 
  556   const Array<Scalar>& time_vec
 
  557   ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* x_vec
 
  558   ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* xdot_vec
 
  559   ,Array<ScalarMag>* accuracy_vec)
 const 
  562   using Teuchos::constOptInArg;
 
  565   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  566   typedef typename ST::magnitudeType mScalarMag;
 
  568   TEUCHOS_ASSERT(haveInitialCondition_);
 
  570   if ( (numberOfSteps_ == -1) &&
 
  571        (time_vec.length() == 1) &&
 
  572        (compareTimeValues<Scalar>(time_vec[0],time_)==0) ) {
 
  573     defaultGetPoints<Scalar>(
 
  574         time_, constOptInArg(*xn0_), constOptInArg(*xpn0_),
 
  575         time_, constOptInArg(*xn0_), constOptInArg(*xpn0_),
 
  576         time_vec, ptr(x_vec), ptr(xdot_vec), ptr(accuracy_vec),
 
  577         Ptr<InterpolatorBase<Scalar> >(null)
 
  581   TEUCHOS_ASSERT(isInitialized_);
 
  582   RYTHMOS_FUNC_TIME_MONITOR(
"Rythmos::ImplicitBDFStepper::getPoints");
 
  587   for (Teuchos::Ordinal i=0 ; i<time_vec.size() ; ++i) {
 
  588     RCP<Thyra::VectorBase<Scalar> >
 
  589       x_temp = createMember(xn0_->space());
 
  590     RCP<Thyra::VectorBase<Scalar> >
 
  591       xdot_temp = createMember(xn0_->space());
 
  592     mScalarMag accuracy = -ST::zero();
 
  593     interpolateSolution_(
 
  594       time_vec[i], &*x_temp, &*xdot_temp,
 
  595       accuracy_vec ? &accuracy : 0
 
  598       x_vec->push_back(x_temp);
 
  600       xdot_vec->push_back(xdot_temp);
 
  602       accuracy_vec->push_back(accuracy);
 
  604   if ( as<int>(this->getVerbLevel()) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  605     RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  606     Teuchos::OSTab ostab(out,1,
"getPoints");
 
  607     *out << 
"Passing out the interpolated values:" << std::endl;
 
  608     for (Teuchos::Ordinal i=0; i<time_vec.size() ; ++i) {
 
  609       *out << 
"time_[" << i << 
"] = " << time_vec[i] << std::endl;
 
  611         *out << 
"x_vec[" << i << 
"] = " << std::endl;
 
  612         (*x_vec)[i]->describe(*out,this->getVerbLevel());
 
  615         *out << 
"xdot_vec[" << i << 
"] = ";
 
  616         if ( (*xdot_vec)[i] == Teuchos::null) {
 
  617           *out << 
"Teuchos::null" << std::endl;
 
  620           *out << std::endl << Teuchos::describe(*(*xdot_vec)[i],this->getVerbLevel());
 
  624         *out << 
"accuracy[" << i << 
"] = " << (*accuracy_vec)[i] << std::endl;
 
  630 template<
class Scalar>
 
  633   TEUCHOS_ASSERT( time_vec != NULL );
 
  635   if (!haveInitialCondition_) {
 
  638   if (numberOfSteps_ > 0) {
 
  639     time_vec->push_back(time_-usedStep_);
 
  641   time_vec->push_back(time_);
 
  645 template<
class Scalar>
 
  648   TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
 
  649     "Error, removeNodes is not implemented for ImplicitBDFStepper.\n");
 
  653 template<
class Scalar>
 
  656   if (!isInitialized_) {
 
  666 template<
class Scalar>
 
  668   RCP<Teuchos::ParameterList> 
const& paramList
 
  671   TEUCHOS_TEST_FOR_EXCEPT(paramList == Teuchos::null);
 
  672   paramList->validateParameters(*this->getValidParameters(),0);
 
  673   parameterList_ = paramList;
 
  674   Teuchos::readVerboseObjectSublist(&*parameterList_,
this);
 
  678 template<
class Scalar>
 
  681   return(parameterList_);
 
  685 template<
class Scalar>
 
  686 RCP<Teuchos::ParameterList>
 
  689   RCP<Teuchos::ParameterList> temp_param_list = parameterList_;
 
  690   parameterList_ = Teuchos::null;
 
  691   return(temp_param_list);
 
  695 template<
class Scalar>
 
  696 RCP<const Teuchos::ParameterList>
 
  699   static RCP<Teuchos::ParameterList> validPL;
 
  700   if (is_null(validPL)) {
 
  701     RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
 
  703     pl->sublist(RythmosStepControlSettings_name);
 
  704     Teuchos::setupVerboseObjectSublist(&*pl);
 
  708   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  709   if (Teuchos::as<int>(verbLevel) == Teuchos::VERB_HIGH) {
 
  710     RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  711     Teuchos::OSTab ostab(out,1,
"getValidParameters");
 
  712     *out << 
"Setting up valid parameterlist." << std::endl;
 
  713     validPL->print(*out);
 
  724 template<
class Scalar>
 
  727   std::ostringstream out;
 
  728   out << this->Teuchos::Describable::description();
 
  731     out << 
" (timeRange="<<timeRange<<
")";
 
  733     out << 
" (This stepper is not initialized yet)";
 
  739 template<
class Scalar>
 
  741   Teuchos::FancyOStream &out,
 
  742   const Teuchos::EVerbosityLevel verbLevel
 
  748   if (!isInitialized_) {
 
  749     out << this->description();
 
  753   if ( (as<int>(verbLevel) == as<int>(Teuchos::VERB_DEFAULT) ) ||
 
  754     (as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW)     )
 
  757     out << this->description() << std::endl;
 
  758     out << 
"model_ = " << Teuchos::describe(*model_,verbLevel);
 
  759     out << 
"solver_ = " << Teuchos::describe(*solver_,verbLevel);
 
  760     out << 
"neModel_ = " << Teuchos::describe(neModel_,verbLevel);
 
  762   if (as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW)) {
 
  763     out << 
"time_ = " << time_ << std::endl;
 
  764     out << 
"hh_ = " << hh_ << std::endl;
 
  765     out << 
"currentOrder_ = " << currentOrder_ << std::endl;
 
  767   if (as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH)) {
 
  768     out << 
"xn0_ = " << Teuchos::describe(*xn0_,verbLevel);
 
  769     out << 
"xpn0_ = " << Teuchos::describe(*xpn0_,verbLevel);
 
  770     out << 
"x_dot_base_ = " << Teuchos::describe(*x_dot_base_,verbLevel);
 
  771     for (
int i=0 ; i < std::max(2,maxOrder_) ; ++i) {
 
  772       out << 
"xHistory_[" << i << 
"] = " 
  773           << Teuchos::describe(*xHistory_[i],verbLevel);
 
  775     out << 
"ee_ = " << Teuchos::describe(*ee_,verbLevel);
 
  790 template<
class Scalar>
 
  793   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  794   const Scalar nan = ST::nan(), one = ST::one(), zero = ST::zero();
 
  796   haveInitialCondition_ = 
false;
 
  797   isInitialized_ = 
false;
 
  807   stepLETStatus_ = STEP_LET_STATUS_UNKNOWN;
 
  812   newtonConvergenceStatus_ = -1;
 
  816 template<
class Scalar>
 
  817 void ImplicitBDFStepper<Scalar>::obtainPredictor_()
 
  821   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  823   if (!isInitialized_) {
 
  827   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  828   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  829   Teuchos::OSTab ostab(out,1,
"obtainPredictor_");
 
  830   if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  831     *out << 
"currentOrder_ = " << currentOrder_ << std::endl;
 
  835   for (
int i=nscsco_;i<=currentOrder_;++i) {
 
  836     Vt_S(xHistory_[i].ptr(),beta_[i]);
 
  840   V_V(xn0_.ptr(),*xHistory_[0]);
 
  841   V_S(xpn0_.ptr(),ST::zero());
 
  842   for (
int i=1;i<=currentOrder_;++i) {
 
  843     Vp_V(xn0_.ptr(),*xHistory_[i]);
 
  844     Vp_StV(xpn0_.ptr(),gamma_[i],*xHistory_[i]);
 
  846   if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  847     *out << 
"xn0_ = " << std::endl;
 
  848     xn0_->describe(*out,verbLevel);
 
  849     *out << 
"xpn0_ = " << std::endl;
 
  850     xpn0_->describe(*out,verbLevel);
 
  855 template<
class Scalar>
 
  856 void ImplicitBDFStepper<Scalar>::interpolateSolution_(
 
  857   const Scalar& timepoint,
 
  858   Thyra::VectorBase<Scalar>* x_ptr,
 
  859   Thyra::VectorBase<Scalar>* xdot_ptr,
 
  860   ScalarMag* accuracy_ptr
 
  865   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  867 #ifdef HAVE_RYTHMOS_DEBUG 
  868   TEUCHOS_TEST_FOR_EXCEPTION(
 
  869     !isInitialized_,std::logic_error,
 
  870     "Error, attempting to call interpolateSolution before initialization!\n");
 
  871   const TimeRange<Scalar> currTimeRange = this->getTimeRange();
 
  872   TEUCHOS_TEST_FOR_EXCEPTION(
 
  873     !currTimeRange.isInRange(timepoint), std::logic_error,
 
  874     "Error, timepoint = " << timepoint << 
" is not in the time range " 
  875     << currTimeRange << 
"!" );
 
  878   const Scalar tn = time_;
 
  879   const int kused = usedOrder_;
 
  883   if ( (kused == 0) || (timepoint == tn) )  {
 
  888   Thyra::V_V(ptr(x_ptr),*xHistory_[0]);
 
  889   Thyra::V_S(ptr(xdot_ptr),ST::zero());
 
  892   const Scalar delt = timepoint - tn;
 
  893   Scalar c = ST::one(); 
 
  894   Scalar d = ST::zero(); 
 
  895   Scalar gam = delt/psi_[0]; 
 
  896   for (
int j=1 ; j <= kord ; ++j) {
 
  897     d = d*gam + c/psi_[j-1];
 
  899     gam = (delt + psi_[j-1])/psi_[j];
 
  900     Thyra::Vp_StV(ptr(x_ptr),c,*xHistory_[j]);
 
  901     Thyra::Vp_StV(ptr(xdot_ptr),d,*xHistory_[j]);
 
  906     *accuracy_ptr = Teuchos::ScalarTraits<Scalar>::pow(usedStep_,kord);
 
  912 template<
class Scalar>
 
  913 void ImplicitBDFStepper<Scalar>::updateHistory_()
 
  919   if (usedOrder_ < maxOrder_)  {
 
  920     assign( xHistory_[usedOrder_+1].ptr(), *ee_ );
 
  923   Vp_V( xHistory_[usedOrder_].ptr(), *ee_ );
 
  924   for (
int j=usedOrder_-1;j>=0;j--) {
 
  925     Vp_V( xHistory_[j].ptr(), *xHistory_[j+1] );
 
  927   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  928   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  929   Teuchos::OSTab ostab(out,1,
"updateHistory_");
 
  930   if (as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  931     for (
int i=0;i<std::max(2,maxOrder_);++i) {
 
  932       *out << 
"xHistory_[" << i << 
"] = " << std::endl;
 
  933       xHistory_[i]->describe(*out,verbLevel);
 
  940 template<
class Scalar>
 
  941 void ImplicitBDFStepper<Scalar>::restoreHistory_()
 
  945   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  948   for (
int i=nscsco_;i<=currentOrder_;++i) {
 
  949     Vt_S( xHistory_[i].ptr(), ST::one()/beta_[i] );
 
  951   for (
int i=1;i<=currentOrder_;++i) {
 
  952     psi_[i-1] = psi_[i] - hh_;
 
  954   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
  955   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  956   Teuchos::OSTab ostab(out,1,
"restoreHistory_");
 
  957   if (as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
  958     for (
int i=0;i<maxOrder_;++i) {
 
  959       *out << 
"psi_[" << i << 
"] = " << psi_[i] << std::endl;
 
  961     for (
int i=0;i<maxOrder_;++i) {
 
  962       *out << 
"xHistory_[" << i << 
"] = " << std::endl;
 
  963       xHistory_[i]->describe(*out,verbLevel);
 
  970 template<
class Scalar>
 
  971 void ImplicitBDFStepper<Scalar>::updateCoeffs_()
 
  975   typedef Teuchos::ScalarTraits<Scalar> ST;
 
  982   if ((hh_ != usedStep_) || (currentOrder_ != usedOrder_)) {
 
  985   nscsco_ = std::min(nscsco_+1,usedOrder_+2);
 
  986   if (currentOrder_+1 >= nscsco_) {
 
  987     beta_[0] = ST::one();
 
  988     alpha_[0] = ST::one();
 
  990     gamma_[0] = ST::zero();
 
  991     for (
int i=1;i<=currentOrder_;++i) {
 
  992       Scalar temp2 = psi_[i-1];
 
  994       beta_[i] = beta_[i-1]*psi_[i-1]/temp2;
 
  996       alpha_[i] = hh_/temp1;
 
  997       gamma_[i] = gamma_[i-1]+alpha_[i-1]/hh_;
 
  999     psi_[currentOrder_] = temp1;
 
 1001   alpha_s_ = ST::zero();
 
 1002   for (
int i=0;i<currentOrder_;++i) {
 
 1003     alpha_s_ = alpha_s_ - Scalar(ST::one()/(i+ST::one()));
 
 1005   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
 1006   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
 1007   Teuchos::OSTab ostab(out,1,
"updateCoeffs_");
 
 1008   if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
 1009     for (
int i=0;i<=maxOrder_;++i) {
 
 1010       *out << 
"alpha_[" << i << 
"] = " << alpha_[i] << std::endl;
 
 1011       *out << 
"beta_[" << i << 
"] = " << beta_[i] << std::endl;
 
 1012       *out << 
"gamma_[" << i << 
"] = " << gamma_[i] << std::endl;
 
 1013       *out << 
"psi_[" << i << 
"] = " << psi_[i] << std::endl;
 
 1014       *out << 
"alpha_s_ = " << alpha_s_ << std::endl;
 
 1027 template<
class Scalar>
 
 1028 void ImplicitBDFStepper<Scalar>::initialize_()
 
 1032   typedef Teuchos::ScalarTraits<Scalar> ST;
 
 1033   using Thyra::createMember;
 
 1035   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
 1036   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
 1037   const bool doTrace = (as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH));
 
 1038   Teuchos::OSTab ostab(out,1,
"initialize_");
 
 1042       << 
"\nEntering " << this->Teuchos::Describable::description()
 
 1043       << 
"::initialize_()...\n";
 
 1046   TEUCHOS_TEST_FOR_EXCEPT(model_ == Teuchos::null);
 
 1047   TEUCHOS_TEST_FOR_EXCEPT(solver_ == Teuchos::null);
 
 1048   TEUCHOS_ASSERT(haveInitialCondition_);
 
 1051   if (parameterList_ == Teuchos::null) {
 
 1052     RCP<Teuchos::ParameterList> emptyParameterList =
 
 1053       Teuchos::rcp(
new Teuchos::ParameterList);
 
 1054     this->setParameterList(emptyParameterList);
 
 1058   if (stepControl_ == Teuchos::null) {
 
 1059     RCP<ImplicitBDFStepperStepControl<Scalar> > implicitBDFStepperStepControl =
 
 1060       Teuchos::rcp(
new ImplicitBDFStepperStepControl<Scalar>());
 
 1061     RCP<Teuchos::ParameterList> stepControlPL =
 
 1062       Teuchos::sublist(parameterList_, RythmosStepControlSettings_name);
 
 1063     implicitBDFStepperStepControl->setParameterList(stepControlPL);
 
 1064     this->setStepControlStrategy(implicitBDFStepperStepControl);
 
 1066   stepControl_->initialize(*
this);
 
 1068   maxOrder_ = stepControl_->getMaxOrder(); 
 
 1069   TEUCHOS_TEST_FOR_EXCEPTION(
 
 1070       !((1 <= maxOrder_) && (maxOrder_ <= 5)), std::logic_error,
 
 1071       "Error, maxOrder returned from stepControl_->getMaxOrder() = " 
 1072       << maxOrder_ << 
" is outside range of [1,5]!\n");
 
 1074   Scalar zero = ST::zero();
 
 1090   for (
int i=0 ; i<=maxOrder_ ; ++i) {
 
 1091     alpha_.push_back(zero);
 
 1092     beta_.push_back(zero);
 
 1093     gamma_.push_back(zero);
 
 1094     psi_.push_back(zero);
 
 1096   alpha_s_=Scalar(-ST::one());  
 
 1102   if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
 1103     *out << 
"alpha_s_ = " << alpha_s_ << std::endl;
 
 1104     for (
int i=0 ; i<=maxOrder_ ; ++i) {
 
 1105       *out << 
"alpha_[" << i << 
"] = " << alpha_[i] << std::endl;
 
 1106       *out << 
"beta_[" << i << 
"] = " << beta_[i] << std::endl;
 
 1107       *out << 
"gamma_[" << i << 
"] = " << gamma_[i] << std::endl;
 
 1108       *out << 
"psi_[" << i << 
"] = " << psi_[i] << std::endl;
 
 1110     *out << 
"numberOfSteps_ = " << numberOfSteps_ << std::endl;
 
 1115   for (
int i=2 ; i<=maxOrder_ ; ++i) {
 
 1116     xHistory_.push_back(createMember(xn0_->space()));
 
 1117     V_S(xHistory_[i].ptr(),zero);
 
 1120   isInitialized_ = 
true;
 
 1124       << 
"\nLeaving " << this->Teuchos::Describable::description()
 
 1125       << 
"::initialize_()...\n";
 
 1131 template<
class Scalar>
 
 1132 void ImplicitBDFStepper<Scalar>::completeStep_()
 
 1137 #ifdef HAVE_RYTHMOS_DEBUG 
 1138   typedef Teuchos::ScalarTraits<Scalar> ST;
 
 1139   TEUCHOS_TEST_FOR_EXCEPT(ST::isnaninf(hh_));
 
 1145   usedOrder_ = currentOrder_;
 
 1147   RCP<Teuchos::FancyOStream> out = this->getOStream();
 
 1148   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
 1149   Teuchos::OSTab ostab(out,1,
"completeStep_");
 
 1151   if ( as<int>(verbLevel) >= as<int>(Teuchos::VERB_HIGH) ) {
 
 1152     *out << 
"numberOfSteps_ = " << numberOfSteps_ << std::endl;
 
 1153     *out << 
"time_ = " << time_ << std::endl;
 
 1162 template<
class Scalar>
 
 1166   if (!isInitialized_) {
 
 1169   stepControl_->setStepControlData(stepper);
 
 1172 template<
class Scalar>
 
 1175   return nonlinearSolveStatus_;
 
 1184 #define RYTHMOS_IMPLICITBDF_STEPPER_INSTANT(SCALAR) \ 
 1186   template class ImplicitBDFStepper< SCALAR >; \ 
 1188   template RCP< ImplicitBDFStepper< SCALAR > > \ 
 1189   implicitBDFStepper();  \ 
 1191   template RCP< ImplicitBDFStepper< SCALAR > > \ 
 1192   implicitBDFStepper( \ 
 1193     const RCP<Thyra::ModelEvaluator< SCALAR > >& model, \ 
 1194     const RCP<Thyra::NonlinearSolverBase< SCALAR > >& solver, \ 
 1195     const RCP<Teuchos::ParameterList>& parameterList \ 
 1202 #endif //Rythmos_IMPLICITBDF_STEPPER_DEF_H 
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const 
 
bool isImplicit() const 
Overridden from StepperBase. 
 
Base class for defining stepper functionality. 
 
void getPoints(const Array< Scalar > &time_vec, Array< RCP< const Thyra::VectorBase< Scalar > > > *x_vec, Array< RCP< const Thyra::VectorBase< Scalar > > > *xdot_vec, Array< ScalarMag > *accuracy_vec) const 
 
RCP< Teuchos::ParameterList > getNonconstParameterList()
 
RCP< const Thyra::ModelEvaluator< Scalar > > getModel() const 
 
void setInitialCondition(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &initialCondition)
 
void setNonconstModel(const RCP< Thyra::ModelEvaluator< Scalar > > &model)
 
const Thyra::SolveStatus< Scalar > & getNonlinearSolveStatus() const 
Returns the Thyra::SolveStatus object from the last nonlinear solve. 
 
RCP< StepperBase< Scalar > > cloneStepperAlgorithm() const 
Creates copies of all internal data (including the parameter list) except the model which is assumed ...
 
RCP< const StepControlStrategyBase< Scalar > > getStepControlStrategy() const 
 
ImplicitBDFStepper()
Constructors, intializers, Misc. 
 
std::string description() const 
 
TimeRange< Scalar > getTimeRange() const 
 
The member functions in the StepControlStrategyBase move you between these states in the following fa...
 
RCP< const Thyra::VectorBase< Scalar > > residual
 
RCP< Thyra::NonlinearSolverBase< Scalar > > getNonconstSolver()
 
RCP< const Thyra::VectorBase< Scalar > > solutionDot
 
Thyra::ModelEvaluatorBase::InArgs< Scalar > getInitialCondition() const 
 
void setModel(const RCP< const Thyra::ModelEvaluator< Scalar > > &model)
 
RCP< const Thyra::NonlinearSolverBase< Scalar > > getSolver() const 
 
void getNodes(Array< Scalar > *time_vec) const 
 
Scalar takeStep(Scalar dt, StepSizeType flag)
 
bool supportsCloning() const 
Returns true. 
 
void setParameterList(RCP< Teuchos::ParameterList > const ¶mList)
 
EStepLETStatus stepLETStatus
 
RCP< const Thyra::VectorBase< Scalar > > solution
 
void setStepControlData(const StepperBase< Scalar > &stepper)
 
RCP< StepControlStrategyBase< Scalar > > getNonconstStepControlStrategy()
 
void removeNodes(Array< Scalar > &time_vec)
 
RCP< Thyra::ModelEvaluator< Scalar > > getNonconstModel()
 
RCP< const Teuchos::ParameterList > getValidParameters() const 
 
void addPoints(const Array< Scalar > &time_vec, const Array< RCP< const Thyra::VectorBase< Scalar > > > &x_vec, const Array< RCP< const Thyra::VectorBase< Scalar > > > &xdot_vec)
 
RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const 
 
const StepStatus< Scalar > getStepStatus() const 
 
void setSolver(const RCP< Thyra::NonlinearSolverBase< Scalar > > &solver)
 
RCP< Teuchos::ParameterList > unsetParameterList()
 
void setStepControlStrategy(const RCP< StepControlStrategyBase< Scalar > > &stepControlStrategy)
 
const Thyra::VectorBase< Scalar > & getxHistory(int index) const