42 #ifndef TPETRA_FECRSGRAPH_DEF_HPP
43 #define TPETRA_FECRSGRAPH_DEF_HPP
45 #include "Tpetra_CrsGraph.hpp"
49 #include <type_traits>
54 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
56 FECrsGraph(
const Teuchos::RCP<const map_type> & ownedRowMap,
57 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
58 const size_t maxNumEntriesPerRow,
59 const Teuchos::RCP<const import_type> & ownedPlusSharedToOwnedimporter,
60 const Teuchos::RCP<const map_type> & domainMap,
61 const Teuchos::RCP<const map_type> & ownedRangeMap,
62 const Teuchos::RCP<Teuchos::ParameterList>& params):
63 FECrsGraph(ownedRowMap,ownedPlusSharedRowMap,maxNumEntriesPerRow,
64 domainMap.is_null() ? ownedRowMap : domainMap,
65 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 size_t maxNumEntriesPerRow,
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):
81 crs_graph_type(ownedPlusSharedRowMap, maxNumEntriesPerRow, params),
82 ownedRowsImporter_(ownedPlusSharedToOwnedimporter),
83 ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap),
84 ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap)
86 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
87 Teuchos::RCP<const map_type> dummy;
88 setup(ownedRowMap,ownedPlusSharedRowMap,dummy,params);
91 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
93 FECrsGraph (
const Teuchos::RCP<const map_type> & ownedRowMap,
94 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
95 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
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,numEntPerRow,
101 domainMap.is_null() ? ownedRowMap : domainMap,
102 ownedPlusSharedToOwnedimporter,domainMap,ownedRangeMap,params)
107 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
109 FECrsGraph (
const Teuchos::RCP<const map_type> & ownedRowMap,
110 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
111 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
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):
118 ownedRowsImporter_(ownedPlusSharedToOwnedimporter),
119 ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap),
120 ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap)
122 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
123 Teuchos::RCP<const map_type> dummy;
124 setup(ownedRowMap,ownedPlusSharedRowMap,dummy,params);
127 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
130 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
131 const Teuchos::RCP<const map_type> & ownedPlusSharedColMap,
132 const size_t maxNumEntriesPerRow,
133 const Teuchos::RCP<const import_type> & ownedPlusSharedToOwnedimporter,
134 const Teuchos::RCP<const map_type> & domainMap,
135 const Teuchos::RCP<const map_type> & ownedRangeMap,
136 const Teuchos::RCP<Teuchos::ParameterList>& params):
137 FECrsGraph(ownedRowMap,ownedPlusSharedRowMap,ownedPlusSharedColMap,maxNumEntriesPerRow,
138 domainMap.is_null() ? ownedRowMap : domainMap,
139 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params)
144 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
147 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
148 const Teuchos::RCP<const map_type> & ownedPlusSharedColMap,
149 const size_t maxNumEntriesPerRow,
150 const Teuchos::RCP<const map_type> & ownedPlusSharedDomainMap,
151 const Teuchos::RCP<const import_type> & ownedPlusSharedToOwnedimporter,
152 const Teuchos::RCP<const map_type> & ownedDomainMap,
153 const Teuchos::RCP<const map_type> & ownedRangeMap,
154 const Teuchos::RCP<Teuchos::ParameterList>& params):
155 crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap,maxNumEntriesPerRow, params),
156 ownedRowsImporter_(ownedPlusSharedToOwnedimporter),
157 ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap),
158 ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap)
160 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
161 setup(ownedRowMap,ownedPlusSharedRowMap, ownedPlusSharedColMap,params);
164 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
166 FECrsGraph (
const Teuchos::RCP<const map_type> & ownedRowMap,
167 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
168 const Teuchos::RCP<const map_type> & ownedPlusSharedColMap,
169 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
170 const Teuchos::RCP<const import_type> & ownedPlusSharedToOwnedimporter,
171 const Teuchos::RCP<const map_type> & domainMap,
172 const Teuchos::RCP<const map_type> & ownedRangeMap,
173 const Teuchos::RCP<Teuchos::ParameterList>& params):
174 FECrsGraph(ownedRowMap,ownedPlusSharedRowMap,ownedPlusSharedColMap,numEntPerRow,
175 domainMap.is_null() ? ownedRowMap : domainMap,
176 ownedPlusSharedToOwnedimporter, domainMap, ownedRangeMap, params)
181 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
183 FECrsGraph (
const Teuchos::RCP<const map_type> & ownedRowMap,
184 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
185 const Teuchos::RCP<const map_type> & ownedPlusSharedColMap,
186 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
187 const Teuchos::RCP<const map_type> & ownedPlusSharedDomainMap,
188 const Teuchos::RCP<const import_type> & ownedPlusSharedToOwnedimporter,
189 const Teuchos::RCP<const map_type> & ownedDomainMap,
190 const Teuchos::RCP<const map_type> & ownedRangeMap,
191 const Teuchos::RCP<Teuchos::ParameterList>& params):
192 crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap, numEntPerRow, params),
193 ownedRowsImporter_(ownedPlusSharedToOwnedimporter),
194 ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap),
195 ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap)
197 this->
domainMap_ = ownedPlusSharedDomainMap.is_null() ? ownedPlusSharedRowMap : ownedPlusSharedDomainMap;
198 setup(ownedRowMap,ownedPlusSharedRowMap, ownedPlusSharedColMap,params);
201 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
203 setup(
const Teuchos::RCP<const map_type> & ownedRowMap,
204 const Teuchos::RCP<const map_type> & ownedPlusSharedRowMap,
205 const Teuchos::RCP<const map_type> & ownedPlusSharedColMap,
206 const Teuchos::RCP<Teuchos::ParameterList>& params)
208 const char tfecfFuncName[] =
"FECrsGraph::setup(): ";
210 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedRowMap.is_null (), std::runtime_error,
"ownedRowMap is null.");
211 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(ownedPlusSharedRowMap.is_null (), std::runtime_error,
"ownedPlusSharedRowMap is null.");
214 if(ownedPlusSharedColMap.is_null()) this->allocateIndices(GlobalIndices);
215 else this->allocateIndices(LocalIndices);
217 activeCrsGraph_ = Teuchos::rcp(
new FEWhichActive(FE_ACTIVE_OWNED_PLUS_SHARED));
218 fillState_ = Teuchos::rcp(
new FillState(FillState::closed));
221 bool maps_are_the_same = ownedRowMap->isSameAs(*ownedPlusSharedRowMap);
222 if(!maps_are_the_same) {
224 if(ownedRowsImporter_.is_null()) {
225 ownedRowsImporter_ = Teuchos::rcp(
new import_type(ownedRowMap,ownedPlusSharedRowMap));
228 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!ownedRowMap->isSameAs(*ownedRowsImporter_->getSourceMap()), std::runtime_error,
"ownedRowMap does not match importer source map.");
229 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!ownedPlusSharedRowMap->isSameAs(*ownedRowsImporter_->getTargetMap()), std::runtime_error,
"ownedPlusSharedRowMap does not match importer target map.");
233 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( ownedRowsImporter_->getNumSameIDs() != ownedRowsImporter_->getSourceMap()->getLocalNumElements(),
234 std::runtime_error,
"ownedRowMap contains entries which are not in the ownedPlusSharedRowMap.");
236 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( ownedRowMap->getLocalNumElements() > ownedPlusSharedRowMap->getLocalNumElements(),
237 std::runtime_error,
"ownedRowMap more entries than the ownedPlusSharedRowMap.");
242 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( !ownedPlusSharedRowMap->isLocallyFitted(*ownedRowMap),
243 std::runtime_error,
"ownedPlusSharedRowMap must be locally fitted to the ownedRowMap");
249 ownedRowsImporter_ = Teuchos::null;
253 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
254 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::doOwnedPlusSharedToOwned(
const CombineMode CM) {
255 const char tfecfFuncName[] =
"FECrsGraph::doOwnedPlusSharedToOwned(CombineMode): ";
256 if(!ownedRowsImporter_.is_null() && *activeCrsGraph_ == FE_ACTIVE_OWNED_PLUS_SHARED) {
257 Teuchos::RCP<const map_type> ownedRowMap = ownedRowsImporter_->getSourceMap();
260 this->doExport(*
this,*ownedRowsImporter_,CM,
true);
264 if(!this->hasColMap()) {
265 Teuchos::Array<int> remotePIDs (0);
270 crs_graph_type::fillComplete(this->domainMap_,this->getRowMap());
277 const bool checkColGIDsInAtLeastOneOwnedRow =
278 this->getMyNonconstParamList().is_null() ?
true :
279 this->getMyNonconstParamList()->get(
"Check Col GIDs In At Least One Owned Row",
true);
280 if (debug && checkColGIDsInAtLeastOneOwnedRow) {
281 Teuchos::RCP<const map_type> colmap = this->getColMap();
282 Teuchos::Array<bool> flag(colmap->getLocalNumElements(),
false);
283 typename crs_graph_type::nonconst_local_inds_host_view_type indices(
"indices",this->getLocalMaxNumRowEntries());
285 for(
size_t i=0; i<ownedRowMap->getLocalNumElements(); i++) {
287 this->getLocalRowCopy(i,indices,NumEntries);
288 for(
size_t j=0; j<NumEntries; j++)
289 flag[indices[j]] =
true;
293 for(
size_t i=0; i<(size_t)flag.size(); i++)
299 int gblCount = lclCount;
300 auto comm = this->getComm();
301 if (!comm.is_null()) {
302 Teuchos::reduceAll<int,int>(*comm, Teuchos::REDUCE_SUM, 1, &lclCount, &gblCount);
304 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
306 std::invalid_argument,
"if you own an element (in the finite element sense) you "
307 "must also own one of the attached nodes. This assumption has been violated in "
308 "your matrix fill on at least one MPI rank:\n"
309 " locally, there are " + std::to_string(lclCount) +
" col gids not connected to any owned gid.\n"
310 " globally, there are " + std::to_string(gblCount) +
" col gids not connected to any owned gid.\n"
311 "NOTE: you can disable this check by setting a parameter list with the option\n"
312 " 'Check Col GIDs In At Least One Owned Row' set to false.\n"
313 "NOTE: the parameter list must be set AFTER construction, since it would not be recognized as valid"
314 "by the base class CrsGraph.\n");
318 inactiveCrsGraph_ = Teuchos::rcp(
new crs_graph_type(*
this, ownedRowMap));
319 inactiveCrsGraph_->fillComplete(ownedDomainMap_,ownedRangeMap_);
324 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
325 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::doOwnedToOwnedPlusShared(
const CombineMode ) {
329 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
331 if(*activeCrsGraph_ == FE_ACTIVE_OWNED_PLUS_SHARED)
332 *activeCrsGraph_ = FE_ACTIVE_OWNED;
334 *activeCrsGraph_ = FE_ACTIVE_OWNED_PLUS_SHARED;
336 if(inactiveCrsGraph_.is_null())
return;
338 this->swap(*inactiveCrsGraph_);
343 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
345 const Teuchos::RCP<const map_type>& domainMap,
346 const Teuchos::RCP<const map_type>& rangeMap)
367 const char tfecfFuncName[] =
"FECrsGraph::endFill(domainMap, rangeMap): ";
368 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(*activeCrsGraph_ != FE_ACTIVE_OWNED_PLUS_SHARED,std::runtime_error,
"must be in owned+shared mode.");
369 if(ownedRowsImporter_.is_null()) {
371 switchActiveCrsGraph();
372 crs_graph_type::fillComplete(domainMap, rangeMap);
382 switchActiveCrsGraph();
388 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
389 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::endFill() {
390 this->endFill(ownedDomainMap_, ownedRangeMap_);
394 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
395 void FECrsGraph<LocalOrdinal, GlobalOrdinal, Node>::beginFill() {
396 const char tfecfFuncName[] =
"FECrsGraph::beginFill(): ";
400 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(*activeCrsGraph_ == FE_ACTIVE_OWNED,std::runtime_error,
"can only be called once.");
404 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
406 const char tfecfFuncName[] =
"FECrsGraph::beginAssembly: ";
407 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
408 *fillState_ != FillState::closed,
410 "Cannot beginAssembly, matrix is not in a closed state"
412 *fillState_ = FillState::open;
416 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
418 const char tfecfFuncName[] =
"FECrsGraph::endAssembly: ";
419 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
420 *fillState_ != FillState::open,
422 "Cannot endAssembly, matrix is not open to fill but is closed."
424 *fillState_ = FillState::closed;
428 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
430 const Teuchos::RCP<const map_type>& domainMap,
431 const Teuchos::RCP<const map_type>& rangeMap)
433 const char tfecfFuncName[] =
"FECrsGraph::endAssembly: ";
434 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
435 *fillState_ != FillState::open,
437 "Cannot endAssembly, matrix is not open to fill but is closed."
439 *fillState_ = FillState::closed;
440 this->endFill(domainMap, rangeMap);
443 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
444 Teuchos::RCP<const Teuchos::ParameterList>
447 auto valid_pl = Teuchos::rcp(
new Teuchos::ParameterList(
"Tpetra::FECrsGraph"));
448 valid_pl->validateParametersAndSetDefaults(*crs_graph_type::getValidParameters());
449 valid_pl->set(
"Check Col GIDs In At Least One Owned Row",
true);
454 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
459 const size_t numInputInds
461 const char tfecfFuncName[] =
"FECrsGraph::insertGlobalIndices: ";
462 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
463 *fillState_ != FillState::open,
465 "Cannot replace global values, matrix is not open to fill but is closed."
467 return crs_graph_type::insertGlobalIndicesImpl(lclRow, inputGblColInds, numInputInds);
470 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
475 const size_t numInputInds,
476 std::function<
void(
const size_t,
const size_t,
const size_t)> fun
478 const char tfecfFuncName[] =
"FECrsGraph::insertGlobalIndices: ";
479 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
480 *fillState_ != FillState::open,
482 "Cannot replace global values, matrix is not open to fill but is closed."
484 return crs_graph_type::insertGlobalIndicesImpl(rowInfo, inputGblColInds, numInputInds, fun);
487 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
490 const local_ordinal_type lclRow,
491 const Teuchos::ArrayView<const local_ordinal_type>& gblColInds,
492 std::function<
void(
const size_t,
const size_t,
const size_t)> fun
494 const char tfecfFuncName[] =
"FECrsGraph::insertLocalIndices: ";
495 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
496 *fillState_ != FillState::open,
498 "Cannot replace global values, matrix is not open to fill but is closed."
500 return crs_graph_type::insertLocalIndicesImpl(lclRow, gblColInds, fun);
511 #define TPETRA_FECRSGRAPH_INSTANT(LO,GO,NODE) \
512 template class FECrsGraph<LO, GO, NODE>;
516 #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...
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.
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.
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.