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>
18#include <Xpetra_CrsGraphFactory.hpp>
19#include <Xpetra_CrsGraph.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"
33template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
38 LO& numNonAggregatedNodes)
const {
39 Monitor m(*
this,
"BuildAggregates");
41 RCP<Teuchos::FancyOStream> out;
42 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
43 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
44 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
46 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
50 const bool coupled = geoData->isAggregationCoupled();
51 const bool singleCoarsePoint = geoData->isSingleCoarsePoint();
52 ArrayRCP<LO> vertex2AggId = aggregates.
GetVertex2AggId()->getDataNonConst(0);
53 ArrayRCP<LO> procWinner = aggregates.
GetProcWinner()->getDataNonConst(0);
54 Array<LO> ghostedCoarseNodeCoarseLIDs;
55 Array<int> ghostedCoarseNodeCoarsePIDs;
56 Array<GO> ghostedCoarseNodeCoarseGIDs;
58 *out <<
"Extract data for ghosted nodes" << std::endl;
59 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
60 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
63 Array<LO> ghostedIdx(3), coarseIdx(3);
64 LO ghostedCoarseNodeCoarseLID, aggId;
65 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
66 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
68 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
70 for (
int dim = 0; dim < 3; ++dim) {
71 if (singleCoarsePoint && (geoData->getLocalFineNodesInDir(dim) - 1 < geoData->getCoarseningRate(dim))) {
74 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
75 rem = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
76 if (ghostedIdx[dim] - geoData->getOffset(dim) < geoData->getLocalFineNodesInDir(dim) - geoData->getCoarseningEndRate(dim)) {
77 rate = geoData->getCoarseningRate(dim);
79 rate = geoData->getCoarseningEndRate(dim);
81 if (rem > (rate / 2)) {
84 if (coupled && (geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim))) {
90 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[2],
91 ghostedCoarseNodeCoarseLID);
93 aggId = ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID];
94 vertex2AggId[nodeIdx] = aggId;
95 procWinner[nodeIdx] = ghostedCoarseNodeCoarsePIDs[ghostedCoarseNodeCoarseLID];
97 --numNonAggregatedNodes;
102template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
105 RCP<CrsGraph>& myGraph, RCP<const Map>& coarseCoordinatesFineMap,
106 RCP<const Map>& coarseCoordinatesMap)
const {
107 Monitor m(*
this,
"BuildGraphP");
109 RCP<Teuchos::FancyOStream> out;
110 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
111 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
112 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
114 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
117 const bool coupled = geoData->isAggregationCoupled();
120 int numInterpolationPoints = 0;
121 if (geoData->getInterpolationOrder() == 0) {
122 numInterpolationPoints = 1;
123 }
else if (geoData->getInterpolationOrder() == 1) {
125 numInterpolationPoints = 1 << geoData->getNumDimensions();
127 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
129 Array<LO> colIndex((geoData->getNumLocalCoarseNodes() + numInterpolationPoints *
130 (geoData->getNumLocalFineNodes() - geoData->getNumLocalCoarseNodes())) *
132 Array<size_t> rowPtr(geoData->getNumLocalFineNodes() * dofsPerNode + 1);
134 ArrayRCP<size_t> nnzOnRow(geoData->getNumLocalFineNodes() * dofsPerNode);
136 *out <<
"Compute prolongatorGraph data" << std::endl;
137 if (geoData->getInterpolationOrder() == 0) {
139 nnzOnRow, rowPtr, colIndex);
140 }
else if (geoData->getInterpolationOrder() == 1) {
142 nnzOnRow, rowPtr, colIndex);
146 RCP<Map> rowMap = MapFactory::Build(graph.
GetDomainMap(), dofsPerNode);
147 RCP<Map> colMap, domainMap;
148 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
150 *out <<
"Extract data for ghosted nodes" << std::endl;
151 Array<LO> ghostedCoarseNodeCoarseLIDs;
152 Array<int> ghostedCoarseNodeCoarsePIDs;
153 Array<GO> ghostedCoarseNodeCoarseGIDs;
154 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
155 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
160 geoData->getNumGlobalCoarseNodes(),
161 ghostedCoarseNodeCoarseGIDs(),
165 LO coarseNodeIdx = 0;
166 Array<GO> coarseNodeCoarseGIDs, coarseNodeFineGIDs;
167 geoData->getCoarseNodesData(graph.
GetDomainMap(), 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(),
175 geoData->getNumGlobalCoarseNodes(),
176 coarseNodeCoarseGIDs(),
179 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
180 geoData->getNumGlobalCoarseNodes(),
181 coarseNodeCoarseGIDs(),
184 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
185 geoData->getNumGlobalCoarseNodes(),
186 coarseNodeFineGIDs(),
193 Teuchos::OrdinalTraits<GO>::invalid(),
194 geoData->getNumLocalCoarseNodes() * dofsPerNode,
199 Array<GO> coarseNodeCoarseGIDs(geoData->getNumLocalCoarseNodes());
200 Array<GO> coarseNodeFineGIDs(geoData->getNumLocalCoarseNodes());
201 geoData->getCoarseNodesData(graph.
GetDomainMap(), coarseNodeCoarseGIDs, coarseNodeFineGIDs);
202 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
203 Teuchos::OrdinalTraits<GO>::invalid(),
204 geoData->getNumLocalCoarseNodes(),
207 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
208 Teuchos::OrdinalTraits<GO>::invalid(),
209 coarseNodeFineGIDs(),
214 *out <<
"Call constructor of CrsGraph" << std::endl;
215 myGraph = CrsGraphFactory::Build(rowMap,
219 *out <<
"Fill CrsGraph" << std::endl;
221 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
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;
234template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
237 const LO dofsPerNode,
const int ,
238 ArrayRCP<size_t>& nnzOnRow, Array<size_t>& rowPtr,
239 Array<LO>& colIndex)
const {
240 RCP<Teuchos::FancyOStream> out;
241 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
242 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
243 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
245 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
248 Array<LO> ghostedCoarseNodeCoarseLIDs;
249 Array<int> ghostedCoarseNodeCoarsePIDs;
250 Array<GO> ghostedCoarseNodeCoarseGIDs;
251 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
252 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
254 LO ghostedCoarseNodeCoarseLID, rem, rate;
255 Array<LO> ghostedIdx(3), coarseIdx(3);
256 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
258 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
260 for (
int dim = 0; dim < 3; ++dim) {
261 if (geoData->isSingleCoarsePoint() && (geoData->getLocalFineNodesInDir(dim) - 1 < geoData->getCoarseningRate(dim))) {
264 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
265 rem = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
266 if (ghostedIdx[dim] - geoData->getOffset(dim) < geoData->getLocalFineNodesInDir(dim) - geoData->getCoarseningEndRate(dim)) {
267 rate = geoData->getCoarseningRate(dim);
269 rate = geoData->getCoarseningEndRate(dim);
271 if (rem > (rate / 2)) {
274 if ((geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim)) && geoData->isAggregationCoupled()) {
280 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[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;
293template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
296 const LO dofsPerNode,
const int numInterpolationPoints,
297 ArrayRCP<size_t>& nnzOnRow, Array<size_t>& rowPtr,
298 Array<LO>& colIndex)
const {
299 RCP<Teuchos::FancyOStream> out;
300 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
301 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
302 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
304 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
307 const bool coupled = geoData->isAggregationCoupled();
308 const int numDimensions = geoData->getNumDimensions();
309 Array<LO> ghostedIdx(3, 0);
310 Array<LO> coarseIdx(3, 0);
311 Array<LO> ijkRem(3, 0);
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}};
314 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
316 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
317 for (
int dim = 0; dim < numDimensions; dim++) {
318 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
319 ijkRem[dim] = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
321 if (geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim)) {
325 if (ghostedIdx[dim] == geoData->getLocalFineNodesInDir(dim) - 1) {
326 coarseIdx[dim] = geoData->getLocalCoarseNodesInDir(dim) - 1;
333 bool allCoarse =
true;
334 Array<bool> isCoarse(numDimensions);
335 for (
int dim = 0; dim < numDimensions; ++dim) {
336 isCoarse[dim] =
false;
337 if (ijkRem[dim] == 0)
338 isCoarse[dim] =
true;
341 if (ghostedIdx[dim] - geoData->getOffset(dim) == geoData->getLocalFineNodesInDir(dim) - 1 &&
342 geoData->getMeshEdge(dim * 2 + 1))
343 isCoarse[dim] =
true;
345 if (ghostedIdx[dim] - geoData->getOffset(dim) == geoData->getLocalFineNodesInDir(dim) - 1)
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;
361 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[2], colIdx);
362 colIndex[rowPtr[rowIdx]] = colIdx * dofsPerNode + dof;
366 for (
int dim = 0; dim < numDimensions; ++dim) {
367 if (coarseIdx[dim] == geoData->getGhostedNodesInDir(dim) - 1)
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) {
378 geoData->getCoarseNodeGhostedLID(coarseIdx[0] + coarsePointOffset[interpIdx][0],
379 coarseIdx[1] + coarsePointOffset[interpIdx][1],
380 coarseIdx[2] + coarsePointOffset[interpIdx][2],
382 colIndex[rowPtr[rowIdx] + interpIdx] = colIdx * dofsPerNode + dof;
389template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
394 LO& numNonAggregatedNodes)
const {
395 Monitor m(*
this,
"BuildAggregates");
397 RCP<Teuchos::FancyOStream> out;
398 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
399 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
400 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
402 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
406 const LO numLocalFineNodes = geoData->getNumLocalFineNodes();
407 const LO numCoarseNodes = geoData->getNumCoarseNodes();
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;
429template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
432 RCP<CrsGraph>& myGraph)
const {
433 Monitor m(*
this,
"BuildGraphP");
435 RCP<Teuchos::FancyOStream> out;
436 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
437 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
438 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
440 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
444 int numInterpolationPoints = 0;
445 if (geoData->getInterpolationOrder() == 0) {
446 numInterpolationPoints = 1;
447 }
else if (geoData->getInterpolationOrder() == 1) {
449 numInterpolationPoints = 1 << geoData->getNumDimensions();
451 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
453 const LO numLocalFineNodes = geoData->getNumLocalFineNodes();
454 const LO numCoarseNodes = geoData->getNumCoarseNodes();
455 const LO numNnzEntries = dofsPerNode * (numCoarseNodes + numInterpolationPoints * (numLocalFineNodes - numCoarseNodes));
458 entries_type colIndex(
"Prolongator graph, colIndices", numNnzEntries);
460 *out <<
"Compute prolongatorGraph data" << std::endl;
461 if (geoData->getInterpolationOrder() == 0) {
465 geoData->getCoarseningRates(),
466 geoData->getCoarseningEndRates(),
467 geoData->getLocalFineNodesPerDir(),
470 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
471 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
473 }
else if (geoData->getInterpolationOrder() == 1) {
480 numInterpolationPoints,
482 geoData->getCoarseningRates(),
483 geoData->getLocalFineNodesPerDir(),
485 Kokkos::parallel_scan(
"Structured Aggregation: compute rowPtr for prolongator graph",
486 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes + 1),
490 geoData->getNumDimensions(),
493 numInterpolationPoints,
494 geoData->getCoarseningRates(),
495 geoData->getCoarseningEndRates(),
496 geoData->getLocalFineNodesPerDir(),
497 geoData->getCoarseNodesPerDir(),
500 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
501 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
508 RCP<Map> colMap, domainMap;
509 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
511 Teuchos::OrdinalTraits<GO>::invalid(),
517 myGraph = CrsGraphFactory::Build(myLocalGraph, graph.
GetDomainMap(), colMap,
522template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526 Kokkos::View<unsigned*, device_type> aggStat,
535template <
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);
563 ++lNumAggregatedNodes;
567template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
571 const LO NumGhostedNodes,
572 const LO dofsPerNode,
588template <
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);
608 if (rem > (rate / 2)) {
609 ++nodeCoarseTuple[dim];
614 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
615 coarseNodeCoarseLID);
625template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
628 const LO dofsPerNode,
629 const int numInterpolationPoints,
630 const LO numLocalRows,
642template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
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)));
668template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
671 const int numDimensions,
672 const LO numGhostedNodes,
673 const LO dofsPerNode,
674 const int numInterpolationPoints,
694template <
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);
712 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
713 coarseNodeCoarseLID);
723 --nodeCoarseTuple[dim];
Container class for aggregation information.
RCP< IndexManager_kokkos > & GetIndexManagerKokkos()
Get the index manager used by structured aggregation algorithms. This has to be done by the aggregati...
RCP< IndexManager > & GetIndexManager()
Get the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
const RCP< LOMultiVector > & GetVertex2AggId() const
Returns constant vector that maps local node IDs to local aggregates IDs.
const RCP< LOVector > & GetProcWinner() const
Returns constant vector that maps local node IDs to owning processor IDs.
Kokkos::View< unsigned *, typename LWGraphHostType::device_type > AggStatHostType
Kokkos::View< unsigned *, typename LWGraphType::device_type > AggStatType
decltype(std::declval< LOVector >().getLocalViewDevice(Tpetra::Access::ReadWrite)) LOVectorView
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
void BuildGraph(const LWGraph_kokkos &graph, RCP< IndexManager_kokkos > &geoData, const LO dofsPerNode, RCP< CrsGraph > &myGraph) const
Build a CrsGraph instead of aggregates.
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
typename Kokkos::View< const int[3], device_type > constIntTupleView
typename LWGraph_kokkos::local_graph_type local_graph_type
typename Kokkos::View< const LO[3], device_type > constLOTupleView
void BuildAggregatesNonKokkos(const Teuchos::ParameterList ¶ms, const LWGraph &graph, Aggregates &aggregates, typename AggregationAlgorithmBase< LocalOrdinal, GlobalOrdinal, Node >::AggStatHostType &aggStat, LO &numNonAggregatedNodes) const
Local aggregation.
typename local_graph_type::row_map_type::non_const_type non_const_row_map_type
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.
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.
typename local_graph_type::entries_type entries_type
Lightweight MueLu representation of a compressed row storage graph.
const RCP< const Map > GetDomainMap() const
const RCP< const Teuchos::Comm< int > > GetComm() const
Lightweight MueLu representation of a compressed row storage graph.
Timer to be used in non-factories.
Namespace for MueLu classes and methods.
non_const_row_map_type rowPtr_
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx) const
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)
constIntTupleView coarseRate_
constLOTupleView lFineNodesPerDir_
constIntTupleView endRate_
const int numGhostedNodes_
IndexManager_kokkos geoData_
IndexManager_kokkos geoData_
constIntTupleView endRate_
const int numInterpolationPoints_
const int numGhostedNodes_
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx) const
constIntTupleView coarseRate_
constLOTupleView lFineNodesPerDir_
constLOTupleView ghostedNodesPerDir_
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)
non_const_row_map_type rowPtr_
IndexManager_kokkos geoData_
constLOTupleView lFineNodesPerDir_
const int numInterpolationPoints_
non_const_row_map_type rowPtr_
computeGraphRowPtrFunctor(RCP< IndexManager_kokkos > geoData, const LO dofsPerNode, const int numInterpolationPoints, const LO numLocalRows, constIntTupleView coarseRate, constLOTupleView lFineNodesPerDir, non_const_row_map_type rowPtr)
constIntTupleView coarseRate_
KOKKOS_INLINE_FUNCTION void operator()(const LO rowIdx, GO &update, const bool final) const
KOKKOS_INLINE_FUNCTION void operator()(const LO nodeIdx, LO &lNumAggregatedNodes) const
fillAggregatesFunctor(RCP< IndexManager_kokkos > geoData, const int myRank, Kokkos::View< unsigned *, device_type > aggStat, LOVectorView vertex2AggID, LOVectorView procWinner)
IndexManager_kokkos geoData_
LOVectorView vertex2AggID_
Kokkos::View< unsigned *, device_type > aggStat_