10#ifndef THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
11#define THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
14#include "Thyra_BelosLinearOpWithSolveFactory_decl.hpp"
15#include "Thyra_BelosLinearOpWithSolve.hpp"
16#include "Thyra_ScaledAdjointLinearOpBase.hpp"
31#if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
32#include "Thyra_BelosTpetrasSolverAdapter.hpp"
35#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
36#include "Teuchos_StandardParameterEntryValidators.hpp"
37#include "Teuchos_ParameterList.hpp"
38#include "Teuchos_dyn_cast.hpp"
39#include "Teuchos_ValidatorXMLConverterDB.hpp"
40#include "Teuchos_StandardValidatorXMLConverters.hpp"
77#if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
92const std::string LeftPreconditionerIfUnspecified_name =
"Left Preconditioner If Unspecified";
100 :solverType_(SOLVER_TYPE_PSEUDO_BLOCK_GMRES),
101 convergenceTestFrequency_(1)
103 updateThisValidParamList();
107template<
class Scalar>
109 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory
111 :solverType_(SOLVER_TYPE_PSEUDO_BLOCK_GMRES)
120template<
class Scalar>
127template<
class Scalar>
129 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
130 const std::string &precFactoryName
133 TEUCHOS_TEST_FOR_EXCEPT(!precFactory.get());
134 RCP<const Teuchos::ParameterList>
135 precFactoryValidPL = precFactory->getValidParameters();
136 const std::string _precFactoryName =
137 ( precFactoryName !=
""
139 : ( precFactoryValidPL.get() ? precFactoryValidPL->name() :
"GENERIC PRECONDITIONER FACTORY" )
141 precFactory_ = precFactory;
142 precFactoryName_ = _precFactoryName;
143 updateThisValidParamList();
147template<
class Scalar>
148RCP<PreconditionerFactoryBase<Scalar> >
155template<
class Scalar>
157 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
158 std::string *precFactoryName
161 if(precFactory) *precFactory = precFactory_;
162 if(precFactoryName) *precFactoryName = precFactoryName_;
163 precFactory_ = Teuchos::null;
164 precFactoryName_ =
"";
165 updateThisValidParamList();
169template<
class Scalar>
171 const LinearOpSourceBase<Scalar> &fwdOpSrc
174 if(precFactory_.get())
175 return precFactory_->isCompatible(fwdOpSrc);
180template<
class Scalar>
181RCP<LinearOpWithSolveBase<Scalar> >
188template<
class Scalar>
190 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
191 LinearOpWithSolveBase<Scalar> *Op,
192 const ESupportSolveUse supportSolveUse
196 initializeOpImpl(fwdOpSrc,null,null,
false,Op,supportSolveUse);
200template<
class Scalar>
202 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
203 LinearOpWithSolveBase<Scalar> *Op
207 initializeOpImpl(fwdOpSrc,null,null,
true,Op,SUPPORT_SOLVE_UNSPECIFIED);
211template<
class Scalar>
213 const EPreconditionerInputType precOpType
216 if(precFactory_.get())
218 return (precOpType==PRECONDITIONER_INPUT_TYPE_AS_OPERATOR);
222template<
class Scalar>
224 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
225 const RCP<
const PreconditionerBase<Scalar> > &prec,
226 LinearOpWithSolveBase<Scalar> *Op,
227 const ESupportSolveUse supportSolveUse
231 initializeOpImpl(fwdOpSrc,null,prec,
false,Op,supportSolveUse);
235template<
class Scalar>
237 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
238 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
239 LinearOpWithSolveBase<Scalar> *Op,
240 const ESupportSolveUse supportSolveUse
244 initializeOpImpl(fwdOpSrc,approxFwdOpSrc,null,
false,Op,supportSolveUse);
248template<
class Scalar>
250 LinearOpWithSolveBase<Scalar> *Op,
251 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
252 RCP<
const PreconditionerBase<Scalar> > *prec,
253 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
254 ESupportSolveUse *supportSolveUse
258 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
261 &belosOp = Teuchos::dyn_cast<BelosLinearOpWithSolve<Scalar> >(*Op);
262 RCP<const LinearOpSourceBase<Scalar> >
264 RCP<const PreconditionerBase<Scalar> >
269 RCP<const LinearOpSourceBase<Scalar> >
273 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
274 if(prec) *prec = _prec;
275 if(approxFwdOpSrc) *approxFwdOpSrc = _approxFwdOpSrc;
276 if(supportSolveUse) *supportSolveUse = _supportSolveUse;
283template<
class Scalar>
285 RCP<Teuchos::ParameterList>
const& paramList
288 TEUCHOS_TEST_FOR_EXCEPT(paramList.get()==NULL);
289 paramList->validateParametersAndSetDefaults(*this->getValidParameters(), 1);
290 paramList_ = paramList;
292 Teuchos::getIntegralValue<EBelosSolverType>(*paramList_, SolverType_name);
293 convergenceTestFrequency_ =
294 Teuchos::getParameter<int>(*paramList_, ConvergenceTestFrequency_name);
295 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
299template<
class Scalar>
300RCP<Teuchos::ParameterList>
307template<
class Scalar>
308RCP<Teuchos::ParameterList>
311 RCP<Teuchos::ParameterList> _paramList = paramList_;
312 paramList_ = Teuchos::null;
317template<
class Scalar>
318RCP<const Teuchos::ParameterList>
325template<
class Scalar>
326RCP<const Teuchos::ParameterList>
329 return thisValidParamList_;
336template<
class Scalar>
339 std::ostringstream oss;
340 oss << Teuchos::Describable::description();
342 if (nonnull(precFactory_)) {
343 oss << precFactory_->description();
353template<
class Scalar>
354RCP<const Teuchos::ParameterList>
358 using Teuchos::tuple;
359 using Teuchos::setStringToIntegralParameter;
360Teuchos::ValidatorXMLConverterDB::addConverter(
361 Teuchos::DummyObjectGetter<
362 Teuchos::StringToIntegralParameterEntryValidator<EBelosSolverType>
364 Teuchos::DummyObjectGetter<Teuchos::StringToIntegralValidatorXMLConverter<
365 EBelosSolverType> >::getDummyObject());
367 typedef MultiVectorBase<Scalar> MV_t;
368 typedef LinearOpBase<Scalar> LO_t;
369 static RCP<Teuchos::ParameterList> validParamList;
370 if(validParamList.get()==NULL) {
371 validParamList = Teuchos::rcp(
new Teuchos::ParameterList(
"BelosLinearOpWithSolveFactory"));
372 setStringToIntegralParameter<EBelosSolverType>(
373 SolverType_name, SolverType_default,
374 "Type of linear solver algorithm to use.",
377 "Pseudo Block GMRES",
380 "Pseudo Block Stochastic CG",
387#
if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
389 "TPETRA GMRES PIPELINE",
390 "TPETRA GMRES SINGLE REDUCE",
391 "TPETRA GMRES S-STEP"
395 "Block GMRES solver for nonsymmetric linear systems. It can also solve "
396 "single right-hand side systems, and can also perform Flexible GMRES "
397 "(where the preconditioner may change at every iteration, for example "
398 "for inner-outer iterations), by setting options in the \"Block GMRES\" "
401 "GMRES solver for nonsymmetric linear systems, that performs single "
402 "right-hand side solves on multiple right-hand sides at once. It "
403 "exploits operator multivector multiplication in order to amortize "
404 "global communication costs. Individual linear systems are deflated "
405 "out as they are solved.",
407 "Block CG solver for symmetric (Hermitian in complex arithmetic) "
408 "positive definite linear systems. It can also solve single "
409 "right-hand-side systems.",
411 "CG solver that performs single right-hand side CG on multiple right-hand "
412 "sides at once. It exploits operator multivector multiplication in order "
413 "to amortize global communication costs. Individual linear systems are "
414 "deflated out as they are solved.",
416 "stochastic CG solver that performs single right-hand side CG on multiple right-hand "
417 "sides at once. It exploits operator multivector multiplication in order "
418 "to amortize global communication costs. Individual linear systems are "
419 "deflated out as they are solved. [EXPERIMENTAL]",
421 "Variant of GMRES that performs subspace recycling to accelerate "
422 "convergence for sequences of solves with related linear systems. "
423 "Individual linear systems are deflated out as they are solved. "
424 "The current implementation only supports real-valued Scalar types.",
426 "CG solver for symmetric (Hermitian in complex arithmetic) positive "
427 "definite linear systems, that performs subspace recycling to "
428 "accelerate convergence for sequences of related linear systems.",
430 "MINRES solver for symmetric indefinite linear systems. It performs "
431 "single-right-hand-side solves on multiple right-hand sides sequentially.",
433 "TFQMR (Transpose-Free QMR) solver for nonsymmetric linear systems.",
435 "BiCGStab solver for nonsymmetric linear systems.",
437 "Fixed point iteration"
439#
if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
440 ,
"Native Tpetra implementation of GMRES",
442 "Native Tpetra implementation of pipeline GMRES",
444 "Native Tpetra implementation of single-reduce GMRES",
446 "Native Tpetra implementation of s-step GMRES"
449 tuple<EBelosSolverType>(
450 SOLVER_TYPE_BLOCK_GMRES,
451 SOLVER_TYPE_PSEUDO_BLOCK_GMRES,
452 SOLVER_TYPE_BLOCK_CG,
453 SOLVER_TYPE_PSEUDO_BLOCK_CG,
454 SOLVER_TYPE_PSEUDO_BLOCK_STOCHASTIC_CG,
459 SOLVER_TYPE_BICGSTAB,
460 SOLVER_TYPE_FIXEDPOINT
461#
if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
462 ,SOLVER_TYPE_TPETRA_GMRES,
463 SOLVER_TYPE_TPETRA_GMRES_PIPELINE,
464 SOLVER_TYPE_TPETRA_GMRES_SINGLE_REDUCE,
465 SOLVER_TYPE_TPETRA_GMRES_SSTEP
470 validParamList->set(ConvergenceTestFrequency_name, as<int>(1),
471 "Number of linear solver iterations to skip between applying"
472 " user-defined convergence test.");
474 LeftPreconditionerIfUnspecified_name,
false,
475 "If the preconditioner does not specify if it is left or right, and this\n"
476 "option is set to true, put the preconditioner on the left side.\n"
477 "Historically, preconditioning is on the right. Some solvers may not\n"
478 "support left preconditioning.");
479 Teuchos::ParameterList
480 &solverTypesSL = validParamList->sublist(SolverTypes_name);
483 const bool scalarIsReal = !Teuchos::ScalarTraits<Scalar>::isComplex;
497 if (lapackSupportsScalar) {
500 *mgr.getValidParameters()
503 if (lapackSupportsScalar) {
505 solverTypesSL.sublist(PseudoBlockCG_name).setParameters(
506 *mgr.getValidParameters()
511 solverTypesSL.sublist(PseudoBlockStochasticCG_name).setParameters(
515 if (lapackSupportsScalar) {
518 *mgr.getValidParameters()
521 if (lapackSupportsScalar && scalarIsReal) {
523 solverTypesSL.sublist(RCG_name).setParameters(
524 *mgr.getValidParameters()
529 solverTypesSL.sublist(MINRES_name).setParameters(
551#if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
553 Thyra::BelosTpetraGmres<Scalar,MV_t,LO_t> mgr;
555 *mgr.getValidParameters()
559 Thyra::BelosTpetraGmresPipeline<Scalar,MV_t,LO_t> mgr;
560 solverTypesSL.sublist(TpetraGmresPipeline_name).setParameters(
561 *mgr.getValidParameters()
565 Thyra::BelosTpetraGmresSingleReduce<Scalar,MV_t,LO_t> mgr;
566 solverTypesSL.sublist(TpetraGmresSingleReduce_name).setParameters(
567 *mgr.getValidParameters()
571 Thyra::BelosTpetraGmresSstep<Scalar,MV_t,LO_t> mgr;
572 solverTypesSL.sublist(TpetraGmresSstep_name).setParameters(
573 *mgr.getValidParameters()
578 return validParamList;
582template<
class Scalar>
583void BelosLinearOpWithSolveFactory<Scalar>::updateThisValidParamList()
585 thisValidParamList_ = Teuchos::rcp(
586 new Teuchos::ParameterList(*generateAndGetValidParameters())
588 Teuchos::setupVerboseObjectSublist(&*thisValidParamList_);
592template<
class Scalar>
593void BelosLinearOpWithSolveFactory<Scalar>::initializeOpImpl(
594 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
595 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
596 const RCP<
const PreconditionerBase<Scalar> > &prec_in,
597 const bool reusePrec,
598 LinearOpWithSolveBase<Scalar> *Op,
599 const ESupportSolveUse supportSolveUse
604 using Teuchos::set_extra_data;
605 typedef Teuchos::ScalarTraits<Scalar> ST;
606 typedef MultiVectorBase<Scalar> MV_t;
607 typedef LinearOpBase<Scalar> LO_t;
609 const RCP<Teuchos::FancyOStream> out = this->getOStream();
610 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
611 Teuchos::OSTab tab(out);
612 if(out.get() &&
static_cast<int>(verbLevel) >
static_cast<int>(Teuchos::VERB_LOW))
613 *out <<
"\nEntering Thyra::BelosLinearOpWithSolveFactory<"<<ST::name()<<
">::initializeOpImpl(...) ...\n";
620 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
621 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc.get()==NULL);
622 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc->getOp().get()==NULL);
623 RCP<const LinearOpBase<Scalar> >
624 fwdOp = fwdOpSrc->getOp(),
625 approxFwdOp = ( approxFwdOpSrc.get() ? approxFwdOpSrc->getOp() : Teuchos::null );
631 BelosLinearOpWithSolve<Scalar>
632 *belosOp = &Teuchos::dyn_cast<BelosLinearOpWithSolve<Scalar> >(*Op);
638 RCP<PreconditionerBase<Scalar> > myPrec = Teuchos::null;
639 RCP<const PreconditionerBase<Scalar> > prec = Teuchos::null;
646 if(precFactory_.get()) {
648 ( !belosOp->isExternalPrec()
649 ? Teuchos::rcp_const_cast<PreconditionerBase<Scalar> >(belosOp->extract_prec())
652 bool hasExistingPrec =
false;
654 hasExistingPrec =
true;
659 hasExistingPrec =
false;
660 myPrec = precFactory_->createPrec();
662 if( hasExistingPrec && reusePrec ) {
667 if(approxFwdOp.get())
668 precFactory_->initializePrec(approxFwdOpSrc,&*myPrec);
670 precFactory_->initializePrec(fwdOpSrc,&*myPrec);
680 bool oldIsExternalPrec =
false;
681 RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > oldLP = Teuchos::null;
682 RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > oldIterSolver = Teuchos::null;
683 RCP<const LinearOpSourceBase<Scalar> > oldFwdOpSrc = Teuchos::null;
684 RCP<const LinearOpSourceBase<Scalar> > oldApproxFwdOpSrc = Teuchos::null;
685 ESupportSolveUse oldSupportSolveUse = SUPPORT_SOLVE_UNSPECIFIED;
687 belosOp->uninitialize( &oldLP, NULL, &oldIterSolver, &oldFwdOpSrc,
688 NULL, &oldIsExternalPrec, &oldApproxFwdOpSrc, &oldSupportSolveUse );
697 if (oldLP != Teuchos::null) {
701 lp = rcp(
new LP_t());
708 lp->setOperator(fwdOp);
715 RCP<const LinearOpBase<Scalar> > unspecified = prec->getUnspecifiedPrecOp();
716 RCP<const LinearOpBase<Scalar> > left = prec->getLeftPrecOp();
717 RCP<const LinearOpBase<Scalar> > right = prec->getRightPrecOp();
718 TEUCHOS_TEST_FOR_EXCEPTION(
719 !( left.get() || right.get() || unspecified.get() ), std::logic_error
720 ,
"Error, at least one preconditoner linear operator objects must be set!"
722 if (nonnull(unspecified)) {
723 if (paramList_->get<
bool>(LeftPreconditionerIfUnspecified_name,
false))
724 lp->setLeftPrec(unspecified);
726 lp->setRightPrec(unspecified);
728 else if (nonnull(left)) {
729 lp->setLeftPrec(left);
731 else if (nonnull(right)) {
732 lp->setRightPrec(right);
736 TEUCHOS_TEST_FOR_EXCEPTION(
737 nonnull(left) && nonnull(right),std::logic_error
738 ,
"Error, we can not currently handle split preconditioners!"
743 set_extra_data<RCP<PreconditionerBase<Scalar> > >(myPrec,
"Belos::InternalPrec",
744 Teuchos::inOutArg(lp), Teuchos::POST_DESTROY,
false);
746 else if(prec.get()) {
747 set_extra_data<RCP<const PreconditionerBase<Scalar> > >(prec,
"Belos::ExternalPrec",
748 Teuchos::inOutArg(lp), Teuchos::POST_DESTROY,
false);
756 RCP<IterativeSolver_t> iterativeSolver = Teuchos::null;
757 RCP<Teuchos::ParameterList> solverPL = Teuchos::rcp(
new Teuchos::ParameterList() );
759 switch(solverType_) {
760 case SOLVER_TYPE_BLOCK_GMRES:
763 if(paramList_.get()) {
764 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
765 Teuchos::ParameterList &gmresPL = solverTypesPL.sublist(BlockGMRES_name);
766 solverPL = Teuchos::rcp( &gmresPL,
false );
769 if (oldIterSolver != Teuchos::null) {
770 iterativeSolver = oldIterSolver;
771 iterativeSolver->setProblem( lp );
772 iterativeSolver->setParameters( solverPL );
779 case SOLVER_TYPE_PSEUDO_BLOCK_GMRES:
782 if(paramList_.get()) {
783 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
784 Teuchos::ParameterList &pbgmresPL = solverTypesPL.sublist(PseudoBlockGMRES_name);
785 solverPL = Teuchos::rcp( &pbgmresPL,
false );
790 if (oldIterSolver != Teuchos::null) {
791 iterativeSolver = oldIterSolver;
792 iterativeSolver->setProblem( lp );
793 iterativeSolver->setParameters( solverPL );
800 case SOLVER_TYPE_BLOCK_CG:
803 if(paramList_.get()) {
804 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
805 Teuchos::ParameterList &cgPL = solverTypesPL.sublist(BlockCG_name);
806 solverPL = Teuchos::rcp( &cgPL,
false );
809 if (oldIterSolver != Teuchos::null) {
810 iterativeSolver = oldIterSolver;
811 iterativeSolver->setProblem( lp );
812 iterativeSolver->setParameters( solverPL );
819 case SOLVER_TYPE_PSEUDO_BLOCK_CG:
822 if(paramList_.get()) {
823 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
824 Teuchos::ParameterList &pbcgPL = solverTypesPL.sublist(PseudoBlockCG_name);
825 solverPL = Teuchos::rcp( &pbcgPL,
false );
830 if (oldIterSolver != Teuchos::null) {
831 iterativeSolver = oldIterSolver;
832 iterativeSolver->setProblem( lp );
833 iterativeSolver->setParameters( solverPL );
840 case SOLVER_TYPE_PSEUDO_BLOCK_STOCHASTIC_CG:
843 if(paramList_.get()) {
844 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
845 Teuchos::ParameterList &pbcgPL = solverTypesPL.sublist(PseudoBlockStochasticCG_name);
846 solverPL = Teuchos::rcp( &pbcgPL,
false );
851 if (oldIterSolver != Teuchos::null) {
852 iterativeSolver = oldIterSolver;
853 iterativeSolver->setProblem( lp );
854 iterativeSolver->setParameters( solverPL );
861 case SOLVER_TYPE_GCRODR:
864 if(paramList_.get()) {
865 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
866 Teuchos::ParameterList &gcrodrPL = solverTypesPL.sublist(GCRODR_name);
867 solverPL = Teuchos::rcp( &gcrodrPL,
false );
870 if (oldIterSolver != Teuchos::null) {
871 iterativeSolver = oldIterSolver;
872 iterativeSolver->setProblem( lp );
873 iterativeSolver->setParameters( solverPL );
880 case SOLVER_TYPE_RCG:
883 if(paramList_.get()) {
884 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
885 Teuchos::ParameterList &rcgPL = solverTypesPL.sublist(RCG_name);
886 solverPL = Teuchos::rcp( &rcgPL,
false );
889 if (oldIterSolver != Teuchos::null) {
890 iterativeSolver = oldIterSolver;
891 iterativeSolver->setProblem( lp );
892 iterativeSolver->setParameters( solverPL );
899 case SOLVER_TYPE_MINRES:
902 if(paramList_.get()) {
903 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
904 Teuchos::ParameterList &minresPL = solverTypesPL.sublist(MINRES_name);
905 solverPL = Teuchos::rcp( &minresPL,
false );
908 if (oldIterSolver != Teuchos::null) {
909 iterativeSolver = oldIterSolver;
910 iterativeSolver->setProblem( lp );
911 iterativeSolver->setParameters( solverPL );
918 case SOLVER_TYPE_TFQMR:
921 if(paramList_.get()) {
922 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
923 Teuchos::ParameterList &minresPL = solverTypesPL.sublist(TFQMR_name);
924 solverPL = Teuchos::rcp( &minresPL,
false );
927 if (oldIterSolver != Teuchos::null) {
928 iterativeSolver = oldIterSolver;
929 iterativeSolver->setProblem( lp );
930 iterativeSolver->setParameters( solverPL );
937 case SOLVER_TYPE_BICGSTAB:
940 if(paramList_.get()) {
941 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
942 Teuchos::ParameterList &bicgstabPL = solverTypesPL.sublist(BiCGStab_name);
943 solverPL = Teuchos::rcp( &bicgstabPL,
false );
946 if (oldIterSolver != Teuchos::null) {
947 iterativeSolver = oldIterSolver;
948 iterativeSolver->setProblem( lp );
949 iterativeSolver->setParameters( solverPL );
956 case SOLVER_TYPE_FIXEDPOINT:
959 if(paramList_.get()) {
960 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
961 Teuchos::ParameterList &fixedPointPL = solverTypesPL.sublist(FixedPoint_name);
962 solverPL = Teuchos::rcp( &fixedPointPL,
false );
965 if (oldIterSolver != Teuchos::null) {
966 iterativeSolver = oldIterSolver;
967 iterativeSolver->setProblem( lp );
968 iterativeSolver->setParameters( solverPL );
975#if defined(HAVE_BELOS_TPETRA) && defined(HAVE_STRATIMIKOS_THYRATPETRAADAPTERS)
976 case SOLVER_TYPE_TPETRA_GMRES:
979 if(paramList_.get()) {
980 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
981 Teuchos::ParameterList &tpetraGmresPL = solverTypesPL.sublist(TpetraGmres_name);
982 solverPL = Teuchos::rcp( &tpetraGmresPL,
false );
985 iterativeSolver = rcp(
new Thyra::BelosTpetraGmres<Scalar,MV_t,LO_t>());
987 iterativeSolver->setProblem( lp );
988 iterativeSolver->setParameters( solverPL );
991 case SOLVER_TYPE_TPETRA_GMRES_PIPELINE:
994 if(paramList_.get()) {
995 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
996 Teuchos::ParameterList &tpetraGmresPipelinePL = solverTypesPL.sublist(TpetraGmresPipeline_name);
997 solverPL = Teuchos::rcp( &tpetraGmresPipelinePL,
false );
1000 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresPipeline<Scalar,MV_t,LO_t>());
1002 iterativeSolver->setProblem( lp );
1003 iterativeSolver->setParameters( solverPL );
1006 case SOLVER_TYPE_TPETRA_GMRES_SINGLE_REDUCE:
1009 if(paramList_.get()) {
1010 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1011 Teuchos::ParameterList &tpetraGmresSingleReducePL = solverTypesPL.sublist(TpetraGmresSingleReduce_name);
1012 solverPL = Teuchos::rcp( &tpetraGmresSingleReducePL,
false );
1015 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresSingleReduce<Scalar,MV_t,LO_t>());
1017 iterativeSolver->setProblem( lp );
1018 iterativeSolver->setParameters( solverPL );
1021 case SOLVER_TYPE_TPETRA_GMRES_SSTEP:
1024 if(paramList_.get()) {
1025 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1026 Teuchos::ParameterList &tpetraGmresSstepPL = solverTypesPL.sublist(TpetraGmresSstep_name);
1027 solverPL = Teuchos::rcp( &tpetraGmresSstepPL,
false );
1030 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresSstep<Scalar,MV_t,LO_t>());
1032 iterativeSolver->setProblem( lp );
1033 iterativeSolver->setParameters( solverPL );
1039 TEUCHOS_TEST_FOR_EXCEPT(
true);
1047 belosOp->initialize(
1048 lp, solverPL, iterativeSolver,
1049 fwdOpSrc, prec, myPrec.get()==NULL, approxFwdOpSrc,
1050 supportSolveUse, convergenceTestFrequency_
1052 belosOp->setOStream(out);
1053 belosOp->setVerbLevel(verbLevel);
1055 if(paramList_.get()) {
1057 paramList_->validateParameters(*this->getValidParameters(),1);
1060 if(out.get() &&
static_cast<int>(verbLevel) >
static_cast<int>(Teuchos::VERB_LOW))
1061 *out <<
"\nLeaving Thyra::BelosLinearOpWithSolveFactory<"<<ST::name()<<
">::initializeOpImpl(...) ...\n";
Thyra specializations of MultiVecTraits and OperatorTraits.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms) override
LinearOpWithSolveFactoryBase subclass implemented in terms of Belos.
static const std::string TpetraGmresSstep_name
void unsetPreconditionerFactory(Teuchos::RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
static const std::string TFQMR_name
static const std::string ConvergenceTestFrequency_name
static const std::string TpetraGmresPipeline_name
static const std::string TpetraGmresSingleReduce_name
static const std::string BlockGMRES_name
static const std::string SolverType_name
void initializePreconditionedOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const Teuchos::RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
std::string description() const
static const std::string SolverTypes_name
static const std::string MINRES_name
static const std::string SolverType_default
static const std::string BiCGStab_name
void setPreconditionerFactory(const Teuchos::RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
static const std::string GCRODR_name
static const std::string TpetraGmres_name
void initializeAndReuseOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
static const std::string PseudoBlockCG_name
Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
static const std::string RCG_name
static const std::string BlockCG_name
void initializeOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
bool acceptsPreconditionerFactory() const
Returns true .
static const std::string FixedPoint_name
void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, Teuchos::RCP< const PreconditionerBase< Scalar > > *prec, Teuchos::RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
BelosLinearOpWithSolveFactory()
Construct without preconditioner factory.
void initializeApproxPreconditionedOp(const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Teuchos::RCP< LinearOpWithSolveBase< Scalar > > createOp() const
static const std::string PseudoBlockGMRES_name
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
static const std::string PseudoBlockStochasticCG_name
Teuchos::RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Concrete LinearOpWithSolveBase subclass in terms of Belos.
ESupportSolveUse supportSolveUse() const
RCP< const LinearOpSourceBase< Scalar > > extract_approxFwdOpSrc()
RCP< const PreconditionerBase< Scalar > > extract_prec()
bool isExternalPrec() const
RCP< const LinearOpSourceBase< Scalar > > extract_fwdOpSrc()