Ifpack_SingletonFilter.h

00001 #ifndef IFPACK_SINGLETONFILTER_H
00002 #define IFPACK_SINGLETONFILTER_H
00003 
00004 #include "Ifpack_ConfigDefs.h"
00005 #include "Epetra_RowMatrix.h"
00006 class Epetra_Comm;
00007 class Epetra_Map;
00008 class Epetra_MultiVector;
00009 class Epetra_Import;
00010 class Epetra_BlockMap;
00011 
00013 //
00014 class Ifpack_SingletonFilter : public virtual Epetra_RowMatrix {
00015 
00016 public:
00018   Ifpack_SingletonFilter(Epetra_RowMatrix* Matrix);
00019 
00021   virtual ~Ifpack_SingletonFilter();
00022 
00024   virtual inline int NumMyRowEntries(int MyRow, int & NumEntries) const
00025   {
00026     return(NumEntries_[MyRow]);
00027   }
00028 
00030   virtual int MaxNumEntries() const
00031   {
00032     return(MaxNumEntries_);
00033   }
00034 
00035   virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00036 
00037   virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00038 
00039   virtual int Multiply(bool TransA, const Epetra_MultiVector& X, 
00040                Epetra_MultiVector& Y) const;
00041 
00042   virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, 
00043             const Epetra_MultiVector& X,
00044             Epetra_MultiVector& Y) const;
00045 
00046   virtual int Apply(const Epetra_MultiVector& X,
00047             Epetra_MultiVector& Y) const;
00048 
00049   virtual int ApplyInverse(const Epetra_MultiVector& X,
00050                Epetra_MultiVector& Y) const;
00051 
00052   virtual int InvRowSums(Epetra_Vector& x) const
00053   {
00054     return(-98); // NOT IMPLEMENTED
00055   }
00056 
00057   virtual int LeftScale(const Epetra_Vector& x)
00058   {
00059     return(-98); // NOT IMPLEMENTED
00060   }
00061 
00062   virtual int InvColSums(Epetra_Vector& x) const
00063   {
00064     return(-98); // NOT IMPLEMENTED
00065   }
00066 
00067   virtual int RightScale(const Epetra_Vector& x) 
00068   {
00069     return(-98); // NOT IMPLEMENTED
00070   }
00071 
00072   virtual bool Filled() const
00073   {
00074     return(A_.Filled());
00075   }
00076 
00077   virtual double NormInf() const
00078   {
00079     return(-1.0);
00080   }
00081 
00082   virtual double NormOne() const
00083   {
00084     return(-1.0);
00085   }
00086 
00087   virtual int NumGlobalNonzeros() const
00088   {
00089     return(NumNonzeros_);
00090   }
00091 
00092   virtual int NumGlobalRows() const
00093   {
00094     return(NumRows_);
00095   }
00096 
00097   virtual int NumGlobalCols() const
00098   {
00099     return(NumRows_);
00100   }
00101 
00102   virtual int NumGlobalDiagonals() const
00103   {
00104     return(NumRows_);
00105   }
00106 
00107   virtual int NumMyNonzeros() const
00108   {
00109     return(NumNonzeros_);
00110   }
00111 
00112   virtual int NumMyRows() const
00113   {
00114     return(NumRows_);
00115   }
00116 
00117   virtual int NumMyCols() const
00118   {
00119     return(NumRows_);
00120   }
00121 
00122   virtual int NumMyDiagonals() const
00123   {
00124     return(NumRows_);
00125   }
00126 
00127   virtual bool LowerTriangular() const
00128   {
00129     return(false);
00130   }
00131 
00132   virtual bool UpperTriangular() const
00133   {
00134     return(false);
00135   }
00136 
00137   virtual const Epetra_Map & RowMatrixRowMap() const
00138   {
00139     return(*Map_);
00140   }
00141 
00142   virtual const Epetra_Map & RowMatrixColMap() const
00143   {
00144     return(*Map_);
00145   }
00146 
00147   virtual const Epetra_Import * RowMatrixImporter() const
00148   {
00149     return(A_.RowMatrixImporter());
00150   }
00151 
00152   int SetUseTranspose(bool UseTranspose)
00153   {
00154     return(A_.SetUseTranspose(UseTranspose));
00155   }
00156 
00157   bool UseTranspose() const 
00158   {
00159     return(A_.UseTranspose());
00160   }
00161 
00162   bool HasNormInf() const
00163   {
00164     return(false);
00165   }
00166 
00167   const Epetra_Comm & Comm() const
00168   {
00169     return(A_.Comm());
00170   }
00171 
00172   const Epetra_Map & OperatorDomainMap() const 
00173   {
00174     return(*Map_);
00175   }
00176 
00177   const Epetra_Map & OperatorRangeMap() const 
00178   {
00179     return(*Map_);
00180   }
00181 
00182   const Epetra_BlockMap& Map() const 
00183   {
00184     return(*(const Epetra_BlockMap*)Map_);
00185   }
00186 
00187   const char* Label() const{
00188     return(Label_);
00189   }
00190 
00191   int SolveSingletons(const Epetra_MultiVector& RHS, 
00192               Epetra_MultiVector& LHS);
00193 
00194   int CreateReducedRHS(const Epetra_MultiVector& LHS,
00195                const Epetra_MultiVector& RHS, 
00196                Epetra_MultiVector& ReducedRHS);
00197 
00198   int UpdateLHS(const Epetra_MultiVector& ReducedLHS,
00199         Epetra_MultiVector& LHS);
00200 
00201 private:
00202 
00204   Epetra_RowMatrix& A_;
00205 
00207   mutable vector<int> Indices_;
00209   mutable vector<double> Values_;
00211   char Label_[80];
00212   
00213   int NumSingletons_;
00214   vector<int> SingletonIndex_;
00215 
00216   vector<int> Reorder_;
00217   vector<int> InvReorder_;
00218 
00219   vector<int> NumEntries_;
00220 
00221   int NumRows_;
00222   int NumRowsA_;
00223   int MaxNumEntries_;
00224   int MaxNumEntriesA_;
00225   int NumNonzeros_;
00226   Epetra_Map* Map_;
00227   
00228   Epetra_Vector* Diagonal_;
00229 
00230 };
00231 
00232 #endif /* IFPACK_SINGLETONFILTER_H */

Generated on Thu Sep 18 12:37:08 2008 for IFPACK by doxygen 1.3.9.1