45#ifndef THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
46#define THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_HPP
49#include "Thyra_BelosLinearOpWithSolveFactory_decl.hpp"
50#include "Thyra_BelosLinearOpWithSolve.hpp"
51#include "Thyra_ScaledAdjointLinearOpBase.hpp"
66#include "Thyra_BelosTpetrasSolverAdapter.hpp"
68#include "Teuchos_VerboseObjectParameterListHelpers.hpp"
69#include "Teuchos_StandardParameterEntryValidators.hpp"
70#include "Teuchos_ParameterList.hpp"
71#include "Teuchos_dyn_cast.hpp"
72#include "Teuchos_ValidatorXMLConverterDB.hpp"
73#include "Teuchos_StandardValidatorXMLConverters.hpp"
101template<
class Scalar>
103template<
class Scalar>
105template<
class Scalar>
107template<
class Scalar>
109template<
class Scalar>
111template<
class Scalar>
113template<
class Scalar>
115template<
class Scalar>
118template<
class Scalar>
122const std::string LeftPreconditionerIfUnspecified_name =
"Left Preconditioner If Unspecified";
128template<
class Scalar>
130 :solverType_(SOLVER_TYPE_PSEUDO_BLOCK_GMRES),
131 convergenceTestFrequency_(1)
133 updateThisValidParamList();
137template<
class Scalar>
139 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory
141 :solverType_(SOLVER_TYPE_PSEUDO_BLOCK_GMRES)
150template<
class Scalar>
157template<
class Scalar>
159 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
160 const std::string &precFactoryName
163 TEUCHOS_TEST_FOR_EXCEPT(!precFactory.get());
164 RCP<const Teuchos::ParameterList>
165 precFactoryValidPL = precFactory->getValidParameters();
166 const std::string _precFactoryName =
167 ( precFactoryName !=
""
169 : ( precFactoryValidPL.get() ? precFactoryValidPL->name() :
"GENERIC PRECONDITIONER FACTORY" )
171 precFactory_ = precFactory;
172 precFactoryName_ = _precFactoryName;
173 updateThisValidParamList();
177template<
class Scalar>
178RCP<PreconditionerFactoryBase<Scalar> >
185template<
class Scalar>
187 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
188 std::string *precFactoryName
191 if(precFactory) *precFactory = precFactory_;
192 if(precFactoryName) *precFactoryName = precFactoryName_;
193 precFactory_ = Teuchos::null;
194 precFactoryName_ =
"";
195 updateThisValidParamList();
199template<
class Scalar>
201 const LinearOpSourceBase<Scalar> &fwdOpSrc
204 if(precFactory_.get())
205 return precFactory_->isCompatible(fwdOpSrc);
210template<
class Scalar>
211RCP<LinearOpWithSolveBase<Scalar> >
218template<
class Scalar>
220 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
221 LinearOpWithSolveBase<Scalar> *Op,
222 const ESupportSolveUse supportSolveUse
226 initializeOpImpl(fwdOpSrc,null,null,
false,Op,supportSolveUse);
230template<
class Scalar>
232 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
233 LinearOpWithSolveBase<Scalar> *Op
237 initializeOpImpl(fwdOpSrc,null,null,
true,Op,SUPPORT_SOLVE_UNSPECIFIED);
241template<
class Scalar>
243 const EPreconditionerInputType precOpType
246 if(precFactory_.get())
248 return (precOpType==PRECONDITIONER_INPUT_TYPE_AS_OPERATOR);
252template<
class Scalar>
254 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
255 const RCP<
const PreconditionerBase<Scalar> > &prec,
256 LinearOpWithSolveBase<Scalar> *Op,
257 const ESupportSolveUse supportSolveUse
261 initializeOpImpl(fwdOpSrc,null,prec,
false,Op,supportSolveUse);
265template<
class Scalar>
267 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
268 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
269 LinearOpWithSolveBase<Scalar> *Op,
270 const ESupportSolveUse supportSolveUse
274 initializeOpImpl(fwdOpSrc,approxFwdOpSrc,null,
false,Op,supportSolveUse);
278template<
class Scalar>
280 LinearOpWithSolveBase<Scalar> *Op,
281 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
282 RCP<
const PreconditionerBase<Scalar> > *prec,
283 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
284 ESupportSolveUse *supportSolveUse
288 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
291 &belosOp = Teuchos::dyn_cast<BelosLinearOpWithSolve<Scalar> >(*Op);
292 RCP<const LinearOpSourceBase<Scalar> >
294 RCP<const PreconditionerBase<Scalar> >
299 RCP<const LinearOpSourceBase<Scalar> >
303 if(fwdOpSrc) *fwdOpSrc = _fwdOpSrc;
304 if(prec) *prec = _prec;
305 if(approxFwdOpSrc) *approxFwdOpSrc = _approxFwdOpSrc;
306 if(supportSolveUse) *supportSolveUse = _supportSolveUse;
313template<
class Scalar>
315 RCP<Teuchos::ParameterList>
const& paramList
318 TEUCHOS_TEST_FOR_EXCEPT(paramList.get()==NULL);
319 paramList->validateParametersAndSetDefaults(*this->getValidParameters(), 1);
320 paramList_ = paramList;
322 Teuchos::getIntegralValue<EBelosSolverType>(*paramList_, SolverType_name);
323 convergenceTestFrequency_ =
324 Teuchos::getParameter<int>(*paramList_, ConvergenceTestFrequency_name);
325 Teuchos::readVerboseObjectSublist(&*paramList_,
this);
329template<
class Scalar>
330RCP<Teuchos::ParameterList>
337template<
class Scalar>
338RCP<Teuchos::ParameterList>
341 RCP<Teuchos::ParameterList> _paramList = paramList_;
342 paramList_ = Teuchos::null;
347template<
class Scalar>
348RCP<const Teuchos::ParameterList>
355template<
class Scalar>
356RCP<const Teuchos::ParameterList>
359 return thisValidParamList_;
366template<
class Scalar>
369 std::ostringstream oss;
370 oss <<
"Thyra::BelosLinearOpWithSolveFactory";
381template<
class Scalar>
382RCP<const Teuchos::ParameterList>
386 using Teuchos::tuple;
387 using Teuchos::setStringToIntegralParameter;
388Teuchos::ValidatorXMLConverterDB::addConverter(
389 Teuchos::DummyObjectGetter<
390 Teuchos::StringToIntegralParameterEntryValidator<EBelosSolverType>
392 Teuchos::DummyObjectGetter<Teuchos::StringToIntegralValidatorXMLConverter<
393 EBelosSolverType> >::getDummyObject());
395 typedef MultiVectorBase<Scalar> MV_t;
396 typedef LinearOpBase<Scalar> LO_t;
397 static RCP<Teuchos::ParameterList> validParamList;
398 if(validParamList.get()==NULL) {
399 validParamList = Teuchos::rcp(
new Teuchos::ParameterList(
"BelosLinearOpWithSolveFactory"));
400 setStringToIntegralParameter<EBelosSolverType>(
401 SolverType_name, SolverType_default,
402 "Type of linear solver algorithm to use.",
405 "Pseudo Block GMRES",
408 "Pseudo Block Stochastic CG",
416 "TPETRA GMRES PIPELINE",
417 "TPETRA GMRES SINGLE REDUCE",
418 "TPETRA GMRES S-STEP"
421 "Block GMRES solver for nonsymmetric linear systems. It can also solve "
422 "single right-hand side systems, and can also perform Flexible GMRES "
423 "(where the preconditioner may change at every iteration, for example "
424 "for inner-outer iterations), by setting options in the \"Block GMRES\" "
427 "GMRES solver for nonsymmetric linear systems, that performs single "
428 "right-hand side solves on multiple right-hand sides at once. It "
429 "exploits operator multivector multiplication in order to amortize "
430 "global communication costs. Individual linear systems are deflated "
431 "out as they are solved.",
433 "Block CG solver for symmetric (Hermitian in complex arithmetic) "
434 "positive definite linear systems. It can also solve single "
435 "right-hand-side systems.",
437 "CG solver that performs single right-hand side CG on multiple right-hand "
438 "sides at once. It exploits operator multivector multiplication in order "
439 "to amortize global communication costs. Individual linear systems are "
440 "deflated out as they are solved.",
442 "stochastic CG solver that performs single right-hand side CG on multiple right-hand "
443 "sides at once. It exploits operator multivector multiplication in order "
444 "to amortize global communication costs. Individual linear systems are "
445 "deflated out as they are solved. [EXPERIMENTAL]",
447 "Variant of GMRES that performs subspace recycling to accelerate "
448 "convergence for sequences of solves with related linear systems. "
449 "Individual linear systems are deflated out as they are solved. "
450 "The current implementation only supports real-valued Scalar types.",
452 "CG solver for symmetric (Hermitian in complex arithmetic) positive "
453 "definite linear systems, that performs subspace recycling to "
454 "accelerate convergence for sequences of related linear systems.",
456 "MINRES solver for symmetric indefinite linear systems. It performs "
457 "single-right-hand-side solves on multiple right-hand sides sequentially.",
459 "TFQMR (Transpose-Free QMR) solver for nonsymmetric linear systems.",
461 "BiCGStab solver for nonsymmetric linear systems.",
463 "Fixed point iteration",
465 "Native Tpetra implementation of GMRES",
467 "Native Tpetra implementation of pipeline GMRES",
469 "Native Tpetra implementation of single-reduce GMRES",
471 "Native Tpetra implementation of s-step GMRES"
473 tuple<EBelosSolverType>(
474 SOLVER_TYPE_BLOCK_GMRES,
475 SOLVER_TYPE_PSEUDO_BLOCK_GMRES,
476 SOLVER_TYPE_BLOCK_CG,
477 SOLVER_TYPE_PSEUDO_BLOCK_CG,
478 SOLVER_TYPE_PSEUDO_BLOCK_STOCHASTIC_CG,
483 SOLVER_TYPE_BICGSTAB,
484 SOLVER_TYPE_FIXEDPOINT,
485 SOLVER_TYPE_TPETRA_GMRES,
486 SOLVER_TYPE_TPETRA_GMRES_PIPELINE,
487 SOLVER_TYPE_TPETRA_GMRES_SINGLE_REDUCE,
488 SOLVER_TYPE_TPETRA_GMRES_SSTEP
492 validParamList->set(ConvergenceTestFrequency_name, as<int>(1),
493 "Number of linear solver iterations to skip between applying"
494 " user-defined convergence test.");
496 LeftPreconditionerIfUnspecified_name,
false,
497 "If the preconditioner does not specify if it is left or right, and this\n"
498 "option is set to true, put the preconditioner on the left side.\n"
499 "Historically, preconditioning is on the right. Some solvers may not\n"
500 "support left preconditioning.");
501 Teuchos::ParameterList
502 &solverTypesSL = validParamList->sublist(SolverTypes_name);
505 const bool scalarIsReal = !Teuchos::ScalarTraits<Scalar>::isComplex;
519 if (lapackSupportsScalar) {
522 *mgr.getValidParameters()
525 if (lapackSupportsScalar) {
527 solverTypesSL.sublist(PseudoBlockCG_name).setParameters(
528 *mgr.getValidParameters()
533 solverTypesSL.sublist(PseudoBlockStochasticCG_name).setParameters(
537 if (lapackSupportsScalar) {
540 *mgr.getValidParameters()
543 if (lapackSupportsScalar && scalarIsReal) {
545 solverTypesSL.sublist(RCG_name).setParameters(
546 *mgr.getValidParameters()
551 solverTypesSL.sublist(MINRES_name).setParameters(
574 Thyra::BelosTpetraGmres<Scalar,MV_t,LO_t> mgr;
576 *mgr.getValidParameters()
580 Thyra::BelosTpetraGmresPipeline<Scalar,MV_t,LO_t> mgr;
581 solverTypesSL.sublist(TpetraGmresPipeline_name).setParameters(
582 *mgr.getValidParameters()
586 Thyra::BelosTpetraGmresSingleReduce<Scalar,MV_t,LO_t> mgr;
587 solverTypesSL.sublist(TpetraGmresSingleReduce_name).setParameters(
588 *mgr.getValidParameters()
592 Thyra::BelosTpetraGmresSstep<Scalar,MV_t,LO_t> mgr;
593 solverTypesSL.sublist(TpetraGmresSstep_name).setParameters(
594 *mgr.getValidParameters()
598 return validParamList;
602template<
class Scalar>
603void BelosLinearOpWithSolveFactory<Scalar>::updateThisValidParamList()
605 thisValidParamList_ = Teuchos::rcp(
606 new Teuchos::ParameterList(*generateAndGetValidParameters())
608 Teuchos::setupVerboseObjectSublist(&*thisValidParamList_);
612template<
class Scalar>
613void BelosLinearOpWithSolveFactory<Scalar>::initializeOpImpl(
614 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
615 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
616 const RCP<
const PreconditionerBase<Scalar> > &prec_in,
617 const bool reusePrec,
618 LinearOpWithSolveBase<Scalar> *Op,
619 const ESupportSolveUse supportSolveUse
624 using Teuchos::set_extra_data;
625 typedef Teuchos::ScalarTraits<Scalar> ST;
626 typedef MultiVectorBase<Scalar> MV_t;
627 typedef LinearOpBase<Scalar> LO_t;
629 const RCP<Teuchos::FancyOStream> out = this->getOStream();
630 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
631 Teuchos::OSTab tab(out);
632 if(out.get() &&
static_cast<int>(verbLevel) >
static_cast<int>(Teuchos::VERB_LOW))
633 *out <<
"\nEntering Thyra::BelosLinearOpWithSolveFactory<"<<ST::name()<<
">::initializeOpImpl(...) ...\n";
640 TEUCHOS_TEST_FOR_EXCEPT(Op==NULL);
641 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc.get()==NULL);
642 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc->getOp().get()==NULL);
643 RCP<const LinearOpBase<Scalar> >
644 fwdOp = fwdOpSrc->getOp(),
645 approxFwdOp = ( approxFwdOpSrc.get() ? approxFwdOpSrc->getOp() : Teuchos::null );
651 BelosLinearOpWithSolve<Scalar>
652 *belosOp = &Teuchos::dyn_cast<BelosLinearOpWithSolve<Scalar> >(*Op);
658 RCP<PreconditionerBase<Scalar> > myPrec = Teuchos::null;
659 RCP<const PreconditionerBase<Scalar> > prec = Teuchos::null;
666 if(precFactory_.get()) {
668 ( !belosOp->isExternalPrec()
669 ? Teuchos::rcp_const_cast<PreconditionerBase<Scalar> >(belosOp->extract_prec())
672 bool hasExistingPrec =
false;
674 hasExistingPrec =
true;
679 hasExistingPrec =
false;
680 myPrec = precFactory_->createPrec();
682 if( hasExistingPrec && reusePrec ) {
687 if(approxFwdOp.get())
688 precFactory_->initializePrec(approxFwdOpSrc,&*myPrec);
690 precFactory_->initializePrec(fwdOpSrc,&*myPrec);
700 bool oldIsExternalPrec =
false;
701 RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > oldLP = Teuchos::null;
702 RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > oldIterSolver = Teuchos::null;
703 RCP<const LinearOpSourceBase<Scalar> > oldFwdOpSrc = Teuchos::null;
704 RCP<const LinearOpSourceBase<Scalar> > oldApproxFwdOpSrc = Teuchos::null;
705 ESupportSolveUse oldSupportSolveUse = SUPPORT_SOLVE_UNSPECIFIED;
707 belosOp->uninitialize( &oldLP, NULL, &oldIterSolver, &oldFwdOpSrc,
708 NULL, &oldIsExternalPrec, &oldApproxFwdOpSrc, &oldSupportSolveUse );
717 if (oldLP != Teuchos::null) {
721 lp = rcp(
new LP_t());
728 lp->setOperator(fwdOp);
735 RCP<const LinearOpBase<Scalar> > unspecified = prec->getUnspecifiedPrecOp();
736 RCP<const LinearOpBase<Scalar> > left = prec->getLeftPrecOp();
737 RCP<const LinearOpBase<Scalar> > right = prec->getRightPrecOp();
738 TEUCHOS_TEST_FOR_EXCEPTION(
739 !( left.get() || right.get() || unspecified.get() ), std::logic_error
740 ,
"Error, at least one preconditoner linear operator objects must be set!"
742 if (nonnull(unspecified)) {
743 if (paramList_->get<
bool>(LeftPreconditionerIfUnspecified_name,
false))
744 lp->setLeftPrec(unspecified);
746 lp->setRightPrec(unspecified);
748 else if (nonnull(left)) {
749 lp->setLeftPrec(left);
751 else if (nonnull(right)) {
752 lp->setRightPrec(right);
756 TEUCHOS_TEST_FOR_EXCEPTION(
757 nonnull(left) && nonnull(right),std::logic_error
758 ,
"Error, we can not currently handle split preconditioners!"
763 set_extra_data<RCP<PreconditionerBase<Scalar> > >(myPrec,
"Belos::InternalPrec",
764 Teuchos::inOutArg(lp), Teuchos::POST_DESTROY,
false);
766 else if(prec.get()) {
767 set_extra_data<RCP<const PreconditionerBase<Scalar> > >(prec,
"Belos::ExternalPrec",
768 Teuchos::inOutArg(lp), Teuchos::POST_DESTROY,
false);
776 RCP<IterativeSolver_t> iterativeSolver = Teuchos::null;
777 RCP<Teuchos::ParameterList> solverPL = Teuchos::rcp(
new Teuchos::ParameterList() );
779 switch(solverType_) {
780 case SOLVER_TYPE_BLOCK_GMRES:
783 if(paramList_.get()) {
784 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
785 Teuchos::ParameterList &gmresPL = solverTypesPL.sublist(BlockGMRES_name);
786 solverPL = Teuchos::rcp( &gmresPL,
false );
789 if (oldIterSolver != Teuchos::null) {
790 iterativeSolver = oldIterSolver;
791 iterativeSolver->setProblem( lp );
792 iterativeSolver->setParameters( solverPL );
799 case SOLVER_TYPE_PSEUDO_BLOCK_GMRES:
802 if(paramList_.get()) {
803 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
804 Teuchos::ParameterList &pbgmresPL = solverTypesPL.sublist(PseudoBlockGMRES_name);
805 solverPL = Teuchos::rcp( &pbgmresPL,
false );
810 if (oldIterSolver != Teuchos::null) {
811 iterativeSolver = oldIterSolver;
812 iterativeSolver->setProblem( lp );
813 iterativeSolver->setParameters( solverPL );
820 case SOLVER_TYPE_BLOCK_CG:
823 if(paramList_.get()) {
824 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
825 Teuchos::ParameterList &cgPL = solverTypesPL.sublist(BlockCG_name);
826 solverPL = Teuchos::rcp( &cgPL,
false );
829 if (oldIterSolver != Teuchos::null) {
830 iterativeSolver = oldIterSolver;
831 iterativeSolver->setProblem( lp );
832 iterativeSolver->setParameters( solverPL );
839 case SOLVER_TYPE_PSEUDO_BLOCK_CG:
842 if(paramList_.get()) {
843 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
844 Teuchos::ParameterList &pbcgPL = solverTypesPL.sublist(PseudoBlockCG_name);
845 solverPL = Teuchos::rcp( &pbcgPL,
false );
850 if (oldIterSolver != Teuchos::null) {
851 iterativeSolver = oldIterSolver;
852 iterativeSolver->setProblem( lp );
853 iterativeSolver->setParameters( solverPL );
860 case SOLVER_TYPE_PSEUDO_BLOCK_STOCHASTIC_CG:
863 if(paramList_.get()) {
864 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
865 Teuchos::ParameterList &pbcgPL = solverTypesPL.sublist(PseudoBlockStochasticCG_name);
866 solverPL = Teuchos::rcp( &pbcgPL,
false );
871 if (oldIterSolver != Teuchos::null) {
872 iterativeSolver = oldIterSolver;
873 iterativeSolver->setProblem( lp );
874 iterativeSolver->setParameters( solverPL );
881 case SOLVER_TYPE_GCRODR:
884 if(paramList_.get()) {
885 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
886 Teuchos::ParameterList &gcrodrPL = solverTypesPL.sublist(GCRODR_name);
887 solverPL = Teuchos::rcp( &gcrodrPL,
false );
890 if (oldIterSolver != Teuchos::null) {
891 iterativeSolver = oldIterSolver;
892 iterativeSolver->setProblem( lp );
893 iterativeSolver->setParameters( solverPL );
900 case SOLVER_TYPE_RCG:
903 if(paramList_.get()) {
904 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
905 Teuchos::ParameterList &rcgPL = solverTypesPL.sublist(RCG_name);
906 solverPL = Teuchos::rcp( &rcgPL,
false );
909 if (oldIterSolver != Teuchos::null) {
910 iterativeSolver = oldIterSolver;
911 iterativeSolver->setProblem( lp );
912 iterativeSolver->setParameters( solverPL );
919 case SOLVER_TYPE_MINRES:
922 if(paramList_.get()) {
923 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
924 Teuchos::ParameterList &minresPL = solverTypesPL.sublist(MINRES_name);
925 solverPL = Teuchos::rcp( &minresPL,
false );
928 if (oldIterSolver != Teuchos::null) {
929 iterativeSolver = oldIterSolver;
930 iterativeSolver->setProblem( lp );
931 iterativeSolver->setParameters( solverPL );
938 case SOLVER_TYPE_TFQMR:
941 if(paramList_.get()) {
942 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
943 Teuchos::ParameterList &minresPL = solverTypesPL.sublist(TFQMR_name);
944 solverPL = Teuchos::rcp( &minresPL,
false );
947 if (oldIterSolver != Teuchos::null) {
948 iterativeSolver = oldIterSolver;
949 iterativeSolver->setProblem( lp );
950 iterativeSolver->setParameters( solverPL );
957 case SOLVER_TYPE_BICGSTAB:
960 if(paramList_.get()) {
961 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
962 Teuchos::ParameterList &bicgstabPL = solverTypesPL.sublist(BiCGStab_name);
963 solverPL = Teuchos::rcp( &bicgstabPL,
false );
966 if (oldIterSolver != Teuchos::null) {
967 iterativeSolver = oldIterSolver;
968 iterativeSolver->setProblem( lp );
969 iterativeSolver->setParameters( solverPL );
976 case SOLVER_TYPE_FIXEDPOINT:
979 if(paramList_.get()) {
980 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
981 Teuchos::ParameterList &fixedPointPL = solverTypesPL.sublist(FixedPoint_name);
982 solverPL = Teuchos::rcp( &fixedPointPL,
false );
985 if (oldIterSolver != Teuchos::null) {
986 iterativeSolver = oldIterSolver;
987 iterativeSolver->setProblem( lp );
988 iterativeSolver->setParameters( solverPL );
995 case SOLVER_TYPE_TPETRA_GMRES:
998 if(paramList_.get()) {
999 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1000 Teuchos::ParameterList &tpetraGmresPL = solverTypesPL.sublist(TpetraGmres_name);
1001 solverPL = Teuchos::rcp( &tpetraGmresPL,
false );
1004 iterativeSolver = rcp(
new Thyra::BelosTpetraGmres<Scalar,MV_t,LO_t>());
1006 iterativeSolver->setProblem( lp );
1007 iterativeSolver->setParameters( solverPL );
1010 case SOLVER_TYPE_TPETRA_GMRES_PIPELINE:
1013 if(paramList_.get()) {
1014 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1015 Teuchos::ParameterList &tpetraGmresPipelinePL = solverTypesPL.sublist(TpetraGmresPipeline_name);
1016 solverPL = Teuchos::rcp( &tpetraGmresPipelinePL,
false );
1019 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresPipeline<Scalar,MV_t,LO_t>());
1021 iterativeSolver->setProblem( lp );
1022 iterativeSolver->setParameters( solverPL );
1025 case SOLVER_TYPE_TPETRA_GMRES_SINGLE_REDUCE:
1028 if(paramList_.get()) {
1029 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1030 Teuchos::ParameterList &tpetraGmresSingleReducePL = solverTypesPL.sublist(TpetraGmresSingleReduce_name);
1031 solverPL = Teuchos::rcp( &tpetraGmresSingleReducePL,
false );
1034 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresSingleReduce<Scalar,MV_t,LO_t>());
1036 iterativeSolver->setProblem( lp );
1037 iterativeSolver->setParameters( solverPL );
1040 case SOLVER_TYPE_TPETRA_GMRES_SSTEP:
1043 if(paramList_.get()) {
1044 Teuchos::ParameterList &solverTypesPL = paramList_->sublist(SolverTypes_name);
1045 Teuchos::ParameterList &tpetraGmresSstepPL = solverTypesPL.sublist(TpetraGmresSstep_name);
1046 solverPL = Teuchos::rcp( &tpetraGmresSstepPL,
false );
1049 iterativeSolver = rcp(
new Thyra::BelosTpetraGmresSstep<Scalar,MV_t,LO_t>());
1051 iterativeSolver->setProblem( lp );
1052 iterativeSolver->setParameters( solverPL );
1058 TEUCHOS_TEST_FOR_EXCEPT(
true);
1066 belosOp->initialize(
1067 lp, solverPL, iterativeSolver,
1068 fwdOpSrc, prec, myPrec.get()==NULL, approxFwdOpSrc,
1069 supportSolveUse, convergenceTestFrequency_
1071 belosOp->setOStream(out);
1072 belosOp->setVerbLevel(verbLevel);
1074 if(paramList_.get()) {
1076 paramList_->validateParameters(*this->getValidParameters(),1);
1079 if(out.get() &&
static_cast<int>(verbLevel) >
static_cast<int>(Teuchos::VERB_LOW))
1080 *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()