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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef IFPACK_LOCALFILTER_H
00044 #define IFPACK_LOCALFILTER_H
00045
00046 #include "Ifpack_ConfigDefs.h"
00047 #ifdef HAVE_MPI
00048 #include "Epetra_MpiComm.h"
00049 #else
00050 #include "Epetra_SerialComm.h"
00051 #endif
00052 #include "Epetra_RowMatrix.h"
00053 #include "Teuchos_RefCountPtr.hpp"
00054
00055 class Epetra_Map;
00056 class Epetra_MultiVector;
00057 class Epetra_Vector;
00058 class Epetra_Import;
00059 class Epetra_BlockMap;
00060
00062
00098 class Ifpack_LocalFilter : public virtual Epetra_RowMatrix {
00099
00100 public:
00102
00103 Ifpack_LocalFilter(const Teuchos::RefCountPtr<const Epetra_RowMatrix>& Matrix);
00104
00106
00107
00108 virtual ~Ifpack_LocalFilter() {};
00109
00111
00113
00115
00123 virtual int NumMyRowEntries(int MyRow, int & NumEntries) const
00124 {
00125 NumEntries = NumEntries_[MyRow];
00126 return(0);
00127 }
00128
00130 virtual int MaxNumEntries() const
00131 {
00132 return(MaxNumEntries_);
00133 }
00134
00136
00150 virtual inline int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00151
00153
00159 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00161
00163
00165
00175 virtual int Multiply(bool TransA, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00176 {
00177 if (TransA == true) {
00178 IFPACK_CHK_ERR(-1);
00179 }
00180
00181 IFPACK_CHK_ERR(Apply(X,Y));
00182 return(0);
00183 }
00184
00186 virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector& X,
00187 Epetra_MultiVector& Y) const
00188 {
00189 IFPACK_RETURN(-1);
00190 }
00191
00192 virtual int Apply(const Epetra_MultiVector& X,
00193 Epetra_MultiVector& Y) const;
00194
00195 virtual int ApplyInverse(const Epetra_MultiVector& X,
00196 Epetra_MultiVector& Y) const;
00198 virtual int InvRowSums(Epetra_Vector& x) const
00199 {
00200 IFPACK_RETURN(-1);
00201 }
00202
00204 virtual int LeftScale(const Epetra_Vector& x)
00205 {
00206 IFPACK_RETURN(-1);
00207 }
00208
00210 virtual int InvColSums(Epetra_Vector& x) const
00211 {
00212 IFPACK_RETURN(-1);
00213 }
00214
00215
00217 virtual int RightScale(const Epetra_Vector& x)
00218 {
00219 IFPACK_RETURN(-1);
00220 }
00221
00223
00225
00227 virtual bool Filled() const
00228 {
00229 return true;
00230 }
00231
00233
00234
00235
00236 virtual double NormInf() const
00237 {
00238 return(-1.0);
00239 }
00240
00242
00243
00244
00245 virtual double NormOne() const
00246 {
00247 IFPACK_RETURN(-1.0);
00248 }
00249
00250 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
00251
00252 virtual int NumGlobalNonzeros() const
00253 {
00254 return(NumNonzeros_);
00255 }
00256
00258 virtual int NumGlobalRows() const
00259 {
00260 return(NumRows_);
00261 }
00262
00264 virtual int NumGlobalCols() const
00265 {
00266 return(NumRows_);
00267 }
00268
00270 virtual int NumGlobalDiagonals() const
00271 {
00272 return(NumRows_);
00273 }
00274 #endif
00275
00277 virtual long long NumGlobalNonzeros64() const
00278 {
00279 return(NumNonzeros_);
00280 }
00281
00283 virtual long long NumGlobalRows64() const
00284 {
00285 return(NumRows_);
00286 }
00287
00289 virtual long long NumGlobalCols64() const
00290 {
00291 return(NumRows_);
00292 }
00293
00295 virtual long long NumGlobalDiagonals64() const
00296 {
00297 return(NumRows_);
00298 }
00299
00301 virtual int NumMyNonzeros() const
00302 {
00303 return(NumNonzeros_);
00304 }
00305
00307 virtual int NumMyRows() const
00308 {
00309 return(NumRows_);
00310 }
00311
00313 virtual int NumMyCols() const
00314 {
00315 return(NumRows_);
00316 }
00317
00319 virtual int NumMyDiagonals() const
00320 {
00321 return(NumRows_);
00322 }
00323
00325 virtual bool LowerTriangular() const
00326 {
00327 return(Matrix_->LowerTriangular());
00328 }
00329
00331 virtual bool UpperTriangular() const
00332 {
00333 return(Matrix_->UpperTriangular());
00334 }
00335
00337 virtual const Epetra_Map & RowMatrixRowMap() const
00338 {
00339 return(*Map_);
00340 }
00341
00343 virtual const Epetra_Map & RowMatrixColMap() const
00344 {
00345 return(*Map_);
00346 }
00347
00349 virtual const Epetra_Import * RowMatrixImporter() const
00350 {
00351 return(0);
00352 }
00354
00355
00356
00358 int SetOwnership(bool ownership)
00359 {
00360 IFPACK_RETURN(-1);
00361 }
00362
00364 int SetUseTranspose(bool UseTranspose_in)
00365 {
00366 UseTranspose_ = UseTranspose_in;
00367 return(0);
00368 }
00369
00371 bool UseTranspose() const
00372 {
00373 return(UseTranspose_);
00374 }
00375
00377 bool HasNormInf() const
00378 {
00379 return(false);
00380 }
00381
00383 const Epetra_Comm & Comm() const
00384 {
00385 return(*SerialComm_);
00386 }
00387
00389 const Epetra_Map & OperatorDomainMap() const
00390 {
00391 return(*Map_);
00392 }
00393
00395 const Epetra_Map & OperatorRangeMap() const
00396 {
00397 return(*Map_);
00398 }
00400
00401 const Epetra_BlockMap& Map() const;
00402
00403 const char* Label() const{
00404 return(Label_);
00405 };
00406
00407 private:
00408
00410 Teuchos::RefCountPtr<const Epetra_RowMatrix> Matrix_;
00411 #ifdef HAVE_MPI
00412
00413 Teuchos::RefCountPtr<Epetra_MpiComm> SerialComm_;
00414 #else
00415
00416 Teuchos::RefCountPtr<Epetra_SerialComm> SerialComm_;
00417 #endif
00418
00419 Teuchos::RefCountPtr<Epetra_Map> Map_;
00421 int NumRows_;
00423 int NumNonzeros_;
00425 int MaxNumEntries_;
00427 int MaxNumEntriesA_;
00429 std::vector<int> NumEntries_;
00431 mutable std::vector<int> Indices_;
00433 mutable std::vector<double> Values_;
00435 bool UseTranspose_;
00437 char Label_[80];
00438 Teuchos::RefCountPtr<Epetra_Vector> Diagonal_;
00439 double NormOne_;
00440 double NormInf_;
00441
00442 };
00443
00444 #endif