Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2_Details_OverlappingRowGraph_def.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_OVERLAPPINGROWGRAPH_DEF_HPP
44#define IFPACK2_OVERLAPPINGROWGRAPH_DEF_HPP
45
46#include <Ifpack2_Details_OverlappingRowGraph_decl.hpp>
47#include <Tpetra_Import.hpp>
48#include <Tpetra_Export.hpp>
49
50
51namespace Ifpack2 {
52namespace Details {
53
54template<class GraphType>
56OverlappingRowGraph (const Teuchos::RCP<const row_graph_type>& nonoverlappingGraph,
57 const Teuchos::RCP<const row_graph_type>& overlappingGraph,
58 const Teuchos::RCP<const map_type>& rowMap,
59 const Teuchos::RCP<const map_type>& colMap,
60 const Tpetra::global_size_t numGlobalRows,
61 const Tpetra::global_size_t numGlobalCols,
62 const Tpetra::global_size_t numGlobalNonzeros,
63 const size_t maxNumEntries,
64 const Teuchos::RCP<const import_type>& nonoverlappingImporter,
65 const Teuchos::RCP<const import_type>& overlappingImporter) :
66 nonoverlappingGraph_ (nonoverlappingGraph),
67 overlappingGraph_ (overlappingGraph),
68 rowMap_ (rowMap),
69 colMap_ (colMap),
70 numGlobalRows_ (numGlobalRows),
71 numGlobalCols_ (numGlobalCols),
72 numGlobalNonzeros_ (numGlobalNonzeros),
73 maxNumEntries_ (maxNumEntries),
74 nonoverlappingImporter_ (nonoverlappingImporter),
75 overlappingImporter_ (overlappingImporter)
76{}
77
78
79template<class GraphType>
81
82
83template<class GraphType>
84Teuchos::RCP<const Teuchos::Comm<int> >
86{
87 return nonoverlappingGraph_->getComm ();
88}
89
90
91
92
93template<class GraphType>
94Teuchos::RCP<const Tpetra::Map<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
96{
97 return rowMap_;
98}
99
100
101template<class GraphType>
102Teuchos::RCP<const Tpetra::Map<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
104{
105 return colMap_;
106}
107
108
109template<class GraphType>
110Teuchos::RCP<const Tpetra::Map<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
112{
113 return nonoverlappingGraph_->getDomainMap ();
114}
115
116
117template<class GraphType>
118Teuchos::RCP<const Tpetra::Map<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
120{
121 return nonoverlappingGraph_->getRangeMap ();
122}
123
124
125template<class GraphType>
126Teuchos::RCP<const Tpetra::Import<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
128{
129 return nonoverlappingImporter_;
130}
131
132
133template<class GraphType>
134Teuchos::RCP<const Tpetra::Export<typename GraphType::local_ordinal_type, typename GraphType::global_ordinal_type, typename GraphType::node_type> >
136{
137 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error, "Not implemented");
138}
139
140
141template<class GraphType>
143{
144 return numGlobalRows_;
145}
146
147
148template<class GraphType>
150{
151 return numGlobalCols_;
152}
153
154
155template<class GraphType>
157{
158 return nonoverlappingGraph_->getLocalNumRows () +
159 overlappingGraph_->getLocalNumRows ();
160}
161
162
163template<class GraphType>
165{
166 return this->getLocalNumRows ();
167}
168
169
170template<class GraphType>
171typename GraphType::global_ordinal_type
173{
174 return nonoverlappingGraph_->getIndexBase ();
175}
176
177
178template<class GraphType>
180{
181 return numGlobalNonzeros_;
182}
183
184
185template<class GraphType>
187{
188 return nonoverlappingGraph_->getLocalNumEntries () +
189 overlappingGraph_->getLocalNumEntries ();
190}
191
192
193template<class GraphType>
194size_t
196getNumEntriesInGlobalRow (global_ordinal_type globalRow) const
197{
198 const local_ordinal_type localRow = rowMap_->getLocalElement (globalRow);
199 if (localRow == Teuchos::OrdinalTraits<local_ordinal_type>::invalid ()) {
200 return Teuchos::OrdinalTraits<size_t>::invalid();
201 } else {
202 return getNumEntriesInLocalRow (localRow);
203 }
204}
205
206
207template<class GraphType>
208size_t
210getNumEntriesInLocalRow (local_ordinal_type localRow) const
211{
212 using Teuchos::as;
213 const size_t numMyRowsA = nonoverlappingGraph_->getLocalNumRows ();
214 if (as<size_t> (localRow) < numMyRowsA) {
215 return nonoverlappingGraph_->getNumEntriesInLocalRow (localRow);
216 } else {
217 return overlappingGraph_->getNumEntriesInLocalRow (as<local_ordinal_type> (localRow - numMyRowsA));
218 }
219}
220
221
222template<class GraphType>
224{
225 throw std::runtime_error("Ifpack2::OverlappingRowGraph::getGlobalMaxNumRowEntries() not supported.");
226}
227
228
229template<class GraphType>
231{
232 return maxNumEntries_;
233}
234
235
236template<class GraphType>
238{
239 return true;
240}
241
242
243template<class GraphType>
245{
246 return true;
247}
248
249
250template<class GraphType>
252{
253 return false;
254}
255
256
257template<class GraphType>
259{
260 return true;
261}
262
263template<class GraphType>
264void
266 getGlobalRowCopy (global_ordinal_type globalRow,
267 nonconst_global_inds_host_view_type& indices,
268 size_t& numIndices) const
269{
270 const local_ordinal_type localRow = rowMap_->getLocalElement (globalRow);
271 if (localRow == Teuchos::OrdinalTraits<local_ordinal_type>::invalid ()) {
272 numIndices = Teuchos::OrdinalTraits<size_t>::invalid ();
273 } else {
274 if (Teuchos::as<size_t> (localRow) < nonoverlappingGraph_->getLocalNumRows ()) {
275 nonoverlappingGraph_->getGlobalRowCopy (globalRow, indices, numIndices);
276 } else {
277 overlappingGraph_->getGlobalRowCopy (globalRow, indices, numIndices);
278 }
279 }
280}
281
282
283template<class GraphType>
284void
286getLocalRowCopy (local_ordinal_type localRow,
287 nonconst_local_inds_host_view_type& indices,
288 size_t& numIndices) const
289{
290 using Teuchos::as;
291 const size_t numMyRowsA = nonoverlappingGraph_->getLocalNumRows ();
292 if (as<size_t> (localRow) < numMyRowsA) {
293 nonoverlappingGraph_->getLocalRowCopy (localRow, indices, numIndices);
294 } else {
295 const local_ordinal_type localRowOffset =
296 localRow - as<local_ordinal_type> (numMyRowsA);
297 overlappingGraph_->getLocalRowCopy (localRowOffset, indices, numIndices);
298 }
299}
300
301
302template<class GraphType>
303void
305getGlobalRowView (global_ordinal_type GlobalRow,
306 global_inds_host_view_type &indices) const {
307 const local_ordinal_type LocalRow = rowMap_->getLocalElement (GlobalRow);
308 if (LocalRow == Teuchos::OrdinalTraits<local_ordinal_type>::invalid()) {
309 indices = global_inds_host_view_type();
310 } else {
311 if (Teuchos::as<size_t> (LocalRow) < nonoverlappingGraph_->getLocalNumRows ()) {
312 nonoverlappingGraph_->getGlobalRowView (GlobalRow, indices);
313 } else {
314 overlappingGraph_->getGlobalRowView (GlobalRow, indices);
315 }
316 }
317}
318
319
320template<class GraphType>
321void
323 getLocalRowView (local_ordinal_type LocalRow,
324 local_inds_host_view_type & indices) const {
325 using Teuchos::as;
326 const size_t numMyRowsA = nonoverlappingGraph_->getLocalNumRows ();
327 if (as<size_t> (LocalRow) < numMyRowsA) {
328 nonoverlappingGraph_->getLocalRowView (LocalRow, indices);
329 } else {
330 overlappingGraph_->getLocalRowView (LocalRow - as<local_ordinal_type> (numMyRowsA),
331 indices);
332 }
333
334}
335
336
337} // namespace Details
338} // namespace Ifpack2
339
340#define IFPACK2_DETAILS_OVERLAPPINGROWGRAPH_INSTANT(LO,GO,N) \
341 template class Ifpack2::Details::OverlappingRowGraph<Tpetra::CrsGraph< LO, GO, N > >; \
342 template class Ifpack2::Details::OverlappingRowGraph<Tpetra::RowGraph< LO, GO, N > >;
343
344#endif // IFPACK2_OVERLAPPINGROWGRAPH_DEF_HPP
virtual size_t getLocalMaxNumRowEntries() const
The maximum number of entries in any row on the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:230
virtual Teuchos::RCP< const map_type > getRangeMap() const
The Map that describes the range of this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:119
virtual bool isLocallyIndexed() const
Whether this graph is locally indexed.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:244
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_Details_OverlappingRowGraph_def.hpp:210
virtual bool isGloballyIndexed() const
Whether this graph is globally indexed.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:251
virtual global_size_t getGlobalNumEntries() const
The global number of entries in this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:179
virtual size_t getGlobalMaxNumRowEntries() const
The maximum number of entries in any row on any process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:223
virtual void getGlobalRowCopy(global_ordinal_type globalRow, nonconst_global_inds_host_view_type &gblColInds, size_t &numIndices) const
Copy out a list of column indices in the given global row that are owned by the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:266
virtual void getLocalRowView(const local_ordinal_type lclRow, local_inds_host_view_type &lclColInds) const
Get a constant, nonpersisting, locally indexed view of the given row of the graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:323
virtual bool isFillComplete() const
true if fillComplete() has been called, else false.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:258
virtual bool hasColMap() const
Whether this graph has a column Map.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:237
virtual Teuchos::RCP< const map_type > getRowMap() const
The Map that describes the distribution of rows over processes.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:95
virtual Teuchos::RCP< const import_type > getImporter() const
Import object (from domain Map to column Map).
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:127
virtual global_size_t getGlobalNumRows() const
The global number of rows in this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:142
virtual Teuchos::RCP< const map_type > getColMap() const
The Map that describes the distribution of columns over processes.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:103
virtual size_t getLocalNumEntries() const
The number of entries in this graph owned by the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:186
virtual size_t getLocalNumCols() const
The number of columns owned by the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:164
virtual global_size_t getGlobalNumCols() const
The global number of columns in this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:149
virtual size_t getLocalNumRows() const
The number of rows owned by the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:156
virtual void getGlobalRowView(const global_ordinal_type gblRow, global_inds_host_view_type &gblColInds) const
Get a const, non-persisting view of the given global row's global column indices, as a Teuchos::Array...
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:305
virtual Teuchos::RCP< const map_type > getDomainMap() const
The Map that describes the domain of this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:111
virtual ~OverlappingRowGraph()
Destructor.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:80
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the graph is distributed.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:85
virtual Teuchos::RCP< const export_type > getExporter() const
Export object (from row Map to range Map).
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:135
virtual global_ordinal_type getIndexBase() const
The index base for global indices for this graph.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:172
OverlappingRowGraph(const Teuchos::RCP< const row_graph_type > &nonoverlappingGraph, const Teuchos::RCP< const row_graph_type > &overlappingGraph, const Teuchos::RCP< const map_type > &rowMap, const Teuchos::RCP< const map_type > &colMap, const Tpetra::global_size_t numGlobalRows, const Tpetra::global_size_t numGlobalCols, const Tpetra::global_size_t numGlobalNonzeros, const size_t maxNumEntries, const Teuchos::RCP< const import_type > &nonoverlappingImporter, const Teuchos::RCP< const import_type > &overlappingImporter)
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:56
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_Details_OverlappingRowGraph_def.hpp:196
virtual void getLocalRowCopy(local_ordinal_type localRow, nonconst_local_inds_host_view_type &gblColInds, size_t &numIndices) const
Copy out a list of local column indices in the given local row that are owned by the calling process.
Definition Ifpack2_Details_OverlappingRowGraph_def.hpp:286
Ifpack2 implementation details.
Preconditioners and smoothers for Tpetra sparse matrices.
Definition Ifpack2_AdditiveSchwarz_decl.hpp:74