00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef IFPACK_AMESOS_H
00031 #define IFPACK_AMESOS_H
00032
00033 #include "Ifpack_ConfigDefs.h"
00034 #include "Ifpack_Preconditioner.h"
00035 #include "Epetra_Operator.h"
00036 #include "Teuchos_ParameterList.hpp"
00037 #include "Teuchos_RefCountPtr.hpp"
00038
00039 class Epetra_Map;
00040 class Epetra_Time;
00041 class Epetra_Comm;
00042 class Amesos_BaseSolver;
00043 class Epetra_LinearProblem;
00044 class Epetra_RowMatrix;
00045
00047
00068 class Ifpack_Amesos : public Ifpack_Preconditioner {
00069
00070 public:
00071
00073
00075 Ifpack_Amesos(Epetra_RowMatrix* Matrix);
00076
00078 Ifpack_Amesos(const Ifpack_Amesos& rhs);
00079
00081 Ifpack_Amesos& operator=(const Ifpack_Amesos& rhs);
00082
00084
00085 virtual ~Ifpack_Amesos() {};
00086
00088
00090
00092
00102 virtual int SetUseTranspose(bool UseTranspose_in);
00104
00106
00108
00116 virtual int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00117
00119
00130 virtual int ApplyInverse(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00131
00133 virtual double NormInf() const;
00135
00137
00139 virtual const char * Label() const;
00140
00142 virtual bool UseTranspose() const;
00143
00145 virtual bool HasNormInf() const;
00146
00148 virtual const Epetra_Comm & Comm() const;
00149
00151 virtual const Epetra_Map & OperatorDomainMap() const;
00152
00154 virtual const Epetra_Map & OperatorRangeMap() const;
00155
00157
00159
00161 virtual bool IsInitialized() const
00162 {
00163 return(IsInitialized_);
00164 }
00165
00167
00170 virtual int Initialize();
00171
00173 virtual bool IsComputed() const
00174 {
00175 return(IsComputed_);
00176 }
00177
00179
00182 virtual int Compute();
00183
00185
00192 virtual int SetParameters(Teuchos::ParameterList& List);
00193
00195
00197
00199 virtual const Epetra_RowMatrix& Matrix() const
00200 {
00201 return(*Matrix_);
00202 }
00203
00205 virtual double Condest(const Ifpack_CondestType CT = Ifpack_Cheap,
00206 const int MaxIters = 1550,
00207 const double Tol = 1e-9,
00208 Epetra_RowMatrix* Matrix_in= 0);
00209
00211 virtual double Condest() const
00212 {
00213 return(Condest_);
00214 }
00215
00217 virtual int NumInitialize() const
00218 {
00219 return(NumInitialize_);
00220 }
00221
00223 virtual int NumCompute() const
00224 {
00225 return(NumCompute_);
00226 }
00227
00229 virtual int NumApplyInverse() const
00230 {
00231 return(NumApplyInverse_);
00232 }
00233
00235 virtual double InitializeTime() const
00236 {
00237 return(InitializeTime_);
00238 }
00239
00241 virtual double ComputeTime() const
00242 {
00243 return(ComputeTime_);
00244 }
00245
00247 virtual double ApplyInverseTime() const
00248 {
00249 return(ApplyInverseTime_);
00250 }
00251
00253 virtual double InitializeFlops() const
00254 {
00255 return(0.0);
00256 }
00257
00259 virtual double ComputeFlops() const
00260 {
00261 return(ComputeFlops_);
00262 }
00263
00265 virtual double ApplyInverseFlops() const
00266 {
00267 return(ApplyInverseFlops_);
00268 }
00269
00270
00271 virtual const Teuchos::ParameterList& List() const
00272 {
00273 return(List_);
00274 }
00275
00277 virtual std::ostream& Print(std::ostream& os) const;
00278
00280
00281 protected:
00282
00284
00286 inline void SetLabel(const char* Label_in)
00287 {
00288 Label_ = Label_in;
00289 }
00290
00292 inline void SetIsInitialized(const bool IsInitialized_in)
00293 {
00294 IsInitialized_ = IsInitialized_in;
00295 }
00296
00298 inline void SetIsComputed(const int IsComputed_in)
00299 {
00300 IsComputed_ = IsComputed_in;
00301 }
00302
00304 inline void SetNumInitialize(const int NumInitialize_in)
00305 {
00306 NumInitialize_ = NumInitialize_in;
00307 }
00308
00310 inline void SetNumCompute(const int NumCompute_in)
00311 {
00312 NumCompute_ = NumCompute_in;
00313 }
00314
00316 inline void SetNumApplyInverse(const int NumApplyInverse_in)
00317 {
00318 NumApplyInverse_ = NumApplyInverse_in;
00319 }
00320
00322 inline void SetInitializeTime(const double InitializeTime_in)
00323 {
00324 InitializeTime_ = InitializeTime_in;
00325 }
00326
00328 inline void SetComputeTime(const double ComputeTime_in)
00329 {
00330 ComputeTime_ = ComputeTime_in;
00331 }
00332
00334 inline void SetApplyInverseTime(const double ApplyInverseTime_in)
00335 {
00336 ApplyInverseTime_ = ApplyInverseTime_in;
00337 }
00338
00340 inline void SetComputeFlops(const double ComputeFlops_in)
00341 {
00342 ComputeFlops_ = ComputeFlops_in;
00343 }
00344
00346 inline void SetApplyInverseFlops(const double ApplyInverseFlops_in)
00347 {
00348 ApplyInverseFlops_ = ApplyInverseFlops_in;
00349 }
00350
00352 inline void SetList(const Teuchos::ParameterList& List_in)
00353 {
00354 List_ = List_in;
00355 }
00357
00358 private:
00359
00361 Teuchos::RefCountPtr<const Epetra_RowMatrix> Matrix_;
00362
00364 Teuchos::RefCountPtr<Epetra_LinearProblem> Problem_;
00366 Teuchos::RefCountPtr<Amesos_BaseSolver> Solver_;
00368 Teuchos::ParameterList List_;
00369
00371 string Label_;
00373 bool IsInitialized_;
00375 bool IsComputed_;
00377 bool UseTranspose_;
00378
00380 int NumInitialize_;
00382 int NumCompute_;
00384 mutable int NumApplyInverse_;
00385
00387 double InitializeTime_;
00389 double ComputeTime_;
00391 mutable double ApplyInverseTime_;
00393 Teuchos::RefCountPtr<Epetra_Time> Time_;
00394
00396 double ComputeFlops_;
00398 double ApplyInverseFlops_;
00399
00401 double Condest_;
00402 };
00403
00404 #endif // IFPACK_AMESOS_H