10 #ifndef TPETRA_FECRSGRAPH_DEF_HPP
11 #define TPETRA_FECRSGRAPH_DEF_HPP
13 #include "Tpetra_CrsGraph.hpp"
17 #include <type_traits>
22 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
24 FECrsGraph(
const Teuchos::RCP<const map_type>& ownedRowMap,
25 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
26 const size_t maxNumEntriesPerRow,
27 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
28 const Teuchos::RCP<const map_type>& domainMap,
29 const Teuchos::RCP<const map_type>& ownedRangeMap,
30 const Teuchos::RCP<Teuchos::ParameterList>& params)
31 :
FECrsGraph(ownedRowMap, ownedPlusSharedRowMap, maxNumEntriesPerRow,
32 domainMap.is_null() ? ownedRowMap : domainMap,
33 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params) {
37 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
39 FECrsGraph(
const Teuchos::RCP<const map_type>& ownedRowMap,
40 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
41 const size_t maxNumEntriesPerRow,
42 const Teuchos::RCP<const map_type>& ownedPlusSharedDomainMap,
43 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
44 const Teuchos::RCP<const map_type>& ownedDomainMap,
45 const Teuchos::RCP<const map_type>& ownedRangeMap,
46 const Teuchos::RCP<Teuchos::ParameterList>& params)
47 :
crs_graph_type(ownedPlusSharedRowMap, maxNumEntriesPerRow, params)
48 , ownedRowsImporter_(ownedPlusSharedToOwnedimporter)
49 , ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap)
50 , ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) {
51 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
52 Teuchos::RCP<const map_type> dummy;
53 setup(ownedRowMap, ownedPlusSharedRowMap, dummy, params);
56 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
58 FECrsGraph(
const Teuchos::RCP<const map_type>& ownedRowMap,
59 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
60 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
61 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
62 const Teuchos::RCP<const map_type>& domainMap,
63 const Teuchos::RCP<const map_type>& ownedRangeMap,
64 const Teuchos::RCP<Teuchos::ParameterList>& params)
65 :
FECrsGraph(ownedRowMap, ownedPlusSharedRowMap, numEntPerRow,
66 domainMap.is_null() ? ownedRowMap : domainMap,
67 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params) {
71 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
73 FECrsGraph(
const Teuchos::RCP<const map_type>& ownedRowMap,
74 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
75 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
76 const Teuchos::RCP<const map_type>& ownedPlusSharedDomainMap,
77 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
78 const Teuchos::RCP<const map_type>& ownedDomainMap,
79 const Teuchos::RCP<const map_type>& ownedRangeMap,
80 const Teuchos::RCP<Teuchos::ParameterList>& params)
82 , ownedRowsImporter_(ownedPlusSharedToOwnedimporter)
83 , ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap)
84 , ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) {
85 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
86 Teuchos::RCP<const map_type> dummy;
87 setup(ownedRowMap, ownedPlusSharedRowMap, dummy, params);
90 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 FECrsGraph(
const Teuchos::RCP<const map_type>& ownedRowMap,
93 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
94 const Teuchos::RCP<const map_type>& ownedPlusSharedColMap,
95 const size_t maxNumEntriesPerRow,
96 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
97 const Teuchos::RCP<const map_type>& domainMap,
98 const Teuchos::RCP<const map_type>& ownedRangeMap,
99 const Teuchos::RCP<Teuchos::ParameterList>& params)
100 :
FECrsGraph(ownedRowMap, ownedPlusSharedRowMap, ownedPlusSharedColMap, maxNumEntriesPerRow,
101 domainMap.is_null() ? ownedRowMap : domainMap,
102 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params) {
106 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
109 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
110 const Teuchos::RCP<const map_type>& ownedPlusSharedColMap,
111 const size_t maxNumEntriesPerRow,
112 const Teuchos::RCP<const map_type>& ownedPlusSharedDomainMap,
113 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
114 const Teuchos::RCP<const map_type>& ownedDomainMap,
115 const Teuchos::RCP<const map_type>& ownedRangeMap,
116 const Teuchos::RCP<Teuchos::ParameterList>& params)
117 :
crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap, maxNumEntriesPerRow, params)
118 , ownedRowsImporter_(ownedPlusSharedToOwnedimporter)
119 , ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap)
120 , ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) {
121 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
122 setup(ownedRowMap, ownedPlusSharedRowMap, ownedPlusSharedColMap, params);
125 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
128 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
129 const Teuchos::RCP<const map_type>& ownedPlusSharedColMap,
130 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
131 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
132 const Teuchos::RCP<const map_type>& domainMap,
133 const Teuchos::RCP<const map_type>& ownedRangeMap,
134 const Teuchos::RCP<Teuchos::ParameterList>& params)
135 :
FECrsGraph(ownedRowMap, ownedPlusSharedRowMap, ownedPlusSharedColMap, numEntPerRow,
136 domainMap.is_null() ? ownedRowMap : domainMap,
137 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params) {
141 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
144 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
145 const Teuchos::RCP<const map_type>& ownedPlusSharedColMap,
146 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
147 const Teuchos::RCP<const map_type>& ownedPlusSharedDomainMap,
148 const Teuchos::RCP<const import_type>& ownedPlusSharedToOwnedimporter,
149 const Teuchos::RCP<const map_type>& ownedDomainMap,
150 const Teuchos::RCP<const map_type>& ownedRangeMap,
151 const Teuchos::RCP<Teuchos::ParameterList>& params)
152 :
crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap, numEntPerRow, params)
153 , ownedRowsImporter_(ownedPlusSharedToOwnedimporter)
154 , ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap)
155 , ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) {
156 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
157 setup(ownedRowMap, ownedPlusSharedRowMap, ownedPlusSharedColMap, params);
160 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
162 setup(
const Teuchos::RCP<const map_type>& ownedRowMap,
163 const Teuchos::RCP<const map_type>& ownedPlusSharedRowMap,
164 const Teuchos::RCP<const map_type>& ownedPlusSharedColMap,
165 const Teuchos::RCP<Teuchos::ParameterList>& params) {
166 const char tfecfFuncName[] =
"FECrsGraph::setup(): ";
168 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedRowMap.is_null(), std::runtime_error,
"ownedRowMap is null.");
169 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedPlusSharedRowMap.is_null(), std::runtime_error,
"ownedPlusSharedRowMap is null.");
172 if (ownedPlusSharedColMap.is_null())
173 this->allocateIndices(GlobalIndices);
175 this->allocateIndices(LocalIndices);
177 activeCrsGraph_ = Teuchos::rcp(
new FE::WhichActive(FE::ACTIVE_OWNED_PLUS_SHARED));
178 fillState_ = Teuchos::rcp(
new FE::FillState(FE::FillState::closed));
181 bool maps_are_the_same = ownedRowMap->isSameAs(*ownedPlusSharedRowMap);
182 if (!maps_are_the_same) {
184 if (ownedRowsImporter_.is_null()) {
185 ownedRowsImporter_ = Teuchos::rcp(
new import_type(ownedRowMap, ownedPlusSharedRowMap));
187 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!ownedRowMap->isSameAs(*ownedRowsImporter_->getSourceMap()), std::runtime_error,
"ownedRowMap does not match importer source map.");
188 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!ownedPlusSharedRowMap->isSameAs(*ownedRowsImporter_->getTargetMap()), std::runtime_error,
"ownedPlusSharedRowMap does not match importer target map.");
192 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedRowsImporter_->getNumSameIDs() != ownedRowsImporter_->getSourceMap()->getLocalNumElements(),
193 std::runtime_error,
"ownedRowMap contains entries which are not in the ownedPlusSharedRowMap.");
195 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedRowMap->getLocalNumElements() > ownedPlusSharedRowMap->getLocalNumElements(),
196 std::runtime_error,
"ownedRowMap more entries than the ownedPlusSharedRowMap.");
201 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!ownedPlusSharedRowMap->isLocallyFitted(*ownedRowMap),
202 std::runtime_error,
"ownedPlusSharedRowMap must be locally fitted to the ownedRowMap");
207 ownedRowsImporter_ = Teuchos::null;
211 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
212 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::doOwnedPlusSharedToOwned(
const CombineMode CM) {
213 const char tfecfFuncName[] =
"FECrsGraph::doOwnedPlusSharedToOwned(CombineMode): ";
214 if (!ownedRowsImporter_.is_null() && *activeCrsGraph_ == FE::ACTIVE_OWNED_PLUS_SHARED) {
215 Teuchos::RCP<const map_type> ownedRowMap = ownedRowsImporter_->getSourceMap();
218 this->doExport(*
this, *ownedRowsImporter_, CM,
true);
222 if (!this->hasColMap()) {
223 Teuchos::Array<int> remotePIDs(0);
228 crs_graph_type::fillComplete(this->domainMap_, this->getRowMap());
235 const bool checkColGIDsInAtLeastOneOwnedRow =
236 this->getMyNonconstParamList().is_null() ?
true : this->getMyNonconstParamList()->get(
"Check Col GIDs In At Least One Owned Row",
true);
237 if (debug && checkColGIDsInAtLeastOneOwnedRow) {
238 Teuchos::RCP<const map_type> colmap = this->getColMap();
239 Teuchos::Array<bool> flag(colmap->getLocalNumElements(),
false);
240 typename crs_graph_type::nonconst_local_inds_host_view_type indices(
"indices", this->getLocalMaxNumRowEntries());
242 for (
size_t i = 0; i < ownedRowMap->getLocalNumElements(); i++) {
243 size_t NumEntries = 0;
244 this->getLocalRowCopy(i, indices, NumEntries);
245 for (
size_t j = 0; j < NumEntries; j++)
246 flag[indices[j]] =
true;
250 for (
size_t i = 0; i < (size_t)flag.size(); i++)
256 int gblCount = lclCount;
257 auto comm = this->getComm();
258 if (!comm.is_null()) {
259 Teuchos::reduceAll<int, int>(*comm, Teuchos::REDUCE_SUM, 1, &lclCount, &gblCount);
261 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(gblCount > 0,
262 std::invalid_argument,
263 "if you own an element (in the finite element sense) you "
264 "must also own one of the attached nodes. This assumption has been violated in "
265 "your matrix fill on at least one MPI rank:\n"
266 " locally, there are " +
267 std::to_string(lclCount) +
268 " col gids not connected to any owned gid.\n"
269 " globally, there are " +
270 std::to_string(gblCount) +
271 " col gids not connected to any owned gid.\n"
272 "NOTE: you can disable this check by setting a parameter list with the option\n"
273 " 'Check Col GIDs In At Least One Owned Row' set to false.\n"
274 "NOTE: the parameter list must be set AFTER construction, since it would not be recognized as valid"
275 "by the base class CrsGraph.\n");
279 inactiveCrsGraph_ = Teuchos::rcp(
new crs_graph_type(*
this, ownedRowMap));
280 inactiveCrsGraph_->fillComplete(ownedDomainMap_, ownedRangeMap_);
284 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
285 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::doOwnedToOwnedPlusShared(
const CombineMode ) {
289 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
291 if (*activeCrsGraph_ == FE::ACTIVE_OWNED_PLUS_SHARED)
292 *activeCrsGraph_ = FE::ACTIVE_OWNED;
294 *activeCrsGraph_ = FE::ACTIVE_OWNED_PLUS_SHARED;
296 if (inactiveCrsGraph_.is_null())
return;
298 this->swap(*inactiveCrsGraph_);
302 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
304 const Teuchos::RCP<const map_type>& domainMap,
305 const Teuchos::RCP<const map_type>& rangeMap) {
325 const char tfecfFuncName[] =
"FECrsGraph::endFill(domainMap, rangeMap): ";
326 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(*activeCrsGraph_ != FE::ACTIVE_OWNED_PLUS_SHARED, std::runtime_error,
"must be in owned+shared mode.");
327 if (ownedRowsImporter_.is_null()) {
329 switchActiveCrsGraph();
330 crs_graph_type::fillComplete(domainMap, rangeMap);
339 switchActiveCrsGraph();
343 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
344 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::endFill() {
345 this->endFill(ownedDomainMap_, ownedRangeMap_);
348 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
349 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::beginFill() {
350 const char tfecfFuncName[] =
"FECrsGraph::beginFill(): ";
354 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(*activeCrsGraph_ == FE::ACTIVE_OWNED, std::runtime_error,
"can only be called once.");
357 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
359 const char tfecfFuncName[] =
"FECrsGraph::beginAssembly: ";
360 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
361 *fillState_ != FE::FillState::closed,
363 "Cannot beginAssembly, matrix is not in a closed state");
364 *fillState_ = FE::FillState::open;
368 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
370 const char tfecfFuncName[] =
"FECrsGraph::endAssembly: ";
371 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
372 *fillState_ != FE::FillState::open,
374 "Cannot endAssembly, matrix is not open to fill but is closed.");
375 *fillState_ = FE::FillState::closed;
379 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
381 const Teuchos::RCP<const map_type>& domainMap,
382 const Teuchos::RCP<const map_type>& rangeMap) {
383 const char tfecfFuncName[] =
"FECrsGraph::endAssembly: ";
384 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
385 *fillState_ != FE::FillState::open,
387 "Cannot endAssembly, matrix is not open to fill but is closed.");
388 *fillState_ = FE::FillState::closed;
389 this->endFill(domainMap, rangeMap);
392 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
393 Teuchos::RCP<const Teuchos::ParameterList>
395 auto valid_pl = Teuchos::rcp(
new Teuchos::ParameterList(
"Tpetra::FECrsGraph"));
396 valid_pl->validateParametersAndSetDefaults(*crs_graph_type::getValidParameters());
397 valid_pl->set(
"Check Col GIDs In At Least One Owned Row",
true);
402 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
407 const size_t numInputInds) {
408 const char tfecfFuncName[] =
"FECrsGraph::insertGlobalIndices: ";
409 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
410 *fillState_ != FE::FillState::open,
412 "Cannot replace global values, matrix is not open to fill but is closed.");
413 return crs_graph_type::insertGlobalIndicesImpl(lclRow, inputGblColInds, numInputInds);
416 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
421 const size_t numInputInds,
422 std::function<
void(
const size_t,
const size_t,
const size_t)> fun) {
423 const char tfecfFuncName[] =
"FECrsGraph::insertGlobalIndices: ";
424 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
425 *fillState_ != FE::FillState::open,
427 "Cannot replace global values, matrix is not open to fill but is closed.");
428 return crs_graph_type::insertGlobalIndicesImpl(rowInfo, inputGblColInds, numInputInds, fun);
431 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
433 const local_ordinal_type lclRow,
434 const Teuchos::ArrayView<const local_ordinal_type>& gblColInds,
435 std::function<
void(
const size_t,
const size_t,
const size_t)> fun) {
436 const char tfecfFuncName[] =
"FECrsGraph::insertLocalIndices: ";
437 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
438 *fillState_ != FE::FillState::open,
440 "Cannot replace global values, matrix is not open to fill but is closed.");
441 return crs_graph_type::insertLocalIndicesImpl(lclRow, gblColInds, fun);
451 #define TPETRA_FECRSGRAPH_INSTANT(LO, GO, NODE) \
452 template class FECrsGraph<LO, GO, NODE>;
454 #endif // TPETRA_FECRSGRAPH_DEF
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
GlobalOrdinal global_ordinal_type
The type of the graph's global indices.
void endAssembly()
Migrates data to the owned mode.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Default parameter list suitable for validation.
FECrsGraph(const Teuchos::RCP< const map_type > &ownedRowMap, const Teuchos::RCP< const map_type > &ownedPlusSharedRowMap, const size_t maxNumEntriesPerRow, const Teuchos::RCP< const import_type > &ownedPlusSharedToOwnedimporter=Teuchos::null, const Teuchos::RCP< const map_type > &domainMap=Teuchos::null, const Teuchos::RCP< const map_type > &ownedRangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructorfor globally-indexed assembly specifying a single upper bound for the number of entries in...
int makeColMap(Teuchos::RCP< const Tpetra::Map< LO, GO, NT >> &colMap, Teuchos::Array< int > &remotePIDs, const Teuchos::RCP< const Tpetra::Map< LO, GO, NT >> &domMap, const RowGraph< LO, GO, NT > &graph, const bool sortEachProcsGids=true, std::ostream *errStrm=NULL)
Make the graph's column Map.
static bool debug()
Whether Tpetra is in debug mode.
Allocation information for a locally owned row in a CrsGraph or CrsMatrix.
Teuchos::RCP< const map_type > domainMap_
The Map describing the domain of the (matrix corresponding to the) graph.
CombineMode
Rule for combining data in an Import or Export.
LocalOrdinal local_ordinal_type
The type of the graph's local indices.
size_t insertGlobalIndicesImpl(const local_ordinal_type lclRow, const global_ordinal_type inputGblColInds[], const size_t numInputInds)
Insert global indices, using an input local row index.
void switchActiveCrsGraph()
Switches which CrsGraph is active (without migrating data)
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
void beginAssembly()
Activates the owned+shared mode for assembly.
Declaration and definition of Tpetra::Details::getEntryOnHost.
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.