00001
00002 #ifndef THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_DECL_HPP
00003 #define THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_DECL_HPP
00004
00005 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
00006 #include "Teuchos_StandardMemberCompositionMacros.hpp"
00007 #include "Teuchos_StandardCompositionMacros.hpp"
00008
00009 namespace Teuchos { class ParameterList; }
00010
00011 namespace Thyra {
00012
00020 template<class Scalar>
00021 class BelosLinearOpWithSolveFactory : public LinearOpWithSolveFactoryBase<Scalar> {
00022 public:
00023
00028 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType MagnitudeType;
00029
00031
00034
00036 static const std::string SolverType_name;
00038 static const std::string SolverType_default;
00040 static const std::string MaxIters_name;
00042 static const int MaxIters_default;
00044 static const std::string MaxRestarts_name;
00046 static const int MaxRestarts_default;
00048 static const std::string BlockSize_name;
00050 static const int BlockSize_default;
00052 static const std::string AdjustableBlockSize_name;
00054 static const bool AdjustableBlockSize_default;
00056 static const std::string DefaultRelResNorm_name;
00058 static const MagnitudeType DefaultRelResNorm_default;
00060 static const std::string GMRES_name;
00062 static const std::string GMRES_MaxNumberOfKrylovVectors_name;
00064 static const int GMRES_MaxNumberOfKrylovVectors_default;
00066 static const std::string GMRES_Variant_name;
00068 static const std::string GMRES_Variant_default;
00070 static const std::string Outputter_name;
00072 static const std::string Outputter_OutputFrequency_name;
00074 static const int Outputter_OutputFrequency_default;
00076 static const std::string Outputter_OutputMaxResOnly_name;
00078 static const bool Outputter_OutputMaxResOnly_default;
00079
00081
00084
00086 BelosLinearOpWithSolveFactory();
00087
00089 BelosLinearOpWithSolveFactory(
00090 const Teuchos::RefCountPtr<PreconditionerFactoryBase<Scalar> > &precFactory
00091 );
00092
00094
00098 bool acceptsPreconditionerFactory() const;
00100 void setPreconditionerFactory(
00101 const Teuchos::RefCountPtr<PreconditionerFactoryBase<Scalar> > &precFactory
00102 ,const std::string &precFactoryName
00103 );
00105 Teuchos::RefCountPtr<PreconditionerFactoryBase<Scalar> > getPreconditionerFactory() const;
00107 void unsetPreconditionerFactory(
00108 Teuchos::RefCountPtr<PreconditionerFactoryBase<Scalar> > *precFactory
00109 ,std::string *precFactoryName
00110 );
00112 bool isCompatible( const LinearOpSourceBase<Scalar> &fwdOpSrc ) const;
00114 Teuchos::RefCountPtr<LinearOpWithSolveBase<Scalar> > createOp() const;
00116 void initializeOp(
00117 const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00118 ,LinearOpWithSolveBase<Scalar> *Op
00119 ,const ESupportSolveUse supportSolveUse
00120 ) const;
00122 void initializeAndReuseOp(
00123 const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00124 ,LinearOpWithSolveBase<Scalar> *Op
00125 ) const;
00127 void uninitializeOp(
00128 LinearOpWithSolveBase<Scalar> *Op
00129 ,Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > *fwdOpSrc
00130 ,Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > *prec
00131 ,Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc
00132 ,ESupportSolveUse *supportSolveUse
00133 ) const;
00135 bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const;
00137 void initializePreconditionedOp(
00138 const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00139 ,const Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > &prec
00140 ,LinearOpWithSolveBase<Scalar> *Op
00141 ,const ESupportSolveUse supportSolveUse
00142 ) const;
00144 void initializeApproxPreconditionedOp(
00145 const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00146 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00147 ,LinearOpWithSolveBase<Scalar> *Op
00148 ,const ESupportSolveUse supportSolveUse
00149 ) const;
00151
00154
00156 void setParameterList(Teuchos::RefCountPtr<Teuchos::ParameterList> const& paramList);
00158 Teuchos::RefCountPtr<Teuchos::ParameterList> getParameterList();
00160 Teuchos::RefCountPtr<Teuchos::ParameterList> unsetParameterList();
00162 Teuchos::RefCountPtr<const Teuchos::ParameterList> getParameterList() const;
00164 Teuchos::RefCountPtr<const Teuchos::ParameterList> getValidParameters() const;
00165
00167
00170
00172 std::string description() const;
00173
00175
00176 private:
00177
00178
00179
00180
00181 Teuchos::RefCountPtr<PreconditionerFactoryBase<Scalar> > precFactory_;
00182 std::string precFactoryName_;
00183 Teuchos::RefCountPtr<Teuchos::ParameterList> thisValidParamList_;
00184 Teuchos::RefCountPtr<Teuchos::ParameterList> paramList_;
00185 bool useGmres_;
00186
00187
00188
00189
00190 static Teuchos::RefCountPtr<const Teuchos::ParameterList> generateAndGetValidParameters();
00191
00192 void updateThisValidParamList();
00193
00194 void initializeOpImpl(
00195 const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &fwdOpSrc
00196 ,const Teuchos::RefCountPtr<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc
00197 ,const Teuchos::RefCountPtr<const PreconditionerBase<Scalar> > &prec
00198 ,const bool reusePrec
00199 ,LinearOpWithSolveBase<Scalar> *Op
00200 ,const ESupportSolveUse supportSolveUse
00201 ) const;
00202
00203 };
00204
00206
00207 }
00208
00209 #endif // THYRA_BELOS_LINEAR_OP_WITH_SOLVE_FACTORY_DECL_HPP