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_NODEFILTER_H
00031 #define IFPACK_NODEFILTER_H
00032
00033 #ifdef IFPACK_NODE_AWARE_CODE
00034
00035 #include "Ifpack_ConfigDefs.h"
00036 #ifdef HAVE_MPI
00037 #include "Epetra_MpiComm.h"
00038 #else
00039 #include "Epetra_SerialComm.h"
00040 #endif
00041 #include "Epetra_RowMatrix.h"
00042 #include "Epetra_CrsMatrix.h"
00043 #include "Epetra_IntVector.h"
00044 #include "Teuchos_RCP.hpp"
00045 #include "Ifpack_OverlappingRowMatrix.h"
00046 class Epetra_Map;
00047 class Epetra_MultiVector;
00048 class Epetra_Vector;
00049 class Epetra_Import;
00050 class Epetra_BlockMap;
00051
00053
00087 class Ifpack_NodeFilter : public virtual Epetra_RowMatrix {
00088
00089 public:
00091
00092 Ifpack_NodeFilter(const Teuchos::RCP<const Epetra_RowMatrix>& Matrix, int nodeID);
00093
00094
00096
00097
00098 ~Ifpack_NodeFilter(){
00099 if(Ac_LIDMap_) delete [] Ac_LIDMap_;
00100 if(Bc_LIDMap_) delete [] Bc_LIDMap_;
00101 if(Ar_LIDMap_) delete [] Ar_LIDMap_;
00102 if(Br_LIDMap_) delete [] Br_LIDMap_;
00103 if(tempX_) delete [] tempX_;
00104 if(tempY_) delete [] tempY_;
00105 if(ImportVector_) delete ImportVector_;
00106
00107 };
00109
00111
00113
00121 virtual int NumMyRowEntries(int MyRow, int & NumEntries) const
00122 {
00123 NumEntries = NumEntries_[MyRow];
00124 return(0);
00125 }
00126
00128 virtual int MaxNumEntries() const
00129 {
00130 return(MaxNumEntries_);
00131 }
00132
00134
00148 virtual inline int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00149
00151
00157 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00159
00161
00163
00173 virtual int Multiply(bool TransA, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00174 {
00175 if (TransA == true) {
00176 IFPACK_CHK_ERR(-1);
00177 }
00178
00179 IFPACK_CHK_ERR(Apply(X,Y));
00180 return(0);
00181 }
00182
00184 virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector& X,
00185 Epetra_MultiVector& Y) const
00186 {
00187 IFPACK_RETURN(-1);
00188 }
00189
00190 virtual int Apply(const Epetra_MultiVector& X,
00191 Epetra_MultiVector& Y) const;
00192
00193 virtual int ApplyInverse(const Epetra_MultiVector& X,
00194 Epetra_MultiVector& Y) const;
00196 virtual int InvRowSums(Epetra_Vector& x) const
00197 {
00198 IFPACK_RETURN(-1);
00199 }
00200
00202 virtual int LeftScale(const Epetra_Vector& x)
00203 {
00204 IFPACK_RETURN(-1);
00205 }
00206
00208 virtual int InvColSums(Epetra_Vector& x) const
00209 {
00210 IFPACK_RETURN(-1);
00211 }
00212
00213
00215 virtual int RightScale(const Epetra_Vector& x)
00216 {
00217 IFPACK_RETURN(-1);
00218 }
00219
00221
00223
00225 virtual bool Filled() const
00226 {
00227 return true;
00228 }
00229
00231
00232
00233
00234 virtual double NormInf() const
00235 {
00236 return(-1.0);
00237 }
00238
00240
00241
00242
00243 virtual double NormOne() const
00244 {
00245 IFPACK_RETURN(-1.0);
00246 }
00247
00249 virtual int NumGlobalNonzeros() const
00250 {
00251 return(NumGlobalNonzeros_);
00252 }
00253
00255 virtual int NumGlobalRows() const
00256 {
00257 return(NumGlobalRows_);
00258 }
00259
00261 virtual int NumGlobalCols() const
00262 {
00263 return(NumGlobalRows_);
00264 }
00265
00267 virtual int NumGlobalDiagonals() const
00268 {
00269 return(NumGlobalRows_);
00270 }
00271
00273 virtual int NumMyNonzeros() const
00274 {
00275 return(NumMyNonzeros_);
00276 }
00277
00279 virtual int NumMyRows() const
00280 {
00281 return(NumMyRows_);
00282 }
00283
00285 virtual int NumMyCols() const
00286 {
00287 return(NumMyCols_);
00288 }
00289
00291 virtual int NumMyDiagonals() const
00292 {
00293 return(NumMyRows_);
00294 }
00295
00297 virtual bool LowerTriangular() const
00298 {
00299 return(Matrix_->LowerTriangular());
00300 }
00301
00303 virtual bool UpperTriangular() const
00304 {
00305 return(Matrix_->UpperTriangular());
00306 }
00307
00309 virtual const Epetra_Map & RowMatrixRowMap() const
00310 {
00311 return(*Map_);
00312 }
00313
00315 virtual const Epetra_Map & RowMatrixColMap() const
00316 {
00317 return(*colMap_);
00318 }
00319
00321 virtual const Epetra_Import * RowMatrixImporter() const
00322 {
00323 return(&*Importer_);
00324 }
00326
00327 virtual const Epetra_Import* Importer() const {return(&*Importer_);}
00328
00329 virtual const Epetra_Export* Exporter() const {return(&*Exporter_);}
00330
00331
00332
00334 int SetOwnership(bool ownership)
00335 {
00336 IFPACK_RETURN(-1);
00337 }
00338
00340 int SetUseTranspose(bool UseTranspose_in)
00341 {
00342 UseTranspose_ = UseTranspose_in;
00343 return(0);
00344 }
00345
00347 bool UseTranspose() const
00348 {
00349 return(UseTranspose_);
00350 }
00351
00353 bool HasNormInf() const
00354 {
00355 return(false);
00356 }
00357
00359 const Epetra_Comm & Comm() const
00360 {
00361 return(*SubComm_);
00362 }
00363
00365 const Epetra_Map & OperatorDomainMap() const
00366 {
00367 return(*Map_);
00368 }
00369
00371 const Epetra_Map & OperatorRangeMap() const
00372 {
00373 return(*Map_);
00374 }
00376
00377 const Epetra_BlockMap& Map() const;
00378
00379 const char* Label() const{
00380 return(Label_);
00381 };
00382
00383 private:
00384 void UpdateImportVector(int NumVectors) const;
00385 void UpdateExportVector(int NumVectors) const;
00386
00388 Teuchos::RCP<const Epetra_RowMatrix> Matrix_;
00389 const Ifpack_OverlappingRowMatrix* ovA_;
00390 #ifdef HAVE_MPI
00391
00392 Teuchos::RCP<Epetra_MpiComm> SubComm_;
00393 MPI_Comm nodeMPIComm_;
00394 #else
00395
00396 Teuchos::RCP<Epetra_SerialComm> SubComm_;
00397 #endif
00398
00399 Teuchos::RCP<Epetra_Map> Map_;
00401 Teuchos::RCP<Epetra_Map> colMap_;
00403 int NumMyRows_;
00405 int NumMyCols_;
00407 int NumMyNonzeros_;
00409 int NumGlobalRows_;
00411 int NumGlobalNonzeros_;
00413 int MaxNumEntries_;
00415 int MaxNumEntriesA_;
00417 std::vector<int> NumEntries_;
00419 mutable std::vector<int> Indices_;
00421 mutable std::vector<double> Values_;
00423 bool UseTranspose_;
00425 char Label_[80];
00426 Teuchos::RCP<Epetra_Vector> Diagonal_;
00427 double NormOne_;
00428 double NormInf_;
00429
00431 int* Ac_LIDMap_;
00432 int* Bc_LIDMap_;
00433 int* Ar_LIDMap_;
00434 int* Br_LIDMap_;
00435
00437 const Epetra_CrsMatrix* Acrs_;
00438
00439 int NumMyRowsA_;
00440 int NumMyColsA_;
00441 double *tempX_,*tempY_;
00442 int NumMyRowsB_;
00443
00444
00445
00446 mutable Epetra_MultiVector* ExportVector_;
00447 mutable Epetra_MultiVector* ImportVector_;
00448 Teuchos::RCP<Epetra_Import> Importer_;
00449 Teuchos::RCP<Epetra_Export> Exporter_;
00450
00451 };
00452 #endif //ifdef IFPACK_NODE_AWARE_CODE
00453 #endif