Anasazi  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
BlockPCGSolver.h
1 // @HEADER
2 // *****************************************************************************
3 // Anasazi: Block Eigensolvers Package
4 //
5 // Copyright 2004 NTESS and the Anasazi contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 // This software is a result of the research described in the report
11 //
12 // "A comparison of algorithms for modal analysis in the absence
13 // of a sparse direct method", P. Arbenz, R. Lehoucq, and U. Hetmaniuk,
14 // Sandia National Laboratories, Technical report SAND2003-1028J.
15 //
16 // It is based on the Epetra, AztecOO, and ML packages defined in the Trilinos
17 // framework ( http://trilinos.org/ ).
18 
19 #ifndef BLOCK_PCG_SOLVER_H
20 #define BLOCK_PCG_SOLVER_H
21 
22 #include "Epetra_ConfigDefs.h"
23 
24 #include "AztecOO.h"
25 
26 #include "Epetra_BLAS.h"
27 #include "Epetra_Comm.h"
28 #include "Epetra_LAPACK.h"
29 #include "Epetra_Map.h"
30 #include "Epetra_MultiVector.h"
31 #include "Epetra_Operator.h"
32 #include "Epetra_RowMatrix.h"
33 
34 #include "FortranRoutines.h"
35 
36 
37 class BlockPCGSolver : public virtual Epetra_Operator {
38 
39  private:
40 
41  const Epetra_Comm &MyComm;
42  const Epetra_BLAS callBLAS;
43  const Epetra_LAPACK callLAPACK;
44  const FortranRoutines callFortran;
45 
46  const Epetra_Operator *K;
47  Epetra_Operator *Prec;
48 
49  mutable AztecOO *vectorPCG;
50 
51  double tolCG;
52  int iterMax;
53 
54  int verbose;
55 
56  mutable double *workSpace;
57  mutable int lWorkSpace;
58 
59  mutable int numSolve;
60  mutable int maxIter;
61  mutable int sumIter;
62  mutable int minIter;
63 
64  // Don't define these functions
65  BlockPCGSolver(const BlockPCGSolver &ref);
66  BlockPCGSolver& operator=(const BlockPCGSolver &ref);
67 
68  public:
69 
70  BlockPCGSolver(const Epetra_Comm& _Com, const Epetra_Operator *KK,
71  double _tol = 0.0, int _iMax = 0, int _verb = 0);
72 
73  BlockPCGSolver(const Epetra_Comm& _Com, const Epetra_Operator *KK,
74  Epetra_Operator *PP,
75  double _tol = 0.0, int _iMax = 0, int _verb = 0);
76 
77  ~BlockPCGSolver();
78 
79  char * Label() const { return "Epetra_Operator for Block PCG solver"; };
80 
81  bool UseTranspose() const { return (false); };
82  int SetUseTranspose(bool UseTranspose_in) { return 0; };
83 
84  bool HasNormInf() const { return (false); };
85  double NormInf() const { return (-1.0); };
86 
87  int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
88  int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
89 
90  const Epetra_Comm& Comm() const { return MyComm; };
91 
92  const Epetra_Map& OperatorDomainMap() const { return K->OperatorDomainMap(); };
93  const Epetra_Map& OperatorRangeMap() const { return K->OperatorRangeMap(); };
94 
95  int Solve(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const;
96  int Solve(const Epetra_MultiVector &X, Epetra_MultiVector &Y, int blkSize) const;
97 
98  const Epetra_Operator* getPreconditioner() const { return Prec; };
99  void setPreconditioner(Epetra_Operator *PP);
100 
101  void setIterMax(int _iMax) { iterMax = (_iMax > 0) ? _iMax : 0; };
102 
103  int getMaxIter() const { return maxIter; };
104  double getAvgIter() const { return sumIter/((double) numSolve); };
105  int getMinIter() const { return minIter; };
106 
107 };
108 
109 #endif
virtual int SetUseTranspose(bool UseTranspose)=0
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const =0
virtual const Epetra_Map & OperatorDomainMap() const =0
virtual const char * Label() const =0
virtual int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const =0
virtual const Epetra_Map & OperatorRangeMap() const =0
virtual const Epetra_Comm & Comm() const =0
virtual bool UseTranspose() const =0
virtual bool HasNormInf() const =0
virtual double NormInf() const =0