29 #ifndef Rythmos_IMPLICIT_RK_STEPPER_DEF_H 
   30 #define Rythmos_IMPLICIT_RK_STEPPER_DEF_H 
   32 #include "Rythmos_ImplicitRKStepper_decl.hpp" 
   34 #include "Rythmos_StepperHelpers.hpp" 
   35 #include "Rythmos_SingleResidualModelEvaluator.hpp" 
   36 #include "Rythmos_ImplicitRKModelEvaluator.hpp" 
   37 #include "Rythmos_DiagonalImplicitRKModelEvaluator.hpp" 
   38 #include "Rythmos_RKButcherTableau.hpp" 
   39 #include "Rythmos_RKButcherTableauHelpers.hpp" 
   41 #include "Thyra_ModelEvaluatorHelpers.hpp" 
   42 #include "Thyra_ProductVectorSpaceBase.hpp" 
   43 #include "Thyra_AssertOp.hpp" 
   44 #include "Thyra_TestingTools.hpp" 
   45 #include "Rythmos_ImplicitBDFStepperRampingStepControl.hpp" 
   46 #include "Teuchos_VerboseObjectParameterListHelpers.hpp" 
   47 #include "Teuchos_as.hpp" 
   56 template<
class Scalar>
 
   57 RCP<ImplicitRKStepper<Scalar> >
 
   64 template<
class Scalar>
 
   65 RCP<ImplicitRKStepper<Scalar> >
 
   67   const RCP<
const Thyra::ModelEvaluator<Scalar> >& model,
 
   68   const RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
 
   69   const RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> >& irk_W_factory,
 
   70   const RCP<
const RKButcherTableauBase<Scalar> >& irkbt
 
   75   stepper->setModel(model);
 
   76   stepper->setSolver(solver);
 
   77   stepper->set_W_factory(irk_W_factory);
 
   78   stepper->setRKButcherTableau(irkbt);
 
   90 template<
class Scalar>
 
   93   this->defaultInitializeAll_();
 
   94   irkButcherTableau_ = rKButcherTableau<Scalar>();
 
   98 template<
class Scalar>
 
  101   isInitialized_ = 
false;
 
  102   model_ = Teuchos::null;
 
  103   solver_ = Teuchos::null;
 
  104   irk_W_factory_ = Teuchos::null;
 
  105   paramList_ = Teuchos::null;
 
  108   x_old_ = Teuchos::null;
 
  109   x_dot_ = Teuchos::null;
 
  111   irkModel_ = Teuchos::null;
 
  112   irkButcherTableau_ = Teuchos::null;
 
  115   haveInitialCondition_ = 
false;
 
  116   x_stage_bar_ = Teuchos::null;
 
  119 template<
class Scalar>
 
  120 void ImplicitRKStepper<Scalar>::set_W_factory(
 
  121   const RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> > &irk_W_factory
 
  124   TEUCHOS_ASSERT( !is_null(irk_W_factory) );
 
  125   irk_W_factory_ = irk_W_factory;
 
  128 template<
class Scalar>
 
  131   return irk_W_factory_;
 
  137 template<
class Scalar>
 
  139   const RCP<Thyra::NonlinearSolverBase<Scalar> > &solver
 
  142   TEUCHOS_TEST_FOR_EXCEPT(is_null(solver));
 
  147 template<
class Scalar>
 
  148 RCP<Thyra::NonlinearSolverBase<Scalar> >
 
  155 template<
class Scalar>
 
  156 RCP<const Thyra::NonlinearSolverBase<Scalar> >
 
  166 template<
class Scalar>
 
  172 template<
class Scalar>
 
  179 template<
class Scalar>
 
  180 RCP<StepperBase<Scalar> >
 
  185   RCP<ImplicitRKStepper<Scalar> >
 
  188   if (!is_null(model_)) {
 
  189     stepper->setModel(model_); 
 
  192   if (!is_null(irkButcherTableau_)) {
 
  194     stepper->setRKButcherTableau(irkButcherTableau_);
 
  197   if (!is_null(solver_)) {
 
  198     stepper->setSolver(solver_->cloneNonlinearSolver().assert_not_null());
 
  201   if (!is_null(irk_W_factory_)) {
 
  203     stepper->set_W_factory(irk_W_factory_);
 
  206   if (!is_null(paramList_)) {
 
  207     stepper->setParameterList(Teuchos::parameterList(*paramList_));
 
  213 template<
class Scalar>
 
  216   return(stepControl_);
 
  219 template<
class Scalar>
 
  222   return(stepControl_);
 
  225 template<
class Scalar>
 
  228   TEUCHOS_TEST_FOR_EXCEPTION(stepControl == Teuchos::null,std::logic_error,
"Error, stepControl == Teuchos::null!\n");
 
  229   stepControl_ = stepControl;
 
  232 template<
class Scalar>
 
  234   const RCP<
const Thyra::ModelEvaluator<Scalar> >& model
 
  237   TEUCHOS_TEST_FOR_EXCEPT(is_null(model));
 
  238   assertValidModel( *
this, *model );
 
  243 template<
class Scalar>
 
  245   const RCP<Thyra::ModelEvaluator<Scalar> >& model
 
  248   this->setModel(model); 
 
  252 template<
class Scalar>
 
  253 RCP<const Thyra::ModelEvaluator<Scalar> >
 
  260 template<
class Scalar>
 
  261 RCP<Thyra::ModelEvaluator<Scalar> >
 
  264   return Teuchos::null;
 
  268 template<
class Scalar>
 
  270   const Thyra::ModelEvaluatorBase::InArgs<Scalar> &initialCondition
 
  274   typedef ScalarTraits<Scalar> ST;
 
  275   typedef Thyra::ModelEvaluatorBase MEB;
 
  277   basePoint_ = initialCondition;
 
  281   RCP<const Thyra::VectorBase<Scalar> >
 
  282     x_init = initialCondition.get_x();
 
  284 #ifdef HAVE_RYTHMOS_DEBUG 
  285   TEUCHOS_TEST_FOR_EXCEPTION(
 
  286     is_null(x_init), std::logic_error,
 
  287     "Error, if the client passes in an intial condition to setInitialCondition(...),\n" 
  288     "then x can not be null!" );
 
  291   x_ = x_init->clone_v();
 
  294   xhat_ = x_init->clone_v();
 
  295   ee_ = x_init->clone_v();
 
  299   x_dot_ = createMember(x_->space());
 
  301   RCP<const Thyra::VectorBase<Scalar> >
 
  302     x_dot_init = initialCondition.get_x_dot();
 
  304   if (!is_null(x_dot_init))
 
  305     assign(x_dot_.ptr(),*x_dot_init);
 
  307     assign(x_dot_.ptr(),ST::zero());
 
  313       initialCondition.supports(MEB::IN_ARG_t)
 
  314       ? initialCondition.get_t()
 
  318   timeRange_ = timeRange(t,t);
 
  321   x_old_ = x_->clone_v();
 
  323   haveInitialCondition_ = 
true;
 
  328 template<
class Scalar>
 
  329 Thyra::ModelEvaluatorBase::InArgs<Scalar>
 
  336 template<
class Scalar>
 
  339   Scalar stepSizeTaken;
 
  341   using Teuchos::incrVerbLevel;
 
  342   typedef Thyra::NonlinearSolverBase<Scalar> NSB;
 
  343   typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
 
  345   RCP<FancyOStream> out = this->getOStream();
 
  346   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  347   Teuchos::OSTab ostab(out,1,
"takeStep");
 
  348   VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
 
  353   if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
 
  356       << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
 
  357       << 
"::takeStep("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
 
  360   if (!isInitialized_) {
 
  363   if (stepSizeType == STEP_TYPE_FIXED) {
 
  364     stepSizeTaken = takeFixedStep_(dt , stepSizeType);
 
  365     return stepSizeTaken;
 
  367       isVariableStep_ = 
true;
 
  368       stepControl_->setOStream(out);
 
  369       stepControl_->setVerbLevel(verbLevel);
 
  371       rkNewtonConvergenceStatus_ = -1;
 
  373       while (rkNewtonConvergenceStatus_ < 0){
 
  375          stepControl_->setRequestedStepSize(*
this, dt, stepSizeType);
 
  376          stepControl_->nextStepSize(*
this, &dt, &stepSizeType, &desiredOrder);
 
  378          stepSizeTaken = takeVariableStep_(dt, stepSizeType);
 
  381      return stepSizeTaken;
 
  387 template<
class Scalar>
 
  391   using Teuchos::incrVerbLevel;
 
  392   typedef ScalarTraits<Scalar> ST;
 
  393   typedef Thyra::NonlinearSolverBase<Scalar> NSB;
 
  394   typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
 
  396   RCP<FancyOStream> out = this->getOStream();
 
  397   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  398   Teuchos::OSTab ostab(out,1,
"takeStep");
 
  399   VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
 
  401   if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
 
  404       << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
 
  405       << 
"::takeFixedStep_("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
 
  408   if (!isInitialized_) {
 
  412   TEUCHOS_TEST_FOR_EXCEPT( stepSizeType != STEP_TYPE_FIXED ); 
 
  418   V_V( x_old_.ptr(), *x_ );
 
  419   Scalar current_dt = dt;
 
  420   Scalar t = timeRange_.upper();
 
  426   V_S( Teuchos::rcp_dynamic_cast<Thyra::VectorBase<Scalar> >(x_stage_bar_).ptr(), ST::zero() );
 
  429     RCP<ImplicitRKModelEvaluator<Scalar> > firkModel_ =
 
  430       Teuchos::rcp_dynamic_cast<ImplicitRKModelEvaluator<Scalar> >(irkModel_,
true);
 
  431     firkModel_->setTimeStepPoint( x_old_, t, current_dt );
 
  434     solver_->solve( &*x_stage_bar_ );
 
  438     RCP<DiagonalImplicitRKModelEvaluator<Scalar> > dirkModel_ =
 
  439       Teuchos::rcp_dynamic_cast<DiagonalImplicitRKModelEvaluator<Scalar> >(irkModel_,
true);
 
  440     dirkModel_->setTimeStepPoint( x_old_, t, current_dt );
 
  441     int numStages = irkButcherTableau_->numStages();
 
  442     for (
int stage=0 ; stage < numStages ; ++stage) {
 
  443       dirkModel_->setCurrentStage(stage);
 
  444       solver_->solve( &*(x_stage_bar_->getNonconstVectorBlock(stage)) );
 
  445       dirkModel_->setStageSolution( stage, *(x_stage_bar_->getVectorBlock(stage)) );
 
  455   assembleIRKSolution( irkButcherTableau_->b(), current_dt, *x_old_, *x_stage_bar_,
 
  460   timeRange_ = timeRange(t,t+current_dt);
 
  467 template<
class Scalar>
 
  468 Scalar ImplicitRKStepper<Scalar>::takeVariableStep_(Scalar dt, StepSizeType stepSizeType)
 
  471   using Teuchos::incrVerbLevel;
 
  472   typedef ScalarTraits<Scalar> ST;
 
  473   typedef Thyra::NonlinearSolverBase<Scalar> NSB;
 
  474   typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
 
  476   RCP<FancyOStream> out = this->getOStream();
 
  477   Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
 
  478   Teuchos::OSTab ostab(out,1,
"takeStep");
 
  479   VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
 
  481   AttemptedStepStatusFlag status;
 
  484   if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
 
  487       << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
 
  488       << 
"::takeVariableStep_("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
 
  491   if (!isInitialized_) {
 
  499   V_V( x_old_.ptr(), *x_ );
 
  500   Scalar current_dt = dt;
 
  501   Scalar t = timeRange_.upper();
 
  508   V_S( Teuchos::rcp_dynamic_cast<Thyra::VectorBase<Scalar> >(x_stage_bar_).ptr(), ST::zero() );
 
  511     RCP<ImplicitRKModelEvaluator<Scalar> > firkModel_ =
 
  512       Teuchos::rcp_dynamic_cast<ImplicitRKModelEvaluator<Scalar> >(irkModel_,
true);
 
  513     firkModel_->setTimeStepPoint( x_old_, t, current_dt );
 
  516     solver_->solve( &*x_stage_bar_ );
 
  520     RCP<DiagonalImplicitRKModelEvaluator<Scalar> > dirkModel_ =
 
  521       Teuchos::rcp_dynamic_cast<DiagonalImplicitRKModelEvaluator<Scalar> >(irkModel_,
true);
 
  522     dirkModel_->setTimeStepPoint( x_old_, t, current_dt );
 
  523     int numStages = irkButcherTableau_->numStages();
 
  524     for (
int stage=0 ; stage < numStages ; ++stage) {
 
  525         dirkModel_->setCurrentStage(stage);
 
  526         nonlinearSolveStatus_ = solver_->solve( &*(x_stage_bar_->getNonconstVectorBlock(stage)) );
 
  528         if (nonlinearSolveStatus_.solveStatus == Thyra::SOLVE_STATUS_CONVERGED) {
 
  529            rkNewtonConvergenceStatus_ = 0;
 
  531           rkNewtonConvergenceStatus_ = -1;
 
  537         stepControl_->setCorrection(*
this, (x_stage_bar_->getNonconstVectorBlock(stage)), Teuchos::null , rkNewtonConvergenceStatus_);
 
  538         bool stepPass = stepControl_->acceptStep(*
this, &LETvalue_);
 
  541            stepLETStatus_ = STEP_LET_STATUS_FAILED;
 
  542            rkNewtonConvergenceStatus_ = -1; 
 
  545            stepLETStatus_ = STEP_LET_STATUS_PASSED;
 
  546            dirkModel_->setStageSolution( stage, *(x_stage_bar_->getVectorBlock(stage)) );
 
  547            rkNewtonConvergenceStatus_ = 0; 
 
  554   if ( rkNewtonConvergenceStatus_ == 0) {
 
  566      assembleIRKSolution( irkButcherTableau_->b(), current_dt, *x_old_, *x_stage_bar_,
 
  571      if (irkButcherTableau_->isEmbeddedMethod() ){
 
  573         assembleIRKSolution( irkButcherTableau_->bhat(), current_dt, *x_old_, *x_stage_bar_,
 
  578         Thyra::V_VmV(ee_.ptr(), *x_, *xhat_);
 
  579         stepControl_->setCorrection(*
this, x_, ee_ , rkNewtonConvergenceStatus_);
 
  581         bool stepPass = stepControl_->acceptStep(*
this, &LETvalue_);
 
  584            stepLETStatus_ = STEP_LET_STATUS_FAILED;
 
  585            rkNewtonConvergenceStatus_ = -1; 
 
  587            stepLETStatus_ = STEP_LET_STATUS_PASSED;
 
  588            rkNewtonConvergenceStatus_ = 0; 
 
  593    if (rkNewtonConvergenceStatus_ == 0) {
 
  596      timeRange_ = timeRange(t,t+current_dt);
 
  600      stepControl_->completeStep(*
this);
 
  602      dt_to_return = current_dt;
 
  605      rkNewtonConvergenceStatus_ = -1;
 
  606      status = stepControl_-> rejectStep(*
this); 
 
  608      dt_to_return = dt_old;
 
  616 template<
class Scalar>
 
  621   if (!isInitialized_) {
 
  622     stepStatus.
stepStatus = STEP_STATUS_UNINITIALIZED;
 
  623     stepStatus.
message = 
"This stepper is uninitialized.";
 
  626   else if (numSteps_ > 0) {
 
  627     stepStatus.
stepStatus = STEP_STATUS_CONVERGED;
 
  632   stepStatus.
stepSize = timeRange_.length();
 
  633   stepStatus.
order = irkButcherTableau_->order();
 
  634   stepStatus.
time = timeRange_.upper();
 
  635   if(Teuchos::nonnull(x_))
 
  638     stepStatus.
solution = Teuchos::null;
 
  647 template<
class Scalar>
 
  648 RCP<const Thyra::VectorSpaceBase<Scalar> >
 
  651   return ( !is_null(model_) ? model_->get_x_space() : Teuchos::null );
 
  655 template<
class Scalar>
 
  658     ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& 
 
  659     ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& 
 
  662   TEUCHOS_TEST_FOR_EXCEPT(
true);
 
  666 template<
class Scalar>
 
  673 template<
class Scalar>
 
  675   const Array<Scalar>& time_vec
 
  676   ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* x_vec
 
  677   ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* xdot_vec
 
  678   ,Array<ScalarMag>* accuracy_vec)
 const 
  680   using Teuchos::constOptInArg;
 
  682   TEUCHOS_ASSERT(haveInitialCondition_);
 
  683   defaultGetPoints<Scalar>(
 
  684     timeRange_.lower(), constOptInArg(*x_old_),
 
  685     Ptr<const VectorBase<Scalar> >(null), 
 
  686     timeRange_.upper(), constOptInArg(*x_),
 
  687     Ptr<const VectorBase<Scalar> >(null), 
 
  689     ptr(x_vec), ptr(xdot_vec), ptr(accuracy_vec),
 
  690     Ptr<InterpolatorBase<Scalar> >(null) 
 
  696 template<
class Scalar>
 
  699   TEUCHOS_ASSERT( time_vec != NULL );
 
  701   if (!haveInitialCondition_) {
 
  704   time_vec->push_back(timeRange_.lower());
 
  706     time_vec->push_back(timeRange_.upper());
 
  711 template<
class Scalar>
 
  714   TEUCHOS_TEST_FOR_EXCEPT(
true);
 
  718 template<
class Scalar>
 
  721   return irkButcherTableau_->order();
 
  728 template <
class Scalar>
 
  730   RCP<ParameterList> 
const& paramList
 
  733   TEUCHOS_TEST_FOR_EXCEPT(is_null(paramList));
 
  734   paramList->validateParametersAndSetDefaults(*this->getValidParameters());
 
  735   paramList_ = paramList;
 
  736   Teuchos::readVerboseObjectSublist(&*paramList_,
this);
 
  740 template <
class Scalar>
 
  748 template <
class Scalar>
 
  753     temp_param_list = paramList_;
 
  754   paramList_ = Teuchos::null;
 
  755   return(temp_param_list);
 
  759 template<
class Scalar>
 
  760 RCP<const ParameterList>
 
  763   static RCP<const ParameterList> validPL;
 
  764   if (is_null(validPL)) {
 
  765     RCP<ParameterList> pl = Teuchos::parameterList();
 
  766     if (isVariableStep_){
 
  767         pl->sublist(RythmosStepControlSettings_name);
 
  769     Teuchos::setupVerboseObjectSublist(&*pl);
 
  779 template<
class Scalar>
 
  782   const Teuchos::EVerbosityLevel verbLevel
 
  787   if (!isInitialized_) {
 
  788     out << this->description() << 
" : This stepper is not initialized yet" << std::endl;
 
  792     as<int>(verbLevel) == as<int>(Teuchos::VERB_DEFAULT)
 
  794     as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW)
 
  797     out << this->description() << 
":" << endl;
 
  798     Teuchos::OSTab tab(out);
 
  799     out << 
"model = " << Teuchos::describe(*model_,verbLevel);
 
  800     out << 
"solver = " << Teuchos::describe(*solver_,verbLevel);
 
  801     out << 
"irk_W_factory = " << Teuchos::describe(*irk_W_factory_,verbLevel);
 
  809 template <
class Scalar>
 
  814   using Teuchos::rcp_dynamic_cast;
 
  816   TEUCHOS_TEST_FOR_EXCEPT(is_null(model_));
 
  817   TEUCHOS_TEST_FOR_EXCEPT(is_null(solver_));
 
  818   TEUCHOS_TEST_FOR_EXCEPT(irkButcherTableau_->numStages() == 0);
 
  819   TEUCHOS_ASSERT(haveInitialCondition_);
 
  821 #ifdef HAVE_RYTHMOS_DEBUG 
  822   THYRA_ASSERT_VEC_SPACES(
 
  823     "Rythmos::ImplicitRKStepper::initialize_(...)",
 
  824     *x_->space(), *model_->get_x_space() );
 
  827   if (isVariableStep_ ) {
 
  830     isEmbeddedRK_ = irkButcherTableau_->isEmbeddedMethod(); 
 
  831   if (stepControl_ == Teuchos::null) {
 
  832      RCP<ImplicitBDFStepperRampingStepControl<Scalar> > rkStepControl =
 
  836      RCP<Teuchos::ParameterList> stepControlPL =
 
  837      Teuchos::sublist(paramList_ , RythmosStepControlSettings_name);
 
  838      rkStepControl->setParameterList(stepControlPL);
 
  839      this->setStepControlStrategy(rkStepControl);
 
  840      stepControl_->initialize(*
this);
 
  847     TEUCHOS_TEST_FOR_EXCEPT(is_null(irk_W_factory_));
 
  848     irkModel_ = implicitRKModelEvaluator(
 
  849       model_,basePoint_,irk_W_factory_,irkButcherTableau_);
 
  851     irkModel_ = diagonalImplicitRKModelEvaluator(
 
  852       model_,basePoint_,irk_W_factory_,irkButcherTableau_);
 
  855   solver_->setModel(irkModel_);
 
  858   const int numStages = irkButcherTableau_->numStages();
 
  859   RCP<const Thyra::ProductVectorSpaceBase<Scalar> > pvs = productVectorSpace(model_->get_x_space(),numStages);
 
  860   RCP<const Thyra::VectorSpaceBase<Scalar> > vs = rcp_dynamic_cast<
const Thyra::VectorSpaceBase<Scalar> >(pvs,
true);
 
  861   x_stage_bar_ = rcp_dynamic_cast<Thyra::ProductVectorBase<Scalar> >(createMember(vs),
true);
 
  866   isInitialized_ = 
true;
 
  870 template <
class Scalar>
 
  873   TEUCHOS_ASSERT( !is_null(rkButcherTableau) );
 
  874   TEUCHOS_TEST_FOR_EXCEPTION( isInitialized_, std::logic_error,
 
  875       "Error!  The RK Butcher Tableau cannot be changed after internal initialization!" 
  877   validateIRKButcherTableau(*rkButcherTableau);
 
  878   irkButcherTableau_ = rkButcherTableau;
 
  879   E_RKButcherTableauTypes rkType = determineRKBTType<Scalar>(*irkButcherTableau_);
 
  881          (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_DIRK)
 
  882       || (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_SDIRK)
 
  883       || (irkButcherTableau_->numStages() == 1)
 
  890 template <
class Scalar>
 
  893   return irkButcherTableau_;
 
  896 template<
class Scalar>
 
  899   TEUCHOS_TEST_FOR_EXCEPTION(isInitialized_, std::logic_error,
 
  900       "Error!  Cannot change DIRK flag after internal initialization is completed\n" 
  902   if (isDirk == 
true) {
 
  903     E_RKButcherTableauTypes rkType = determineRKBTType<Scalar>(*irkButcherTableau_);
 
  904     bool RKBT_is_DIRK = (
 
  905          (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_DIRK)
 
  906       || (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_SDIRK)
 
  907       || (irkButcherTableau_->numStages() == 1)
 
  909     TEUCHOS_TEST_FOR_EXCEPTION( !RKBT_is_DIRK, std::logic_error,
 
  910         "Error!  Cannot set DIRK flag on a non-DIRK RK Butcher Tableau\n" 
  923 #define RYTHMOS_IMPLICIT_RK_STEPPER_INSTANT(SCALAR) \ 
  925   template class ImplicitRKStepper< SCALAR >; \ 
  927   template RCP< ImplicitRKStepper< SCALAR > > \ 
  928   implicitRKStepper();  \ 
  930   template RCP< ImplicitRKStepper< SCALAR > > \ 
  932     const RCP<const Thyra::ModelEvaluator< SCALAR > >& model, \ 
  933     const RCP<Thyra::NonlinearSolverBase< SCALAR > >& solver, \ 
  934     const RCP<Thyra::LinearOpWithSolveFactoryBase< SCALAR > >& irk_W_factory, \ 
  935     const RCP<const RKButcherTableauBase< SCALAR > >& irkbt \ 
  940 #endif //Rythmos_IMPLICIT_RK_STEPPER_DEF_H 
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)
 
bool isImplicit() const 
Returns true. 
 
RCP< ParameterList > getNonconstParameterList()
 
RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const 
 
RCP< const RKButcherTableauBase< Scalar > > getRKButcherTableau() const 
 
void describe(FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const 
 
Scalar takeStep(Scalar dt, StepSizeType flag)
 
RCP< const ParameterList > getValidParameters() const 
 
void setRKButcherTableau(const RCP< const RKButcherTableauBase< Scalar > > &rkButcherTableau)
 
RCP< StepperBase< Scalar > > cloneStepperAlgorithm() const 
 
void setSolver(const RCP< Thyra::NonlinearSolverBase< Scalar > > &solver)
 
RCP< StepControlStrategyBase< Scalar > > getNonconstStepControlStrategy()
 
RCP< const StepControlStrategyBase< Scalar > > getStepControlStrategy() const 
 
const StepStatus< Scalar > getStepStatus() const 
 
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 
 
The member functions in the StepControlStrategyBase move you between these states in the following fa...
 
RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const 
 
RCP< const Thyra::VectorBase< Scalar > > solutionDot
 
void removeNodes(Array< Scalar > &time_vec)
 
void setInitialCondition(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &initialCondition)
 
RCP< ImplicitRKStepper< Scalar > > implicitRKStepper()
Nonmember constructor. 
 
void setDirk(bool isDirk)
 
void setModel(const RCP< const Thyra::ModelEvaluator< Scalar > > &model)
 
void setStepControlStrategy(const RCP< StepControlStrategyBase< Scalar > > &stepControlStrategy)
 
void setNonconstModel(const RCP< Thyra::ModelEvaluator< Scalar > > &model)
 
void getNodes(Array< Scalar > *time_vec) const 
 
bool supportsCloning() const 
Returns true. 
 
RCP< const Thyra::VectorBase< Scalar > > solution
 
RCP< Thyra::ModelEvaluator< Scalar > > getNonconstModel()
 
RCP< const Thyra::ModelEvaluator< Scalar > > getModel() const 
 
RCP< ParameterList > unsetParameterList()
 
TimeRange< Scalar > getTimeRange() const 
 
Thyra::ModelEvaluatorBase::InArgs< Scalar > getInitialCondition() const 
 
RCP< const Thyra::NonlinearSolverBase< Scalar > > getSolver() const 
 
RCP< Thyra::NonlinearSolverBase< Scalar > > getNonconstSolver()
 
void setParameterList(RCP< ParameterList > const ¶mList)