00001
00002 #ifndef THYRA_BELOS_LINEAR_OP_WITH_SOLVE_DECL_HPP
00003 #define THYRA_BELOS_LINEAR_OP_WITH_SOLVE_DECL_HPP
00004
00005 #include "Thyra_SingleRhsLinearOpWithSolveBase.hpp"
00006 #include "BelosSolverManager.hpp"
00007 #include "Teuchos_StandardMemberCompositionMacros.hpp"
00008
00009 namespace Thyra {
00010
00018 template<class Scalar>
00019 class BelosLinearOpWithSolve
00020 : virtual public LinearOpWithSolveBase<Scalar>
00021 , virtual protected SingleScalarLinearOpWithSolveBase<Scalar>
00022 {
00023 public:
00024
00027
00029 typedef MultiVectorBase<Scalar> MV_t;
00031 typedef LinearOpBase<Scalar> LO_t;
00032
00034
00037
00039 BelosLinearOpWithSolve();
00040
00042 BelosLinearOpWithSolve(
00043 const Teuchos::RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > &lp
00044 ,const Teuchos::RCP<Teuchos::ParameterList> &solverPL
00045 ,const Teuchos::RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > &iterativeSolver
00046 ,const Teuchos::RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00047 ,const Teuchos::RCP<const PreconditionerBase<Scalar> > &prec
00048 ,const bool isExternalPrec
00049 ,const Teuchos::RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00050 ,const ESupportSolveUse &supportSolveUse
00051 );
00052
00086 void initialize(
00087 const Teuchos::RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > &lp
00088 ,const Teuchos::RCP<Teuchos::ParameterList> &solverPL
00089 ,const Teuchos::RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > &iterativeSolver
00090 ,const Teuchos::RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00091 ,const Teuchos::RCP<const PreconditionerBase<Scalar> > &prec
00092 ,const bool isExternalPrec
00093 ,const Teuchos::RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00094 ,const ESupportSolveUse &supportSolveUse
00095 );
00096
00098 Teuchos::RCP<const LinearOpSourceBase<Scalar> > extract_fwdOpSrc();
00099
00101 Teuchos::RCP<const PreconditionerBase<Scalar> > extract_prec();
00102
00104 bool isExternalPrec() const;
00105
00107 Teuchos::RCP<const LinearOpSourceBase<Scalar> > extract_approxFwdOpSrc();
00108
00110 ESupportSolveUse supportSolveUse() const;
00111
00116 void uninitialize(
00117 Teuchos::RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > *lp = NULL
00118 ,Teuchos::RCP<Teuchos::ParameterList> *solverPL = NULL
00119 ,Teuchos::RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > *iterativeSolver = NULL
00120 ,Teuchos::RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL
00121 ,Teuchos::RCP<const PreconditionerBase<Scalar> > *prec = NULL
00122 ,bool *isExternalPrec = NULL
00123 ,Teuchos::RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc = NULL
00124 ,ESupportSolveUse *supportSolveUse = NULL
00125 );
00126
00128
00132 Teuchos::RCP< const VectorSpaceBase<Scalar> > range() const;
00134 Teuchos::RCP< const VectorSpaceBase<Scalar> > domain() const;
00136 Teuchos::RCP<const LinearOpBase<Scalar> > clone() const;
00138
00142 std::string description() const;
00144 void describe(
00145 Teuchos::FancyOStream &out
00146 ,const Teuchos::EVerbosityLevel verbLevel
00147 ) const;
00149
00152
00154 void setParameterList(Teuchos::RCP<Teuchos::ParameterList> const& paramList);
00156 Teuchos::RCP<Teuchos::ParameterList> getParameterList();
00158 Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
00160 Teuchos::RCP<const Teuchos::ParameterList> getParameterList() const;
00162 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
00163
00165
00166 protected:
00167
00171 bool opSupported(ETransp M_trans) const;
00173 void apply(
00174 const ETransp M_trans
00175 ,const MultiVectorBase<Scalar> &X
00176 ,MultiVectorBase<Scalar> *Y
00177 ,const Scalar alpha
00178 ,const Scalar beta
00179 ) const;
00181
00185 bool solveSupportsTrans(ETransp M_trans) const;
00187 bool solveSupportsSolveMeasureType(ETransp M_trans, const SolveMeasureType& solveMeasureType) const;
00189 void solve(
00190 const ETransp M_trans
00191 ,const MultiVectorBase<Scalar> &B
00192 ,MultiVectorBase<Scalar> *X
00193 ,const int numBlocks
00194 ,const BlockSolveCriteria<Scalar> blockSolveCriteria[]
00195 ,SolveStatus<Scalar> blockSolveStatus[]
00196 ) const;
00198
00199 private:
00200
00201
00202
00203
00204
00205 Teuchos::RCP<Belos::LinearProblem<Scalar,MV_t,LO_t> > lp_;
00206 Teuchos::RCP<Teuchos::ParameterList> solverPL_;
00207 Teuchos::RCP<Belos::SolverManager<Scalar,MV_t,LO_t> > iterativeSolver_;
00208
00209 Teuchos::RCP<const LinearOpSourceBase<Scalar> > fwdOpSrc_;
00210 Teuchos::RCP<const PreconditionerBase<Scalar> > prec_;
00211 bool isExternalPrec_;
00212 Teuchos::RCP<const LinearOpSourceBase<Scalar> > approxFwdOpSrc_;
00213 ESupportSolveUse supportSolveUse_;
00214
00215 typename Teuchos::ScalarTraits<Scalar>::magnitudeType defaultTol_;
00216
00217 void assertInitialized() const;
00218
00219 };
00220
00221 }
00222
00223 #endif // THYRA_BELOS_LINEAR_OP_WITH_SOLVE_DECL_HPP