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>
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();
295 x_dot_ = createMember(x_->space());
297 RCP<const Thyra::VectorBase<Scalar> >
298 x_dot_init = initialCondition.get_x_dot();
300 if (!is_null(x_dot_init))
301 assign(x_dot_.ptr(),*x_dot_init);
303 assign(x_dot_.ptr(),ST::zero());
309 initialCondition.supports(MEB::IN_ARG_t)
310 ? initialCondition.get_t()
314 timeRange_ = timeRange(t,t);
317 x_old_ = x_->clone_v();
319 haveInitialCondition_ =
true;
324 template<
class Scalar>
325 Thyra::ModelEvaluatorBase::InArgs<Scalar>
332 template<
class Scalar>
335 Scalar stepSizeTaken;
337 using Teuchos::incrVerbLevel;
338 typedef Thyra::NonlinearSolverBase<Scalar> NSB;
339 typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
341 RCP<FancyOStream> out = this->getOStream();
342 Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
343 Teuchos::OSTab ostab(out,1,
"takeStep");
344 VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
349 if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
352 << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
353 <<
"::takeStep("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
356 if (!isInitialized_) {
359 if (stepSizeType == STEP_TYPE_FIXED) {
360 stepSizeTaken = takeFixedStep_(dt , stepSizeType);
361 return stepSizeTaken;
363 isVariableStep_ =
true;
364 stepControl_->setOStream(out);
365 stepControl_->setVerbLevel(verbLevel);
367 rkNewtonConvergenceStatus_ = -1;
369 while (rkNewtonConvergenceStatus_ < 0){
371 stepControl_->setRequestedStepSize(*
this, dt, stepSizeType);
372 stepControl_->nextStepSize(*
this, &dt, &stepSizeType, &desiredOrder);
374 stepSizeTaken = takeVariableStep_(dt, stepSizeType);
377 return stepSizeTaken;
383 template<
class Scalar>
387 using Teuchos::incrVerbLevel;
388 typedef ScalarTraits<Scalar> ST;
389 typedef Thyra::NonlinearSolverBase<Scalar> NSB;
390 typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
392 RCP<FancyOStream> out = this->getOStream();
393 Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
394 Teuchos::OSTab ostab(out,1,
"takeStep");
395 VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
397 if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
400 << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
401 <<
"::takeFixedStep_("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
404 if (!isInitialized_) {
408 TEUCHOS_TEST_FOR_EXCEPT( stepSizeType != STEP_TYPE_FIXED );
414 V_V( x_old_.ptr(), *x_ );
415 Scalar current_dt = dt;
416 Scalar t = timeRange_.upper();
422 V_S( Teuchos::rcp_dynamic_cast<Thyra::VectorBase<Scalar> >(x_stage_bar_).ptr(), ST::zero() );
425 RCP<ImplicitRKModelEvaluator<Scalar> > firkModel_ =
430 solver_->solve( &*x_stage_bar_ );
434 RCP<DiagonalImplicitRKModelEvaluator<Scalar> > dirkModel_ =
437 int numStages = irkButcherTableau_->numStages();
438 for (
int stage=0 ; stage < numStages ; ++stage) {
439 dirkModel_->setCurrentStage(stage);
440 solver_->solve( &*(x_stage_bar_->getNonconstVectorBlock(stage)) );
441 dirkModel_->setStageSolution( stage, *(x_stage_bar_->getVectorBlock(stage)) );
451 assembleIRKSolution( irkButcherTableau_->b(), current_dt, *x_old_, *x_stage_bar_,
456 timeRange_ = timeRange(t,t+current_dt);
463 template<
class Scalar>
467 using Teuchos::incrVerbLevel;
468 typedef ScalarTraits<Scalar> ST;
469 typedef Thyra::NonlinearSolverBase<Scalar> NSB;
470 typedef Teuchos::VerboseObjectTempState<NSB> VOTSNSB;
472 RCP<FancyOStream> out = this->getOStream();
473 Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
474 Teuchos::OSTab ostab(out,1,
"takeStep");
475 VOTSNSB solver_outputTempState(solver_,out,incrVerbLevel(verbLevel,-1));
477 AttemptedStepStatusFlag status;
480 if ( !is_null(out) && as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW) ) {
483 << Teuchos::TypeNameTraits<ImplicitRKStepper<Scalar> >::name()
484 <<
"::takeVariableStep_("<<dt<<
","<<toString(stepSizeType)<<
") ...\n";
487 if (!isInitialized_) {
495 V_V( x_old_.ptr(), *x_ );
496 Scalar current_dt = dt;
497 Scalar t = timeRange_.upper();
504 V_S( Teuchos::rcp_dynamic_cast<Thyra::VectorBase<Scalar> >(x_stage_bar_).ptr(), ST::zero() );
507 RCP<ImplicitRKModelEvaluator<Scalar> > firkModel_ =
512 solver_->solve( &*x_stage_bar_ );
516 RCP<DiagonalImplicitRKModelEvaluator<Scalar> > dirkModel_ =
519 int numStages = irkButcherTableau_->numStages();
520 for (
int stage=0 ; stage < numStages ; ++stage) {
521 dirkModel_->setCurrentStage(stage);
522 nonlinearSolveStatus_ = solver_->solve( &*(x_stage_bar_->getNonconstVectorBlock(stage)) );
524 if (nonlinearSolveStatus_.solveStatus == Thyra::SOLVE_STATUS_CONVERGED) {
525 rkNewtonConvergenceStatus_ = 0;
527 rkNewtonConvergenceStatus_ = -1;
533 stepControl_->setCorrection(*
this, (x_stage_bar_->getNonconstVectorBlock(stage)), (x_stage_bar_->getNonconstVectorBlock(stage)), rkNewtonConvergenceStatus_);
534 bool stepPass = stepControl_->acceptStep(*
this, &LETvalue_);
537 stepLETStatus_ = STEP_LET_STATUS_FAILED;
538 rkNewtonConvergenceStatus_ = -1;
541 stepLETStatus_ = STEP_LET_STATUS_PASSED;
542 dirkModel_->setStageSolution( stage, *(x_stage_bar_->getVectorBlock(stage)) );
543 rkNewtonConvergenceStatus_ = 0;
550 if ( rkNewtonConvergenceStatus_ == 0) {
562 assembleIRKSolution( irkButcherTableau_->b(), current_dt, *x_old_, *x_stage_bar_,
567 timeRange_ = timeRange(t,t+current_dt);
571 stepControl_->completeStep(*
this);
573 dt_to_return = current_dt;
576 rkNewtonConvergenceStatus_ = -1;
577 status = stepControl_-> rejectStep(*
this);
579 dt_to_return = dt_old;
587 template<
class Scalar>
592 if (!isInitialized_) {
593 stepStatus.
stepStatus = STEP_STATUS_UNINITIALIZED;
594 stepStatus.
message =
"This stepper is uninitialized.";
597 else if (numSteps_ > 0) {
598 stepStatus.
stepStatus = STEP_STATUS_CONVERGED;
603 stepStatus.
stepSize = timeRange_.length();
604 stepStatus.
order = irkButcherTableau_->order();
605 stepStatus.
time = timeRange_.upper();
606 if(Teuchos::nonnull(x_))
609 stepStatus.
solution = Teuchos::null;
618 template<
class Scalar>
619 RCP<const Thyra::VectorSpaceBase<Scalar> >
622 return ( !is_null(model_) ? model_->get_x_space() : Teuchos::null );
626 template<
class Scalar>
628 const Array<Scalar>& time_vec
629 ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& x_vec
630 ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& xdot_vec
633 TEUCHOS_TEST_FOR_EXCEPT(
true);
637 template<
class Scalar>
644 template<
class Scalar>
646 const Array<Scalar>& time_vec
647 ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* x_vec
648 ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* xdot_vec
649 ,Array<ScalarMag>* accuracy_vec)
const 651 using Teuchos::constOptInArg;
653 TEUCHOS_ASSERT(haveInitialCondition_);
654 defaultGetPoints<Scalar>(
655 timeRange_.lower(), constOptInArg(*x_old_),
656 Ptr<const VectorBase<Scalar> >(null),
657 timeRange_.upper(), constOptInArg(*x_),
658 Ptr<const VectorBase<Scalar> >(null),
660 ptr(x_vec), ptr(xdot_vec), ptr(accuracy_vec),
661 Ptr<InterpolatorBase<Scalar> >(null)
667 template<
class Scalar>
670 TEUCHOS_ASSERT( time_vec != NULL );
672 if (!haveInitialCondition_) {
675 time_vec->push_back(timeRange_.lower());
677 time_vec->push_back(timeRange_.upper());
682 template<
class Scalar>
685 TEUCHOS_TEST_FOR_EXCEPT(
true);
689 template<
class Scalar>
692 return irkButcherTableau_->order();
699 template <
class Scalar>
701 RCP<ParameterList>
const& paramList
704 TEUCHOS_TEST_FOR_EXCEPT(is_null(paramList));
705 paramList->validateParametersAndSetDefaults(*this->getValidParameters());
706 paramList_ = paramList;
707 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
711 template <
class Scalar>
719 template <
class Scalar>
724 temp_param_list = paramList_;
725 paramList_ = Teuchos::null;
726 return(temp_param_list);
730 template<
class Scalar>
731 RCP<const ParameterList>
734 static RCP<const ParameterList> validPL;
735 if (is_null(validPL)) {
736 RCP<ParameterList> pl = Teuchos::parameterList();
737 if (isVariableStep_){
738 pl->sublist(RythmosStepControlSettings_name);
740 Teuchos::setupVerboseObjectSublist(&*pl);
750 template<
class Scalar>
753 const Teuchos::EVerbosityLevel verbLevel
758 if (!isInitialized_) {
759 out << this->description() <<
" : This stepper is not initialized yet" << std::endl;
763 as<int>(verbLevel) == as<int>(Teuchos::VERB_DEFAULT)
765 as<int>(verbLevel) >= as<int>(Teuchos::VERB_LOW)
768 out << this->description() <<
":" << endl;
769 Teuchos::OSTab tab(out);
770 out <<
"model = " << Teuchos::describe(*model_,verbLevel);
771 out <<
"solver = " << Teuchos::describe(*solver_,verbLevel);
772 out <<
"irk_W_factory = " << Teuchos::describe(*irk_W_factory_,verbLevel);
780 template <
class Scalar>
785 using Teuchos::rcp_dynamic_cast;
787 TEUCHOS_TEST_FOR_EXCEPT(is_null(model_));
788 TEUCHOS_TEST_FOR_EXCEPT(is_null(solver_));
789 TEUCHOS_TEST_FOR_EXCEPT(irkButcherTableau_->numStages() == 0);
790 TEUCHOS_ASSERT(haveInitialCondition_);
792 #ifdef HAVE_RYTHMOS_DEBUG 793 THYRA_ASSERT_VEC_SPACES(
794 "Rythmos::ImplicitRKStepper::initialize_(...)",
795 *x_->space(), *model_->get_x_space() );
798 if (isVariableStep_ ) {
800 if (stepControl_ == Teuchos::null) {
801 RCP<ImplicitBDFStepperRampingStepControl<Scalar> > rkStepControl =
805 RCP<Teuchos::ParameterList> stepControlPL =
806 Teuchos::sublist(paramList_ , RythmosStepControlSettings_name);
807 rkStepControl->setParameterList(stepControlPL);
808 this->setStepControlStrategy(rkStepControl);
809 stepControl_->initialize(*
this);
816 TEUCHOS_TEST_FOR_EXCEPT(is_null(irk_W_factory_));
817 irkModel_ = implicitRKModelEvaluator(
818 model_,basePoint_,irk_W_factory_,irkButcherTableau_);
820 irkModel_ = diagonalImplicitRKModelEvaluator(
821 model_,basePoint_,irk_W_factory_,irkButcherTableau_);
824 solver_->setModel(irkModel_);
827 const int numStages = irkButcherTableau_->numStages();
828 RCP<const Thyra::ProductVectorSpaceBase<Scalar> > pvs = productVectorSpace(model_->get_x_space(),numStages);
829 RCP<const Thyra::VectorSpaceBase<Scalar> > vs = rcp_dynamic_cast<
const Thyra::VectorSpaceBase<Scalar> >(pvs,
true);
830 x_stage_bar_ = rcp_dynamic_cast<Thyra::ProductVectorBase<Scalar> >(createMember(vs),
true);
835 isInitialized_ =
true;
839 template <
class Scalar>
842 TEUCHOS_ASSERT( !is_null(rkButcherTableau) );
843 TEUCHOS_TEST_FOR_EXCEPTION( isInitialized_, std::logic_error,
844 "Error! The RK Butcher Tableau cannot be changed after internal initialization!" 846 validateIRKButcherTableau(*rkButcherTableau);
847 irkButcherTableau_ = rkButcherTableau;
848 E_RKButcherTableauTypes rkType = determineRKBTType<Scalar>(*irkButcherTableau_);
850 (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_DIRK)
851 || (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_SDIRK)
852 || (irkButcherTableau_->numStages() == 1)
859 template <
class Scalar>
862 return irkButcherTableau_;
865 template<
class Scalar>
868 TEUCHOS_TEST_FOR_EXCEPTION(isInitialized_, std::logic_error,
869 "Error! Cannot change DIRK flag after internal initialization is completed\n" 871 if (isDirk ==
true) {
872 E_RKButcherTableauTypes rkType = determineRKBTType<Scalar>(*irkButcherTableau_);
873 bool RKBT_is_DIRK = (
874 (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_DIRK)
875 || (rkType == RYTHMOS_RK_BUTCHER_TABLEAU_TYPE_SDIRK)
876 || (irkButcherTableau_->numStages() == 1)
878 TEUCHOS_TEST_FOR_EXCEPTION( !RKBT_is_DIRK, std::logic_error,
879 "Error! Cannot set DIRK flag on a non-DIRK RK Butcher Tableau\n" 892 #define RYTHMOS_IMPLICIT_RK_STEPPER_INSTANT(SCALAR) \ 894 template class ImplicitRKStepper< SCALAR >; \ 896 template RCP< ImplicitRKStepper< SCALAR > > \ 897 implicitRKStepper(); \ 899 template RCP< ImplicitRKStepper< SCALAR > > \ 901 const RCP<const Thyra::ModelEvaluator< SCALAR > >& model, \ 902 const RCP<Thyra::NonlinearSolverBase< SCALAR > >& solver, \ 903 const RCP<Thyra::LinearOpWithSolveFactoryBase< SCALAR > >& irk_W_factory, \ 904 const RCP<const RKButcherTableauBase< SCALAR > >& irkbt \ 909 #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
void setTimeStepPoint(const RCP< const Thyra::VectorBase< Scalar > > &x_old, const Scalar &t_old, const Scalar &delta_t)
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
void setTimeStepPoint(const RCP< const Thyra::VectorBase< Scalar > > &x_old, const Scalar &t_old, const Scalar &delta_t)
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)