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 "BelosIterativeSolver.hpp"
00007 #include "BelosStatusTestResNorm.hpp"
00008 #include "BelosOutputManager.hpp"
00009 #include "Teuchos_StandardMemberCompositionMacros.hpp"
00010
00011 namespace Thyra {
00012
00020 template<class Scalar>
00021 class BelosLinearOpWithSolve
00022 : virtual public LinearOpWithSolveBase<Scalar>
00023 , virtual protected SingleScalarLinearOpWithSolveBase<Scalar>
00024 {
00025 public:
00026
00029
00031 typedef MultiVectorBase<Scalar> MV_t;
00033 typedef LinearOpBase<Scalar> LO_t;
00034
00036
00039
00041 BelosLinearOpWithSolve();
00042
00044 BelosLinearOpWithSolve(
00045 const Teuchos::RefCountPtr<Belos::LinearProblem<Scalar,MV_t,LO_t> > &lp
00046 ,const bool adjustableBlockSize
00047 ,const int maxNumberOfKrylovVectors
00048 ,const Teuchos::RefCountPtr<Teuchos::ParameterList> &gmresPL
00049 ,const Teuchos::RefCountPtr<Belos::StatusTestResNorm<Scalar,MV_t,LO_t> > &resNormST
00050 ,const Teuchos::RefCountPtr<Belos::IterativeSolver<Scalar,MV_t,LO_t> > &iterativeSolver
00051 ,const Teuchos::RefCountPtr<Belos::OutputManager<Scalar> > &outputManager
00052 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00053 ,const Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > &prec
00054 ,const bool isExternalPrec
00055 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00056 ,const ESupportSolveUse &supportSolveUse
00057 );
00058
00105 void initialize(
00106 const Teuchos::RefCountPtr<Belos::LinearProblem<Scalar,MV_t,LO_t> > &lp
00107 ,const bool adjustableBlockSize
00108 ,const int maxNumberOfKrylovVectors
00109 ,const Teuchos::RefCountPtr<Teuchos::ParameterList> &gmresPL
00110 ,const Teuchos::RefCountPtr<Belos::StatusTestResNorm<Scalar,MV_t,LO_t> > &resNormST
00111 ,const Teuchos::RefCountPtr<Belos::IterativeSolver<Scalar,MV_t,LO_t> > &iterativeSolver
00112 ,const Teuchos::RefCountPtr<Belos::OutputManager<Scalar> > &outputManager
00113 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00114 ,const Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > &prec
00115 ,const bool isExternalPrec
00116 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00117 ,const ESupportSolveUse &supportSolveUse
00118 );
00119
00121 Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > extract_fwdOpSrc();
00122
00124 Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > extract_prec();
00125
00127 bool isExternalPrec() const;
00128
00130 Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > extract_approxFwdOpSrc();
00131
00133 ESupportSolveUse supportSolveUse() const;
00134
00139 void uninitialize(
00140 Teuchos::RefCountPtr<Belos::LinearProblem<Scalar,MV_t,LO_t> > *lp = NULL
00141 ,bool *adjustableBlockSize = NULL
00142 ,int *maxNumberOfKrylovVectors = NULL
00143 ,Teuchos::RefCountPtr<Teuchos::ParameterList> *gmresPL = NULL
00144 ,Teuchos::RefCountPtr<Belos::StatusTestResNorm<Scalar,MV_t,LO_t> > *resNormST = NULL
00145 ,Teuchos::RefCountPtr<Belos::IterativeSolver<Scalar,MV_t,LO_t> > *iterativeSolver = NULL
00146 ,Teuchos::RefCountPtr<Belos::OutputManager<Scalar> > *outputManager = NULL
00147 ,Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL
00148 ,Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > *prec = NULL
00149 ,bool *isExternalPrec = NULL
00150 ,Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc = NULL
00151 ,ESupportSolveUse *supportSolveUse = NULL
00152 );
00153
00155
00159 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> > range() const;
00161 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> > domain() const;
00163 Teuchos::RefCountPtr<const LinearOpBase<Scalar> > clone() const;
00165
00169 std::string description() const;
00171 void describe(
00172 Teuchos::FancyOStream &out
00173 ,const Teuchos::EVerbosityLevel verbLevel
00174 ) const;
00176
00179
00181 void setParameterList(Teuchos::RefCountPtr<Teuchos::ParameterList> const& paramList);
00183 Teuchos::RefCountPtr<Teuchos::ParameterList> getParameterList();
00185 Teuchos::RefCountPtr<Teuchos::ParameterList> unsetParameterList();
00187 Teuchos::RefCountPtr<const Teuchos::ParameterList> getParameterList() const;
00189 Teuchos::RefCountPtr<const Teuchos::ParameterList> getValidParameters() const;
00190
00192
00193 protected:
00194
00198 bool opSupported(ETransp M_trans) const;
00200 void apply(
00201 const ETransp M_trans
00202 ,const MultiVectorBase<Scalar> &X
00203 ,MultiVectorBase<Scalar> *Y
00204 ,const Scalar alpha
00205 ,const Scalar beta
00206 ) const;
00208
00212 bool solveSupportsTrans(ETransp M_trans) const;
00214 bool solveSupportsSolveMeasureType(ETransp M_trans, const SolveMeasureType& solveMeasureType) const;
00216 void solve(
00217 const ETransp M_trans
00218 ,const MultiVectorBase<Scalar> &B
00219 ,MultiVectorBase<Scalar> *X
00220 ,const int numBlocks
00221 ,const BlockSolveCriteria<Scalar> blockSolveCriteria[]
00222 ,SolveStatus<Scalar> blockSolveStatus[]
00223 ) const;
00225
00226 private:
00227
00228
00229
00230
00231 typedef Belos::StatusTestResNorm<Scalar,MV_t,LO_t> StatusTestResNorm_t;
00232
00233 Teuchos::RefCountPtr<Belos::LinearProblem<Scalar,MV_t,LO_t> > lp_;
00234 bool adjustableBlockSize_;
00235 int maxNumberOfKrylovVectors_;
00236 Teuchos::RefCountPtr<Teuchos::ParameterList> gmresPL_;
00237 Teuchos::RefCountPtr<StatusTestResNorm_t> resNormST_;
00238 Teuchos::RefCountPtr<Belos::IterativeSolver<Scalar,MV_t,LO_t> > iterativeSolver_;
00239 Teuchos::RefCountPtr<Belos::OutputManager<Scalar> > outputManager_;
00240
00241 Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > fwdOpSrc_;
00242 Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > prec_;
00243 bool isExternalPrec_;
00244 Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > approxFwdOpSrc_;
00245 ESupportSolveUse supportSolveUse_;
00246
00247 typename Teuchos::ScalarTraits<Scalar>::magnitudeType defaultTol_;
00248
00249 void assertInitialized() const;
00250
00251 };
00252
00253 }
00254
00255 #endif // THYRA_BELOS_LINEAR_OP_WITH_SOLVE_DECL_HPP