66 Monitor m(*
this,
"BuildAggregates");
68 int minNodesPerAggregate = params.get<
int>(
"aggregation: min agg size");
69 int maxNodesPerAggregate = params.get<
int>(
"aggregation: max agg size");
70 bool includeRootInAgg = params.get<
bool>(
"aggregation: phase2a include root");
73 const int myRank = graph.
GetComm()->getRank();
75 ArrayRCP<LO> vertex2AggId = aggregates.
GetVertex2AggId()->getDataNonConst(0);
76 ArrayRCP<LO> procWinner = aggregates.
GetProcWinner() ->getDataNonConst(0);
80 LO numLocalNodes = procWinner.size();
81 LO numLocalAggregated = numLocalNodes - numNonAggregatedNodes;
83 const double aggFactor = params.get<
double>(
"aggregation: phase2a agg factor");
84 double factor = as<double>(numLocalAggregated)/(numLocalNodes+1);
85 factor = pow(factor, aggFactor);
91 for (LO rootCandidate = 0; rootCandidate < numRows; rootCandidate++) {
92 if (aggStat[rootCandidate] !=
READY)
97 aggList[aggSize++] = rootCandidate;
102 for (
int j = 0; j < neighOfINode.size(); j++) {
103 LO neigh = neighOfINode[j];
105 if (neigh != rootCandidate) {
112 if (aggSize < as<size_t>(maxNodesPerAggregate))
113 aggList[aggSize++] = neigh;
121 if (aggSize > as<size_t>(minNodesPerAggregate) &&
122 ((includeRootInAgg && aggSize-1 > factor*numNeighbors) ||
123 (!includeRootInAgg && aggSize > factor*numNeighbors))) {
127 aggIndex = numLocalAggregates++;
129 for (
size_t k = 0; k < aggSize; k++) {
131 vertex2AggId[aggList[k]] = aggIndex;
132 procWinner [aggList[k]] = myRank;
135 numNonAggregatedNodes -= aggSize;