46 #ifndef MUELU_AGGREGATIONSTRUCTUREDALGORITHM_DEF_HPP_ 47 #define MUELU_AGGREGATIONSTRUCTUREDALGORITHM_DEF_HPP_ 50 #include <Teuchos_Comm.hpp> 51 #include <Teuchos_CommHelpers.hpp> 53 #include <Xpetra_MapFactory.hpp> 54 #include <Xpetra_Map.hpp> 55 #include <Xpetra_CrsGraphFactory.hpp> 56 #include <Xpetra_CrsGraph.hpp> 61 #include "MueLu_Aggregates.hpp" 62 #include "MueLu_IndexManager.hpp" 68 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 Aggregates& aggregates, std::vector<unsigned>& aggStat,
72 LO& numNonAggregatedNodes)
const {
73 Monitor m(*
this,
"BuildAggregates");
76 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
77 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
91 *out <<
"Extract data for ghosted nodes" << std::endl;
93 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
97 LO ghostedCoarseNodeCoarseLID, aggId;
98 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
103 for(
int dim = 0; dim < 3; ++dim) {
106 if(ghostedIdx[dim] - geoData->
getOffset(dim)
112 if(rem > (rate / 2)) {++coarseIdx[dim];}
118 ghostedCoarseNodeCoarseLID);
120 aggId = ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID];
121 vertex2AggId[nodeIdx] = aggId;
122 procWinner[nodeIdx] = ghostedCoarseNodeCoarsePIDs[ghostedCoarseNodeCoarseLID];
124 --numNonAggregatedNodes;
130 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
134 Monitor m(*
this,
"BuildAggregates");
137 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
138 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
147 int numInterpolationPoints = 0;
149 numInterpolationPoints = 1;
154 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
162 *out <<
"Compute prolongatorGraph data" << std::endl;
164 ComputeGraphDataConstant(graph, geoData, numInterpolationPoints, nnzOnRow, rowPtr, colIndex);
166 ComputeGraphDataLinear(graph, geoData, numInterpolationPoints, nnzOnRow, rowPtr, colIndex);
171 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
173 *out <<
"Extract data for ghosted nodes" << std::endl;
178 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
184 ghostedCoarseNodeCoarseGIDs(),
189 LO coarseNodeIdx = 0;
190 Array<GO> coarseNodeCoarseGIDs, coarseNodeFineGIDs;
192 for(LO nodeIdx = 0; nodeIdx < ghostedCoarseNodeCoarseGIDs.
size(); ++nodeIdx) {
193 if(ghostedCoarseNodeCoarsePIDs[nodeIdx] == colMap->getComm()->getRank()) {
194 coarseNodeCoarseGIDs[coarseNodeIdx] = ghostedCoarseNodeCoarseGIDs[nodeIdx];
198 domainMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
200 coarseNodeCoarseGIDs(),
204 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
206 coarseNodeCoarseGIDs(),
210 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
212 coarseNodeFineGIDs(),
231 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
237 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
239 coarseNodeFineGIDs(),
248 Xpetra::DynamicProfile);
250 myGraph->insertLocalIndices(nodeIdx, colIndex(rowPtr[nodeIdx], nnzOnRow[nodeIdx]) );
257 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
264 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
265 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
275 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
277 LO ghostedCoarseNodeCoarseLID, rem, rate;
281 nnzOnRow[nodeIdx] = Teuchos::as<size_t>(1);
282 rowPtr[nodeIdx + 1] = rowPtr[nodeIdx] + 1;
287 for(
int dim = 0; dim < 3; ++dim) {
290 if(ghostedIdx[dim] - geoData->
getOffset(dim)
296 if(rem > (rate / 2)) {++coarseIdx[dim];}
302 ghostedCoarseNodeCoarseLID);
303 colIndex[rowPtr[nodeIdx]] = ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID];
309 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
316 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
317 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
334 for(
int dim=0; dim < numDimensions; dim++){
337 if(ghostedIdx[dim] - geoData->
getOffset(dim)
343 if(ijkRem[dim] > (rate / 2)) {++coarseIdx[dim];}
350 bool allCoarse =
true;
352 for(
int dim = 0; dim < numDimensions; ++dim) {
353 isCoarse[dim] =
false;
355 isCoarse[dim] =
true;
360 isCoarse[dim] =
true;
363 isCoarse[dim] =
true;
373 colIndex[rowPtr[nodeIdx]]);
374 nnzOnRow[nodeIdx] = Teuchos::as<size_t>(1);
375 rowPtr[nodeIdx + 1] = rowPtr[nodeIdx] + 1;
379 nnzOnRow[nodeIdx] = Teuchos::as<size_t>( numInterpolationPoints );
380 rowPtr[nodeIdx + 1] = rowPtr[nodeIdx] + Teuchos::as<LO>( numInterpolationPoints );
382 for(
int dim = 0; dim < numDimensions; ++dim) {
389 if(numDimensions > 1) {
392 if(numDimensions > 2) {
396 geoData->
getCoarseNodeGhostedLID(coarseIdx[0]+1, coarseIdx[1]+1, coarseIdx[2]+1, colIndex[ rowPtr[nodeIdx]+7]);
virtual void getFineNodeGhostedTuple(const LO myLID, LO &i, LO &j, LO &k) const =0
Container class for aggregation information.
RCP< IndexManager > & GetIndexManager()
Get the index manager used by structured aggregation algorithms.
void ComputeGraphDataConstant(const GraphBase &graph, RCP< IndexManager > &geoData, const int numInterpolationPoints, ArrayRCP< size_t > &nnzOnRow, Array< size_t > &rowPtr, Array< LO > &colIndex) const
basic_FancyOStream & setShowProcRank(const bool showProcRank)
LO getOffset(int const dim) const
virtual const RCP< const Map > GetDomainMap() const =0
LO getNumLocalCoarseNodes() const
GO getStartIndex(int const dim) const
Namespace for MueLu classes and methods.
virtual void getGhostedNodesData(const RCP< const Map > fineMap, Array< LO > &ghostedNodeCoarseLIDs, Array< int > &ghostedNodeCoarsePIDs, Array< GO > &ghostedNodeCoarseGIDs) const =0
int getCoarseningEndRate(const int dim) const
int getInterpolationOrder() const
LO getNumLocalFineNodes() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void BuildAggregates(const Teuchos::ParameterList ¶ms, const GraphBase &graph, Aggregates &aggregates, std::vector< unsigned > &aggStat, LO &numNonAggregatedNodes) const
Local aggregation.
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
bool getMeshEdge(const int dir) const
LO getLocalFineNodesInDir(const int dim) const
basic_FancyOStream & setShowAllFrontMatter(const bool showAllFrontMatter)
GO getStartGhostedCoarseNode(int const dim) const
LO getGhostedNodesInDir(const int dim) const
MueLu representation of a graph.
void ComputeGraphDataLinear(const GraphBase &graph, RCP< IndexManager > &geoData, const int numInterpolationPoints, ArrayRCP< size_t > &nnzOnRow, Array< size_t > &rowPtr, Array< LO > &colIndex) const
int getNumDimensions() const
Timer to be used in non-factories.
GO getNumGlobalCoarseNodes() const
const RCP< LOMultiVector > & GetVertex2AggId() const
Returns constant vector that maps local node IDs to local aggregates IDs.
bool isAggregationCoupled() const
const RCP< LOVector > & GetProcWinner() const
Returns constant vector that maps local node IDs to owning processor IDs.
void BuildGraph(const GraphBase &graph, RCP< IndexManager > &geoData, RCP< CrsGraph > &myGraph, RCP< const Map > &coarseCoordinatesFineMap, RCP< const Map > &coarseCoordinatesMap) const
Local aggregation.
int getCoarseningRate(const int dim) const