00001 #ifndef BLOCKDIAGOPERATOR_H 00002 #define BLOCKDIAGOPERATOR_H 00003 00004 #include "Epetra_Operator.h" 00005 #include "Epetra_CrsMatrix.h" 00006 #include "Epetra_MultiVector.h" 00007 00008 00009 class BlockDiagOperator : public virtual Epetra_Operator { 00010 00011 public: 00012 00013 BlockDiagOperator::BlockDiagOperator(Epetra_CrsMatrix* A); 00014 00016 00017 ~BlockDiagOperator(); 00019 00021 00023 00032 int SetUseTranspose(bool UseTranspose); 00034 00036 00038 00046 int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const; 00047 00049 00060 int ApplyInverse(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const; 00061 00063 /* Returns the quantity \f$ \| A \|_\infty\f$ such that 00064 \f[\| A \|_\infty = \max_{1\lei\lem} \sum_{j=1}^n |a_{ij}| \f]. 00065 00066 \warning This method must not be called unless HasNormInf() returns true. 00067 */ 00068 double NormInf() const; 00070 00072 00074 const char * Label() const; 00075 00077 bool UseTranspose() const; 00078 00080 bool HasNormInf() const; 00081 00083 const Epetra_Comm & Comm() const; 00084 00086 const Epetra_Map & OperatorDomainMap() const; 00087 00089 const Epetra_Map & OperatorRangeMap() const; 00091 00092 00093 protected: 00094 00095 Epetra_CrsMatrix* A; 00096 int _NumMyRows; 00097 int* _diag; 00098 double* _temp; 00099 bool _useTranspose; 00100 00101 }; 00102 00103 #endif /* BLOCKDIAGOPERATOR_H */