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)