Ifpack2 Templated Preconditioning Package  Version 1.0
Ifpack2_OverlappingRowMatrix_decl.hpp
1 /*@HEADER
2 // ***********************************************************************
3 //
4 // Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
5 // Copyright (2009) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 //@HEADER
41 */
42 
43 #ifndef IFPACK2_OVERLAPPINGROWMATRIX_DECL_HPP
44 #define IFPACK2_OVERLAPPINGROWMATRIX_DECL_HPP
45 
46 #include "Ifpack2_Details_RowMatrix.hpp"
47 #include "Tpetra_CrsMatrix_decl.hpp" // only need the declaration here
48 #include "Tpetra_Import_decl.hpp"
49 #include "Tpetra_Map_decl.hpp"
50 #include <type_traits>
51 
52 namespace Ifpack2 {
53 
57 template<class MatrixType>
59  virtual public Ifpack2::Details::RowMatrix<MatrixType> {
60 public:
62 
63  typedef typename MatrixType::scalar_type scalar_type;
64  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
65  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
66  typedef typename MatrixType::node_type node_type;
67  typedef typename Teuchos::ScalarTraits<scalar_type>::magnitudeType magnitude_type;
68  typedef typename MatrixType::global_inds_host_view_type global_inds_host_view_type;
69  typedef typename MatrixType::local_inds_host_view_type local_inds_host_view_type;
70  typedef typename MatrixType::values_host_view_type values_host_view_type;
71 
72  typedef typename MatrixType::nonconst_global_inds_host_view_type nonconst_global_inds_host_view_type;
73  typedef typename MatrixType::nonconst_local_inds_host_view_type nonconst_local_inds_host_view_type;
74  typedef typename MatrixType::nonconst_values_host_view_type nonconst_values_host_view_type;
75 
76  using row_matrix_type = Tpetra::RowMatrix<scalar_type, local_ordinal_type,
77  global_ordinal_type, node_type>;
78 
79  static_assert(std::is_same<MatrixType, row_matrix_type>::value, "Ifpack2::OverlappingRowMatrix: The template parameter MatrixType must be a Tpetra::RowMatrix specialization. Please don't use Tpetra::CrsMatrix (a subclass of Tpetra::RowMatrix) here anymore. The constructor can take either a RowMatrix or a CrsMatrix just fine.");
80 
81  typedef typename row_matrix_type::mag_type mag_type;
82 
84 
86 
97  OverlappingRowMatrix (const Teuchos::RCP<const row_matrix_type>& A,
98  const int overlapLevel);
99 
101  ~OverlappingRowMatrix () = default;
102 
104 
106 
108  virtual Teuchos::RCP<const Teuchos::Comm<int> > getComm() const;
109 
110 
112  virtual Teuchos::RCP<const Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> >
113  getRowMap () const;
114 
116  virtual Teuchos::RCP<const Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> >
117  getColMap () const;
118 
122  virtual Teuchos::RCP<const Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> >
123  getDomainMap () const;
124 
128  virtual Teuchos::RCP<const Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> >
129  getRangeMap () const;
130 
132  virtual Teuchos::RCP<const Tpetra::RowGraph<local_ordinal_type, global_ordinal_type, node_type> >
133  getGraph () const;
134 
136  virtual global_size_t getGlobalNumRows () const;
137 
139  virtual global_size_t getGlobalNumCols () const;
140 
142  virtual size_t getNodeNumRows () const;
143 
149  virtual size_t getNodeNumCols () const;
150 
152  virtual global_ordinal_type getIndexBase () const;
153 
155  virtual global_size_t getGlobalNumEntries () const;
156 
158  virtual size_t getNodeNumEntries () const;
159 
169  virtual size_t getNumEntriesInGlobalRow (global_ordinal_type globalRow) const;
170 
180  virtual size_t getNumEntriesInLocalRow (local_ordinal_type localRow) const;
181 
183  virtual size_t getGlobalMaxNumRowEntries () const;
184 
186  virtual size_t getNodeMaxNumRowEntries() const;
187 
189  virtual bool hasColMap() const;
190 
192  virtual bool isLocallyIndexed () const;
193 
195  virtual bool isGloballyIndexed () const;
196 
198  virtual bool isFillComplete() const;
199 
201  virtual bool supportsRowViews() const;
202 
204 
206 
208 
218  virtual void
219  getGlobalRowCopy (global_ordinal_type GlobalRow,
220  nonconst_global_inds_host_view_type &Indices,
221  nonconst_values_host_view_type &Values,
222  size_t& NumEntries) const;
223 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
224  virtual void
225  getGlobalRowCopy (global_ordinal_type GlobalRow,
226  const Teuchos::ArrayView<global_ordinal_type> &Indices,
227  const Teuchos::ArrayView<scalar_type> &Values,
228  size_t &NumEntries) const;
229 #endif
230 
241  virtual void
242  getLocalRowCopy (local_ordinal_type LocalRow,
243  nonconst_local_inds_host_view_type &Indices,
244  nonconst_values_host_view_type &Values,
245  size_t& NumEntries) const;
246 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
247  virtual void
248  getLocalRowCopy (local_ordinal_type LocalRow,
249  const Teuchos::ArrayView<local_ordinal_type> &Indices,
250  const Teuchos::ArrayView<scalar_type> &Values,
251  size_t &NumEntries) const;
252 #endif
253 
255 
264  virtual void
265  getGlobalRowView (global_ordinal_type GlobalRow,
266  global_inds_host_view_type &indices,
267  values_host_view_type &values) const;
268 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
269  virtual void
270  getGlobalRowView (global_ordinal_type GlobalRow,
271  Teuchos::ArrayView<const global_ordinal_type> &indices,
272  Teuchos::ArrayView<const scalar_type> &values) const;
273 #endif
274 
284  virtual void
285  getLocalRowView (local_ordinal_type LocalRow,
286  local_inds_host_view_type & indices,
287  values_host_view_type & values) const;
288 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
289  virtual void
290  getLocalRowView (local_ordinal_type LocalRow,
291  Teuchos::ArrayView<const local_ordinal_type> &indices,
292  Teuchos::ArrayView<const scalar_type> &values) const;
293 #endif
294 
296 
298  virtual
299  void getLocalDiagCopy (Tpetra::Vector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &diag) const;
300 
302 
304 
314  virtual void
315  leftScale (const Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& x);
316 
326  virtual void
327  rightScale (const Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& x);
328 
330 
333  virtual mag_type
334  getFrobeniusNorm () const;
335 
337 
344  virtual void
345  apply (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &X,
346  Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &Y,
347  Teuchos::ETransp mode = Teuchos::NO_TRANS,
348  scalar_type alpha = Teuchos::ScalarTraits<scalar_type>::one(),
349  scalar_type beta = Teuchos::ScalarTraits<scalar_type>::zero()) const;
350 
352  virtual bool hasTransposeApply() const;
353 
354  virtual void
355  importMultiVector (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &X,
356  Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &OvX,
357  Tpetra::CombineMode CM = Tpetra::INSERT);
358 
359  virtual void
360  exportMultiVector (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &OvX,
361  Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &X,
362  Tpetra::CombineMode CM = Tpetra::ADD);
363 
364  std::string description() const;
365 
366  void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const;
367 
368  virtual Teuchos::RCP<const row_matrix_type> getUnderlyingMatrix() const;
369 
370  Teuchos::RCP<const row_matrix_type> getExtMatrix() const;
371 
372  Teuchos::ArrayView<const size_t> getExtHaloStarts() const;
373 
374 private:
375  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
376  typedef Tpetra::Import<local_ordinal_type, global_ordinal_type, node_type> import_type;
377  typedef Tpetra::Export<local_ordinal_type, global_ordinal_type, node_type> export_type;
378  typedef Tpetra::RowGraph<local_ordinal_type, global_ordinal_type, node_type> row_graph_type;
379  typedef Tpetra::CrsMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> crs_matrix_type;
380  typedef Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type> vector_type;
381 
383  Teuchos::RCP<const crs_matrix_type> A_;
384 
385  Tpetra::global_size_t NumGlobalRows_;
386  Tpetra::global_size_t NumGlobalNonzeros_;
387  size_t MaxNumEntries_;
388  int OverlapLevel_;
389 
390  // Wrapper matrix objects
391  Teuchos::RCP<const map_type> RowMap_;
392  Teuchos::RCP<const map_type> ColMap_;
393  Teuchos::RCP<const import_type> Importer_;
394 
396  Teuchos::RCP<const crs_matrix_type> ExtMatrix_;
397  Teuchos::RCP<const map_type> ExtMap_;
398  Teuchos::RCP<const import_type> ExtImporter_;
399  Teuchos::Array<size_t> ExtHaloStarts_;
400 
402  Teuchos::RCP<const row_graph_type> graph_;
404  mutable nonconst_local_inds_host_view_type Indices_;
406  mutable nonconst_values_host_view_type Values_;
407 
408 
409 }; // class OverlappingRowMatrix
410 
411 } // namespace Ifpack2
412 
413 #endif // IFPACK2_OVERLAPPINGROWMATRIX_DECL_HPP
virtual Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getDomainMap() const
The Map that describes the domain of this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:261
~OverlappingRowMatrix()=default
Destructor.
virtual Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getRangeMap() const
The Map that describes the range of this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:277
All Ifpack2 implementations of Tpetra::RowMatrix must inherit from this class.
Definition: Ifpack2_Details_RowMatrix.hpp:63
virtual Teuchos::RCP< const Tpetra::RowGraph< local_ordinal_type, global_ordinal_type, node_type > > getGraph() const
This matrix&#39;s graph.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:285
virtual Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getColMap() const
The Map that describes the distribution of columns over processes.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:252
virtual bool hasTransposeApply() const
Whether this operator&#39;s apply() method can apply the adjoint (transpose).
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:678
virtual mag_type getFrobeniusNorm() const
Returns the Frobenius norm of the matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:611
virtual size_t getNumEntriesInGlobalRow(global_ordinal_type globalRow) const
The number of entries in the given global row that are owned by the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:344
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the matrix is distributed.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:233
virtual bool isLocallyIndexed() const
Whether this matrix is locally indexed.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:392
virtual void getGlobalRowView(global_ordinal_type GlobalRow, global_inds_host_view_type &indices, values_host_view_type &values) const
Extract a const, non-persisting view of global indices in a specified row of the matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:483
virtual global_size_t getGlobalNumCols() const
The global number of columns in this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:299
virtual void leftScale(const Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &x)
Scales the RowMatrix on the left with the Vector x.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:594
virtual bool isFillComplete() const
true if fillComplete() has been called, else false.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:406
virtual void getLocalRowCopy(local_ordinal_type LocalRow, nonconst_local_inds_host_view_type &Indices, nonconst_values_host_view_type &Values, size_t &NumEntries) const
Extract a list of entries in a specified local row of the graph. Put into storage allocated by callin...
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:449
virtual bool isGloballyIndexed() const
Whether this matrix is globally indexed.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:399
virtual Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getRowMap() const
The Map that describes the distribution of rows over processes.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:243
virtual bool hasColMap() const
Whether this matrix has a column Map.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:385
virtual size_t getNodeNumEntries() const
The number of entries in this matrix owned by the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:335
virtual void getLocalRowView(local_ordinal_type LocalRow, local_inds_host_view_type &indices, values_host_view_type &values) const
Extract a const, non-persisting view of local indices in a specified row of the matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:524
virtual void getGlobalRowCopy(global_ordinal_type GlobalRow, nonconst_global_inds_host_view_type &Indices, nonconst_values_host_view_type &Values, size_t &NumEntries) const
Extract a list of entries in a specified global row of this matrix. Put into pre-allocated storage...
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:415
virtual bool supportsRowViews() const
true if row views are supported, else false.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:685
virtual size_t getNodeNumCols() const
The number of columns owned by the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:313
virtual size_t getGlobalMaxNumRowEntries() const
The maximum number of entries in any row on any process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:371
virtual void rightScale(const Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &x)
Scales the RowMatrix on the right with the Vector x.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:603
Sparse matrix (Tpetra::RowMatrix subclass) with ghost rows.
Definition: Ifpack2_OverlappingRowMatrix_decl.hpp:58
virtual size_t getNodeMaxNumRowEntries() const
The maximum number of entries in any row on the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:378
OverlappingRowMatrix(const Teuchos::RCP< const row_matrix_type > &A, const int overlapLevel)
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:58
virtual size_t getNodeNumRows() const
The number of rows owned by the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:306
virtual void apply(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Computes the operator-multivector application.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:620
Preconditioners and smoothers for Tpetra sparse matrices.
Definition: Ifpack2_AdditiveSchwarz_decl.hpp:73
virtual global_size_t getGlobalNumEntries() const
The global number of entries in this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:328
virtual size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const
The number of entries in the given local row that are owned by the calling process.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:358
virtual global_ordinal_type getIndexBase() const
The index base for global indices for this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:321
virtual global_size_t getGlobalNumRows() const
The global number of rows in this matrix.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:292
virtual void getLocalDiagCopy(Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &diag) const
Get a copy of the diagonal entries owned by this node, with local row indices.
Definition: Ifpack2_OverlappingRowMatrix_def.hpp:561