10 #ifndef MUELU_AGGREGATIONSTRUCTUREDALGORITHM_DEF_HPP_
11 #define MUELU_AGGREGATIONSTRUCTUREDALGORITHM_DEF_HPP_
13 #include <Teuchos_Comm.hpp>
14 #include <Teuchos_CommHelpers.hpp>
16 #include <Xpetra_MapFactory.hpp>
17 #include <Xpetra_Map.hpp>
23 #include "MueLu_LWGraph.hpp"
24 #include "MueLu_LWGraph_kokkos.hpp"
25 #include "MueLu_Aggregates.hpp"
26 #include "MueLu_IndexManager.hpp"
29 #include "MueLu_IndexManager_kokkos.hpp"
33 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
38 LO& numNonAggregatedNodes)
const {
39 Monitor m(*
this,
"BuildAggregates");
42 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
43 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
58 *out <<
"Extract data for ghosted nodes" << std::endl;
60 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
64 LO ghostedCoarseNodeCoarseLID, aggId;
65 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
70 for (
int dim = 0; dim < 3; ++dim) {
81 if (rem > (rate / 2)) {
91 ghostedCoarseNodeCoarseLID);
93 aggId = ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID];
94 vertex2AggId[nodeIdx] = aggId;
95 procWinner[nodeIdx] = ghostedCoarseNodeCoarsePIDs[ghostedCoarseNodeCoarseLID];
97 --numNonAggregatedNodes;
102 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
107 Monitor m(*
this,
"BuildGraphP");
110 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
111 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
120 int numInterpolationPoints = 0;
122 numInterpolationPoints = 1;
127 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
136 *out <<
"Compute prolongatorGraph data" << std::endl;
138 ComputeGraphDataConstant(graph, geoData, dofsPerNode, numInterpolationPoints,
139 nnzOnRow, rowPtr, colIndex);
141 ComputeGraphDataLinear(graph, geoData, dofsPerNode, numInterpolationPoints,
142 nnzOnRow, rowPtr, colIndex);
148 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
150 *out <<
"Extract data for ghosted nodes" << std::endl;
155 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
161 ghostedCoarseNodeCoarseGIDs(),
165 LO coarseNodeIdx = 0;
166 Array<GO> coarseNodeCoarseGIDs, coarseNodeFineGIDs;
168 for (
LO nodeIdx = 0; nodeIdx < ghostedCoarseNodeCoarseGIDs.
size(); ++nodeIdx) {
169 if (ghostedCoarseNodeCoarsePIDs[nodeIdx] == colMap->getComm()->getRank()) {
170 coarseNodeCoarseGIDs[coarseNodeIdx] = ghostedCoarseNodeCoarseGIDs[nodeIdx];
174 domainMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
176 coarseNodeCoarseGIDs(),
179 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
181 coarseNodeCoarseGIDs(),
184 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
186 coarseNodeFineGIDs(),
202 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
207 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
209 coarseNodeFineGIDs(),
214 *out <<
"Call constructor of CrsGraph" << std::endl;
215 myGraph = CrsGraphFactory::Build(rowMap,
219 *out <<
"Fill CrsGraph" << std::endl;
222 for (
LO dof = 0; dof < dofsPerNode; ++dof) {
223 rowIdx = nodeIdx * dofsPerNode + dof;
224 myGraph->insertLocalIndices(rowIdx, colIndex(rowPtr[rowIdx], nnzOnRow[rowIdx]));
228 *out <<
"Call fillComplete on CrsGraph" << std::endl;
229 myGraph->fillComplete(domainMap, rowMap);
230 *out <<
"Prolongator CrsGraph computed" << std::endl;
234 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
237 const LO dofsPerNode,
const int ,
241 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
242 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
252 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
254 LO ghostedCoarseNodeCoarseLID, rem, rate;
260 for (
int dim = 0; dim < 3; ++dim) {
271 if (rem > (rate / 2)) {
281 ghostedCoarseNodeCoarseLID);
283 for (
LO dof = 0; dof < dofsPerNode; ++dof) {
284 nnzOnRow[nodeIdx * dofsPerNode + dof] = 1;
285 rowPtr[nodeIdx * dofsPerNode + dof + 1] = rowPtr[nodeIdx * dofsPerNode + dof] + 1;
286 colIndex[rowPtr[nodeIdx * dofsPerNode + dof]] =
287 ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID] * dofsPerNode + dof;
293 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
296 const LO dofsPerNode,
const int numInterpolationPoints,
300 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
301 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
312 const LO coarsePointOffset[8][3] = {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}, {0, 0, 1}, {1, 0, 1}, {0, 1, 1}, {1, 1, 1}};
317 for (
int dim = 0; dim < numDimensions; dim++) {
333 bool allCoarse =
true;
335 for (
int dim = 0; dim < numDimensions; ++dim) {
336 isCoarse[dim] =
false;
337 if (ijkRem[dim] == 0)
338 isCoarse[dim] =
true;
343 isCoarse[dim] =
true;
346 isCoarse[dim] =
true;
353 LO rowIdx = 0, colIdx = 0;
355 for (
LO dof = 0; dof < dofsPerNode; ++dof) {
356 rowIdx = nodeIdx * dofsPerNode + dof;
357 nnzOnRow[rowIdx] = 1;
358 rowPtr[rowIdx + 1] = rowPtr[rowIdx] + 1;
362 colIndex[rowPtr[rowIdx]] = colIdx * dofsPerNode + dof;
366 for (
int dim = 0; dim < numDimensions; ++dim) {
371 for (
LO dof = 0; dof < dofsPerNode; ++dof) {
373 rowIdx = nodeIdx * dofsPerNode + dof;
374 nnzOnRow[rowIdx] = Teuchos::as<size_t>(numInterpolationPoints);
375 rowPtr[rowIdx + 1] = rowPtr[rowIdx] + Teuchos::as<LO>(numInterpolationPoints);
377 for (
LO interpIdx = 0; interpIdx < numInterpolationPoints; ++interpIdx) {
379 coarseIdx[1] + coarsePointOffset[interpIdx][1],
380 coarseIdx[2] + coarsePointOffset[interpIdx][2],
382 colIndex[rowPtr[rowIdx] + interpIdx] = colIdx * dofsPerNode + dof;
389 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
394 LO& numNonAggregatedNodes)
const {
395 Monitor m(*
this,
"BuildAggregates");
398 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
399 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
411 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
412 LO numAggregatedNodes;
418 Kokkos::parallel_reduce(
"StructuredAggregation: fill aggregates data",
419 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
423 *out <<
"numCoarseNodes= " << numCoarseNodes
424 <<
", numAggregatedNodes= " << numAggregatedNodes << std::endl;
425 numNonAggregatedNodes = numNonAggregatedNodes - numAggregatedNodes;
429 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
433 Monitor m(*
this,
"BuildGraphP");
436 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
437 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
444 int numInterpolationPoints = 0;
446 numInterpolationPoints = 1;
451 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
455 const LO numNnzEntries = dofsPerNode * (numCoarseNodes + numInterpolationPoints * (numLocalFineNodes - numCoarseNodes));
458 entries_type colIndex(
"Prolongator graph, colIndices", numNnzEntries);
460 *out <<
"Compute prolongatorGraph data" << std::endl;
470 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
471 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
480 numInterpolationPoints,
485 Kokkos::parallel_scan(
"Structured Aggregation: compute rowPtr for prolongator graph",
486 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes + 1),
493 numInterpolationPoints,
500 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
501 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
509 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
517 myGraph = CrsGraphFactory::Build(myLocalGraph, graph.
GetDomainMap(), colMap,
522 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526 Kokkos::View<unsigned*, device_type> aggStat,
532 , vertex2AggID_(vertex2AggID)
533 , procWinner_(procWinner) {}
535 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
540 LO coarseNodeCoarseLID;
541 LO nodeFineTuple[3], coarseIdx[3];
542 auto coarseRate = geoData_.getCoarseningRates();
543 auto endRate = geoData_.getCoarseningEndRates();
544 auto lFineNodesPerDir = geoData_.getLocalFineNodesPerDir();
546 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
548 for (
int dim = 0; dim < 3; ++dim) {
549 coarseIdx[dim] = nodeFineTuple[dim] / coarseRate(dim);
550 rem = nodeFineTuple[dim] % coarseRate(dim);
551 rate = (nodeFineTuple[dim] < lFineNodesPerDir(dim) - endRate(dim)) ? coarseRate(dim) : endRate(dim);
552 if (rem > (rate / 2)) {
557 geoData_.getCoarseTuple2CoarseLID(coarseIdx[0], coarseIdx[1], coarseIdx[2],
558 coarseNodeCoarseLID);
560 vertex2AggID_(nodeIdx, 0) = coarseNodeCoarseLID;
561 procWinner_(nodeIdx, 0) = myRank_;
563 ++lNumAggregatedNodes;
567 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
571 const LO NumGhostedNodes,
572 const LO dofsPerNode,
579 , numGhostedNodes_(NumGhostedNodes)
580 , dofsPerNode_(dofsPerNode)
581 , coarseRate_(coarseRate)
583 , lFineNodesPerDir_(lFineNodesPerDir)
585 , colIndex_(colIndex) {
588 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
591 LO nodeFineTuple[3] = {0, 0, 0};
592 LO nodeCoarseTuple[3] = {0, 0, 0};
595 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
599 LO rem, rate, coarseNodeCoarseLID;
600 for (
int dim = 0; dim < 3; ++dim) {
601 nodeCoarseTuple[dim] = nodeFineTuple[dim] / coarseRate_(dim);
602 rem = nodeFineTuple[dim] % coarseRate_(dim);
603 if (nodeFineTuple[dim] < (lFineNodesPerDir_(dim) - endRate_(dim))) {
604 rate = coarseRate_(dim);
606 rate = endRate_(dim);
608 if (rem > (rate / 2)) {
609 ++nodeCoarseTuple[dim];
614 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
615 coarseNodeCoarseLID);
618 for (
LO dof = 0; dof < dofsPerNode_; ++dof) {
619 rowPtr_(nodeIdx * dofsPerNode_ + dof + 1) = nodeIdx * dofsPerNode_ + dof + 1;
620 colIndex_(nodeIdx * dofsPerNode_ + dof) = coarseNodeCoarseLID * dofsPerNode_ + dof;
625 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
628 const LO dofsPerNode,
629 const int numInterpolationPoints,
630 const LO numLocalRows,
635 , dofsPerNode_(dofsPerNode)
636 , numInterpolationPoints_(numInterpolationPoints)
637 , numLocalRows_(numLocalRows)
638 , coarseRate_(coarseRate)
639 , lFineNodesPerDir_(lFineNodesPerDir)
642 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
651 rowPtr_(rowIdx) = update;
653 if (rowIdx < numLocalRows_) {
654 LO nodeIdx = rowIdx / dofsPerNode_;
655 bool allCoarse =
true;
656 LO nodeFineTuple[3] = {0, 0, 0};
657 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
658 for (
int dim = 0; dim < 3; ++dim) {
659 const LO rem = nodeFineTuple[dim] % coarseRate_(dim);
662 allCoarse = (allCoarse && ((rem == 0) || (nodeFineTuple[dim] == lFineNodesPerDir_(dim) - 1)));
664 update += (allCoarse ? 1 : numInterpolationPoints_);
668 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
671 const int numDimensions,
672 const LO numGhostedNodes,
673 const LO dofsPerNode,
674 const int numInterpolationPoints,
682 , numDimensions_(numDimensions)
683 , numGhostedNodes_(numGhostedNodes)
684 , dofsPerNode_(dofsPerNode)
685 , numInterpolationPoints_(numInterpolationPoints)
686 , coarseRate_(coarseRate)
688 , lFineNodesPerDir_(lFineNodesPerDir)
689 , ghostedNodesPerDir_(ghostedNodesPerDir)
691 , colIndex_(colIndex) {
694 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
697 LO nodeFineTuple[3] = {0, 0, 0};
698 LO nodeCoarseTuple[3] = {0, 0, 0};
701 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
703 LO coarseNodeCoarseLID;
704 bool allCoarse =
false;
705 for (
int dim = 0; dim < 3; ++dim) {
706 nodeCoarseTuple[dim] = nodeFineTuple[dim] / coarseRate_(dim);
708 if (rowPtr_(nodeIdx + 1) == rowPtr_(nodeIdx) + 1) {
712 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
713 coarseNodeCoarseLID);
717 for (
LO dof = 0; dof < dofsPerNode_; ++dof) {
718 colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof)) = coarseNodeCoarseLID * dofsPerNode_ + dof;
721 for (
int dim = 0; dim < numDimensions_; ++dim) {
722 if (nodeCoarseTuple[dim] == ghostedNodesPerDir_(dim) - 1) {
723 --nodeCoarseTuple[dim];
729 for (
LO dof = 0; dof < dofsPerNode_; ++dof) {
730 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 0));
731 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1], nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 1));
732 if (numDimensions_ > 1) {
733 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1] + 1, nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 2));
734 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1] + 1, nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 3));
735 if (numDimensions_ > 2) {
736 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 4));
737 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1], nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 5));
738 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1] + 1, nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 6));
739 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1] + 1, nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 7));
Kokkos::View< unsigned *, typename LWGraphHostType::device_type > AggStatHostType
GO getStartIndex(int const dim) const
LO getLocalCoarseNodesInDir(const int dim) const
virtual void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const =0
bool getMeshEdge(const int dir) const
Lightweight MueLu representation of a compressed row storage graph.
const RCP< LOVector > & GetProcWinner() const
Returns constant vector that maps local node IDs to owning processor IDs.
void ComputeGraphDataConstant(const LWGraph &graph, RCP< IndexManager > &geoData, const LO dofsPerNode, const int numInterpolationPoints, ArrayRCP< size_t > &nnzOnRow, Array< size_t > &rowPtr, Array< LO > &colIndex) const
Container class for aggregation information.
RCP< IndexManager > & GetIndexManager()
Get the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
int getInterpolationOrder() const
LO getGhostedNodesInDir(const int dim) const
fillAggregatesFunctor(RCP< IndexManager_kokkos > geoData, const int myRank, Kokkos::View< unsigned *, device_type > aggStat, LOVectorView vertex2AggID, LOVectorView procWinner)
basic_FancyOStream & setShowProcRank(const bool showProcRank)
KOKKOS_INLINE_FUNCTION intTupleView getCoarseningEndRates() const
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx) const
KOKKOS_INLINE_FUNCTION intTupleView getCoarseningRates() const
decltype(std::declval< LOVector >().getDeviceLocalView(Xpetra::Access::ReadWrite)) LOVectorView
int getInterpolationOrder() const
GO getStartGhostedCoarseNode(int const dim) const
int getCoarseningRate(const int dim) const
LO getNumCoarseNodes() const
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx) const
typename Kokkos::View< const LO[3], device_type > constLOTupleView
virtual void getGhostedNodesData(const RCP< const Map > fineMap, Array< LO > &ghostedNodeCoarseLIDs, Array< int > &ghostedNodeCoarsePIDs, Array< GO > &ghostedNodeCoarseGIDs) const =0
computeGraphRowPtrFunctor(RCP< IndexManager_kokkos > geoData, const LO dofsPerNode, const int numInterpolationPoints, const LO numLocalRows, constIntTupleView coarseRate, constLOTupleView lFineNodesPerDir, non_const_row_map_type rowPtr)
int getNumDimensions() const
LO getNumLocalFineNodes() const
computeGraphDataLinearFunctor(RCP< IndexManager_kokkos > geoData, const int numDimensions, const LO numGhostedNodes, const LO dofsPerNode, const int numInterpolationPoints, constIntTupleView coarseRate, constIntTupleView endRate, constLOTupleView lFineNodesPerDir, constLOTupleView ghostedNodesPerDir, non_const_row_map_type rowPtr, entries_type colIndex)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
LO getNumLocalFineNodes() const
void BuildGraphOnHost(const LWGraph &graph, RCP< IndexManager > &geoData, const LO dofsPerNode, RCP< CrsGraph > &myGraph, RCP< const Map > &coarseCoordinatesFineMap, RCP< const Map > &coarseCoordinatesMap) const
Local aggregation.
GO getNumGlobalCoarseNodes() const
virtual void getCoarseNodeGhostedLID(const LO i, const LO j, const LO k, LO &myLID) const =0
virtual void getCoarseNodesData(const RCP< const Map > fineCoordinatesMap, Array< GO > &coarseNodeCoarseGIDs, Array< GO > &coarseNodeFineGIDs) const =0
void BuildAggregates(const Teuchos::ParameterList ¶ms, const LWGraph_kokkos &graph, Aggregates &aggregates, typename AggregationAlgorithmBase< LocalOrdinal, GlobalOrdinal, Node >::AggStatType &aggStat, LO &numNonAggregatedNodes) const
Build aggregates object.
LO getNumLocalCoarseNodes() const
typename local_graph_type::row_map_type::non_const_type non_const_row_map_type
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
const RCP< LOMultiVector > & GetVertex2AggId() const
Returns constant vector that maps local node IDs to local aggregates IDs.
KOKKOS_INLINE_FUNCTION void operator()(const LO rowIdx, GO &update, const bool final) const
typename LWGraph_kokkos::local_graph_type local_graph_type
LO getLocalFineNodesInDir(const int dim) const
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx, LO &lNumAggregatedNodes) const
bool isAggregationCoupled() const
void BuildAggregatesNonKokkos(const Teuchos::ParameterList ¶ms, const LWGraph &graph, Aggregates &aggregates, typename AggregationAlgorithmBase< LocalOrdinal, GlobalOrdinal, Node >::AggStatHostType &aggStat, LO &numNonAggregatedNodes) const
Local aggregation.
LO getOffset(int const dim) const
Timer to be used in non-factories.
typename local_graph_type::entries_type entries_type
computeGraphDataConstantFunctor(RCP< IndexManager_kokkos > geoData, const LO numGhostedNodes, const LO dofsPerNode, constIntTupleView coarseRate, constIntTupleView endRate, constLOTupleView lFineNodesPerDir, non_const_row_map_type rowPtr, entries_type colIndex)
bool isSingleCoarsePoint() const
int getCoarseningEndRate(const int dim) const
const RCP< const Map > GetDomainMap() const
Lightweight MueLu representation of a compressed row storage graph.
void ComputeGraphDataLinear(const LWGraph &graph, RCP< IndexManager > &geoData, const LO dofsPerNode, const int numInterpolationPoints, ArrayRCP< size_t > &nnzOnRow, Array< size_t > &rowPtr, Array< LO > &colIndex) const
KOKKOS_INLINE_FUNCTION LOTupleView getCoarseNodesPerDir() const
KOKKOS_INLINE_FUNCTION LOTupleView getLocalFineNodesPerDir() const
void BuildGraph(const LWGraph_kokkos &graph, RCP< IndexManager_kokkos > &geoData, const LO dofsPerNode, RCP< CrsGraph > &myGraph) const
Build a CrsGraph instead of aggregates.
const RCP< const Teuchos::Comm< int > > GetComm() const
typename Kokkos::View< const int[3], device_type > constIntTupleView
Kokkos::View< unsigned *, typename LWGraphType::device_type > AggStatType
int getNumDimensions() const
RCP< IndexManager_kokkos > & GetIndexManagerKokkos()
Get the index manager used by structured aggregation algorithms. This has to be done by the aggregati...