IFPACK  Development
Ifpack_OverlappingRowMatrix.h
1 
2 /*@HEADER
3 // ***********************************************************************
4 //
5 // Ifpack: Object-Oriented Algebraic Preconditioner Package
6 // Copyright (2002) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39 //
40 // ***********************************************************************
41 //@HEADER
42 */
43 
44 #ifndef IFPACK_OVERLAPPINGROWMATRIX_H
45 #define IFPACK_OVERLAPPINGROWMATRIX_H
46 
47 #include "Ifpack_ConfigDefs.h"
48 #include "Epetra_RowMatrix.h"
49 #include "Epetra_CombineMode.h"
50 #include "Teuchos_RefCountPtr.hpp"
51 #include "Epetra_Import.h"
52 #include "Epetra_Map.h"
53 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
54 #include "Epetra_IntVector.h"
55 #else
56 # ifdef IFPACK_NODE_AWARE_CODE
57 # include "Epetra_IntVector.h"
58 # endif
59 #endif
60 
61 class Epetra_Map;
62 class Epetra_BlockMap;
63 class Epetra_CrsMatrix;
64 class Epetra_Comm;
65 
67 //
69 
70 public:
71 
73 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
74  Ifpack_OverlappingRowMatrix(const Teuchos::RefCountPtr<const Epetra_RowMatrix>& Matrix_in,
75  int OverlapLevel_in, int subdomainID);
76 #else
77 # ifdef IFPACK_NODE_AWARE_CODE
78  Ifpack_OverlappingRowMatrix(const Teuchos::RefCountPtr<const Epetra_RowMatrix>& Matrix_in,
79  int OverlapLevel_in, int myNodeID);
80 # endif
81 #endif
82  Ifpack_OverlappingRowMatrix(const Teuchos::RefCountPtr<const Epetra_RowMatrix>& Matrix_in,
83  int OverlapLevel_in);
84 
85 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
87 #else
88 # ifdef IFPACK_NODE_AWARE_CODE
90 # else
92 # endif
93 #endif
94 
95 
97 
99 
107  virtual int NumMyRowEntries(int MyRow, int & NumEntries) const;
108 
110  virtual int MaxNumEntries() const
111  {
112  return(MaxNumEntries_);
113  }
114 
116 
130  virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
131 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
132  virtual int ExtractGlobalRowCopy(int MyRow, int Length, int & NumEntries, double* Values, int* Indices) const;
133 #else
134 # ifdef IFPACK_NODE_AWARE_CODE
135  virtual int ExtractGlobalRowCopy(int MyRow, int Length, int & NumEntries, double* Values, int* Indices) const;
136 # endif
137 #endif
138 
140 
146  virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
148 
150 
152 
162  virtual int Multiply(bool TransA, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
163 
165  virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector& X,
166  Epetra_MultiVector& Y) const
167  {
168  IFPACK_RETURN(-1); // not implemented
169  }
170 
171  virtual int Apply(const Epetra_MultiVector& X,
172  Epetra_MultiVector& Y) const;
173 
174  virtual int ApplyInverse(const Epetra_MultiVector& X,
175  Epetra_MultiVector& Y) const;
177  virtual int InvRowSums(Epetra_Vector& x) const
178  {
179  IFPACK_RETURN(-1); // not implemented
180  }
181 
183  virtual int LeftScale(const Epetra_Vector& x)
184  {
185  IFPACK_RETURN(-1); // not implemented
186  }
187 
189  virtual int InvColSums(Epetra_Vector& x) const
190  {
191  IFPACK_RETURN(-1); // not implemented
192  }
193 
194 
196  virtual int RightScale(const Epetra_Vector& x)
197  {
198  IFPACK_RETURN(-1); // not implemented
199  }
200 
202 
204 
206  virtual bool Filled() const
207  {
208  return(true);
209  }
210 
212  /* Returns the quantity \f$ \| A \|_\infty\f$ such that
213  \f[\| A \|_\infty = \max_{1\lei\len} \sum_{i=1}^m |a_{ij}| \f].
214  */
215  virtual double NormInf() const
216  {
217  return(A().NormInf());
218  }
219 
221  /* Returns the quantity \f$ \| A \|_1\f$ such that
222  \f[\| A \|_1= \max_{1\lej\len} \sum_{j=1}^n |a_{ij}| \f].
223  */
224  virtual double NormOne() const
225  {
226  return(A().NormOne());
227  }
228 
229 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
230  virtual int NumGlobalNonzeros() const
232  {
233  if(A().RowMatrixRowMap().GlobalIndicesInt())
234  return (int) NumGlobalNonzeros_;
235  else
236  throw "Ifpack_OverlappingRowMatrix::NumGlobalNonzeros: Global indices not int";
237  }
238 
240  virtual int NumGlobalRows() const
241  {
242  return(A().NumGlobalRows());
243  }
244 
246  virtual int NumGlobalCols() const
247  {
248  return(A().NumGlobalCols());
249  }
250 
252  virtual int NumGlobalDiagonals() const
253  {
254  return(A().NumGlobalDiagonals());
255  }
256 #endif
257  virtual long long NumGlobalNonzeros64() const
259  {
260  return(NumGlobalNonzeros_);
261  }
262 
264  virtual long long NumGlobalRows64() const
265  {
266  return(A().NumGlobalRows64());
267  }
268 
270  virtual long long NumGlobalCols64() const
271  {
272  return(A().NumGlobalCols64());
273  }
274 
276  virtual long long NumGlobalDiagonals64() const
277  {
278  return(A().NumGlobalDiagonals64());
279  }
280 
282  virtual int NumMyNonzeros() const
283  {
284  return(NumMyNonzeros_);
285  }
286 
288  virtual int NumMyRows() const
289  {
290  return(NumMyRows_);
291  }
292 
294  virtual int NumMyCols() const
295  {
296  return(NumMyCols_);
297  }
298 
300  virtual int NumMyDiagonals() const
301  {
302  return(NumMyDiagonals_);
303  }
304 
306  virtual bool LowerTriangular() const
307  {
308  return(A().LowerTriangular());
309  }
310 
312  virtual bool UpperTriangular() const
313  {
314  return(A().UpperTriangular());
315  }
316 
318  virtual const Epetra_Map & RowMatrixRowMap() const
319  {
320  return(*Map_);
321  }
322 
324  virtual const Epetra_Map & RowMatrixColMap() const
325  {
326 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
327  return(*colMap_);
328 #else
329 # ifdef IFPACK_NODE_AWARE_CODE
330  return(*colMap_);
331 # else
332  return(*Map_);
333 # endif
334 #endif
335  }
336 
338  virtual const Epetra_Import * RowMatrixImporter() const
339  {
340  return(&*Importer_);
341  }
343 
344  // following functions are required to derive Epetra_RowMatrix objects.
345 
347  int SetOwnership(bool ownership)
348  {
349  IFPACK_RETURN(-1);
350  }
351 
353  int SetUseTranspose(bool UseTranspose_in)
354  {
355  UseTranspose_ = UseTranspose_in;
356  return(0);
357  }
358 
360  bool UseTranspose() const
361  {
362  return(UseTranspose_);
363  }
364 
366  bool HasNormInf() const
367  {
368  return(A().HasNormInf());
369  }
370 
372  const Epetra_Comm & Comm() const
373  {
374  return(A().Comm());
375  }
376 
379  {
380  return(*Map_);
381  }
382 
384  const Epetra_Map & OperatorRangeMap() const
385  {
386  return(*Map_);
387  }
389 
390 const Epetra_BlockMap& Map() const;
391 
392 const char* Label() const{
393  return(Label_.c_str());
394 };
395 
396 int OverlapLevel() const
397 {
398  return(OverlapLevel_);
399 }
400 
401 int ImportMultiVector(const Epetra_MultiVector& X,
402  Epetra_MultiVector& OvX,
403  Epetra_CombineMode CM = Insert);
404 
405 int ExportMultiVector(const Epetra_MultiVector& OvX,
407  Epetra_CombineMode CM = Add);
408 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
409  inline const Epetra_RowMatrix& A() const
410  {
411  return(*Matrix_);
412  }
413 
414  inline Epetra_CrsMatrix& B() const
415  {
416  return(*ExtMatrix_);
417  }
418 #else
419 # ifdef IFPACK_NODE_AWARE_CODE
420  inline const Epetra_RowMatrix& A() const
421  {
422  return(*Matrix_);
423  }
424 
425  inline Epetra_CrsMatrix& B() const
426  {
427  return(*ExtMatrix_);
428  }
429 # endif
430 #endif
431 
432 private:
433 #ifndef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
434 # ifndef IFPACK_NODE_AWARE_CODE
435  inline const Epetra_RowMatrix& A() const
436  {
437  return(*Matrix_);
438  }
439 
440  inline Epetra_RowMatrix& B() const;
441 # endif
442 #endif
443 
444  int NumMyRows_;
445  int NumMyCols_;
446  int NumMyDiagonals_;
447  int NumMyNonzeros_;
448 
449  long long NumGlobalNonzeros_;
450  int MaxNumEntries_;
451 
452  int NumMyRowsA_;
453  int NumMyRowsB_;
454 
455  bool UseTranspose_;
456 
457  Teuchos::RefCountPtr<const Epetra_Map> Map_;
458 #ifdef HAVE_IFPACK_PARALLEL_SUBDOMAIN_SOLVERS
459  const Epetra_Map *colMap_;
460 #else
461 # ifdef IFPACK_NODE_AWARE_CODE
462  const Epetra_Map *colMap_;
463 # endif
464 #endif
465  Teuchos::RefCountPtr<const Epetra_Import> Importer_;
466 
467  Teuchos::RefCountPtr<const Epetra_RowMatrix> Matrix_;
468  Teuchos::RefCountPtr<Epetra_CrsMatrix> ExtMatrix_;
469  Teuchos::RefCountPtr<Epetra_Map> ExtMap_;
470  Teuchos::RefCountPtr<Epetra_Import> ExtImporter_;
471 
472  int OverlapLevel_;
473  std::string Label_;
474 
475  template<typename int_type>
476  void BuildMap(int OverlapLevel_in);
477 
478 }; // class Ifpack_OverlappingRowMatrix
479 
480 #endif // IFPACK_OVERLAPPINGROWMATRIX_H
Ifpack_OverlappingRowMatrix::NumGlobalNonzeros64
virtual long long NumGlobalNonzeros64() const
Returns the number of nonzero entries in the global matrix.
Definition: Ifpack_OverlappingRowMatrix.h:258
Ifpack_OverlappingRowMatrix::NumMyNonzeros
virtual int NumMyNonzeros() const
Returns the number of nonzero entries in the calling processor's portion of the matrix.
Definition: Ifpack_OverlappingRowMatrix.h:282
Ifpack_OverlappingRowMatrix
Ifpack_OverlappingRowMatrix: matrix with ghost rows, based on Epetra_RowMatrix.
Definition: Ifpack_OverlappingRowMatrix.h:68
Ifpack_OverlappingRowMatrix::RowMatrixColMap
virtual const Epetra_Map & RowMatrixColMap() const
Returns the Epetra_Map object associated with the columns of this matrix.
Definition: Ifpack_OverlappingRowMatrix.h:324
Ifpack_OverlappingRowMatrix::Solve
virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Returns result of a local-only solve using a triangular Epetra_RowMatrix with Epetra_MultiVectors X a...
Definition: Ifpack_OverlappingRowMatrix.h:165
Ifpack_OverlappingRowMatrix::NumGlobalNonzeros
virtual int NumGlobalNonzeros() const
Returns the number of nonzero entries in the global matrix.
Definition: Ifpack_OverlappingRowMatrix.h:231
Ifpack_OverlappingRowMatrix::UpperTriangular
virtual bool UpperTriangular() const
If matrix is upper triangular in local index space, this query returns true, otherwise it returns fal...
Definition: Ifpack_OverlappingRowMatrix.h:312
Ifpack_OverlappingRowMatrix::SetUseTranspose
int SetUseTranspose(bool UseTranspose_in)
Sets use transpose (not implemented).
Definition: Ifpack_OverlappingRowMatrix.h:353
Ifpack_OverlappingRowMatrix::MaxNumEntries
virtual int MaxNumEntries() const
Returns the maximum of NumMyRowEntries() over all rows.
Definition: Ifpack_OverlappingRowMatrix.h:110
Ifpack_OverlappingRowMatrix::RightScale
virtual int RightScale(const Epetra_Vector &x)
Scales the Epetra_RowMatrix on the right with a Epetra_Vector x (NOT IMPLEMENTED).
Definition: Ifpack_OverlappingRowMatrix.h:196
Ifpack_OverlappingRowMatrix::NormOne
virtual double NormOne() const
Returns the one norm of the global matrix.
Definition: Ifpack_OverlappingRowMatrix.h:224
Ifpack_OverlappingRowMatrix::NumMyRowEntries
virtual int NumMyRowEntries(int MyRow, int &NumEntries) const
Returns the number of nonzero entries in MyRow.
Definition: Ifpack_OverlappingRowMatrix.cpp:1602
Epetra_Comm
Ifpack_OverlappingRowMatrix::NumGlobalCols
virtual int NumGlobalCols() const
Returns the number of global matrix columns.
Definition: Ifpack_OverlappingRowMatrix.h:246
Ifpack_OverlappingRowMatrix::UseTranspose
bool UseTranspose() const
Returns the current UseTranspose setting.
Definition: Ifpack_OverlappingRowMatrix.h:360
Ifpack_OverlappingRowMatrix::Multiply
virtual int Multiply(bool TransA, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Returns the result of a Epetra_RowMatrix multiplied by a Epetra_MultiVector X in Y.
Definition: Ifpack_OverlappingRowMatrix.cpp:1736
Epetra_CrsMatrix
Epetra_CombineMode.h
Ifpack_OverlappingRowMatrix::NumGlobalRows
virtual int NumGlobalRows() const
Returns the number of global matrix rows.
Definition: Ifpack_OverlappingRowMatrix.h:240
Ifpack_OverlappingRowMatrix::RowMatrixImporter
virtual const Epetra_Import * RowMatrixImporter() const
Returns the Epetra_Import object that contains the import operations for distributed operations.
Definition: Ifpack_OverlappingRowMatrix.h:338
Ifpack_OverlappingRowMatrix::NumGlobalDiagonals64
virtual long long NumGlobalDiagonals64() const
Returns the number of global nonzero diagonal entries, based on global row/column index comparisons.
Definition: Ifpack_OverlappingRowMatrix.h:276
Ifpack_OverlappingRowMatrix::SetOwnership
int SetOwnership(bool ownership)
Sets ownership.
Definition: Ifpack_OverlappingRowMatrix.h:347
Epetra_RowMatrix
Ifpack_OverlappingRowMatrix::Filled
virtual bool Filled() const
If FillComplete() has been called, this query returns true, otherwise it returns false.
Definition: Ifpack_OverlappingRowMatrix.h:206
Ifpack_OverlappingRowMatrix::NumGlobalRows64
virtual long long NumGlobalRows64() const
Returns the number of global matrix rows.
Definition: Ifpack_OverlappingRowMatrix.h:264
Epetra_BlockMap
Epetra_Vector
Epetra_CombineMode
Epetra_CombineMode
Ifpack_OverlappingRowMatrix::ExtractDiagonalCopy
virtual int ExtractDiagonalCopy(Epetra_Vector &Diagonal) const
Returns a copy of the main diagonal in a user-provided vector.
Definition: Ifpack_OverlappingRowMatrix.cpp:1728
Ifpack_OverlappingRowMatrix::OperatorDomainMap
const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this operator.
Definition: Ifpack_OverlappingRowMatrix.h:378
Ifpack_OverlappingRowMatrix::ExtractMyRowCopy
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const
Returns a copy of the specified local row in user-provided arrays.
Definition: Ifpack_OverlappingRowMatrix.cpp:1711
Epetra_MultiVector
Ifpack_OverlappingRowMatrix::NormInf
virtual double NormInf() const
Returns the infinity norm of the global matrix.
Definition: Ifpack_OverlappingRowMatrix.h:215
Ifpack_OverlappingRowMatrix::NumMyDiagonals
virtual int NumMyDiagonals() const
Returns the number of local nonzero diagonal entries, based on global row/column index comparisons.
Definition: Ifpack_OverlappingRowMatrix.h:300
Ifpack_OverlappingRowMatrix::NumMyCols
virtual int NumMyCols() const
Returns the number of matrix columns owned by the calling processor.
Definition: Ifpack_OverlappingRowMatrix.h:294
Ifpack_OverlappingRowMatrix::InvColSums
virtual int InvColSums(Epetra_Vector &x) const
Computes the sum of absolute values of the columns of the Epetra_RowMatrix, results returned in x (NO...
Definition: Ifpack_OverlappingRowMatrix.h:189
Ifpack_OverlappingRowMatrix::InvRowSums
virtual int InvRowSums(Epetra_Vector &x) const
Computes the sum of absolute values of the rows of the Epetra_RowMatrix, results returned in x (NOT I...
Definition: Ifpack_OverlappingRowMatrix.h:177
Ifpack_OverlappingRowMatrix::NumGlobalDiagonals
virtual int NumGlobalDiagonals() const
Returns the number of global nonzero diagonal entries, based on global row/column index comparisons.
Definition: Ifpack_OverlappingRowMatrix.h:252
Ifpack_OverlappingRowMatrix::LeftScale
virtual int LeftScale(const Epetra_Vector &x)
Scales the Epetra_RowMatrix on the left with a Epetra_Vector x (NOT IMPLEMENTED).
Definition: Ifpack_OverlappingRowMatrix.h:183
Ifpack_OverlappingRowMatrix::NumGlobalCols64
virtual long long NumGlobalCols64() const
Returns the number of global matrix columns.
Definition: Ifpack_OverlappingRowMatrix.h:270
Ifpack_OverlappingRowMatrix::LowerTriangular
virtual bool LowerTriangular() const
If matrix is lower triangular in local index space, this query returns true, otherwise it returns fal...
Definition: Ifpack_OverlappingRowMatrix.h:306
Ifpack_OverlappingRowMatrix::HasNormInf
bool HasNormInf() const
Returns true if the this object can provide an approximate Inf-norm, false otherwise.
Definition: Ifpack_OverlappingRowMatrix.h:366
Ifpack_OverlappingRowMatrix::OperatorRangeMap
const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this operator.
Definition: Ifpack_OverlappingRowMatrix.h:384
Ifpack_OverlappingRowMatrix::NumMyRows
virtual int NumMyRows() const
Returns the number of matrix rows owned by the calling processor.
Definition: Ifpack_OverlappingRowMatrix.h:288
Epetra_Map
Ifpack_OverlappingRowMatrix::RowMatrixRowMap
virtual const Epetra_Map & RowMatrixRowMap() const
Returns the Epetra_Map object associated with the rows of this matrix.
Definition: Ifpack_OverlappingRowMatrix.h:318
Epetra_Import
Ifpack_OverlappingRowMatrix::Comm
const Epetra_Comm & Comm() const
Returns a pointer to the Epetra_Comm communicator associated with this operator.
Definition: Ifpack_OverlappingRowMatrix.h:372