120 RCP<Teuchos::FancyOStream> out;
121 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
122 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
123 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
125 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
128 *out <<
"Entering structured aggregation" << std::endl;
130 ParameterList pL = GetParameterList();
131 bDefinitionPhase_ =
false;
134 RCP<const LWGraph> graph = Get<RCP<LWGraph> >(currentLevel,
"Graph");
135 RCP<const Map> fineMap = graph->GetDomainMap();
136 const int myRank = fineMap->getComm()->getRank();
137 const int numRanks = fineMap->getComm()->getSize();
138 const GO minGlobalIndex = fineMap->getMinGlobalIndex();
139 const LO dofsPerNode = Get<LO>(currentLevel,
"DofsPerNode");
143 const int interpolationOrder = pL.get<
int>(
"aggregation: coarsening order");
144 std::string meshLayout = pL.get<std::string>(
"aggregation: mesh layout");
145 std::string coupling = pL.get<std::string>(
"aggregation: mode");
146 const bool coupled = (coupling ==
"coupled" ? true :
false);
147 std::string outputType = pL.get<std::string>(
"aggregation: output type");
148 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
149 const bool singleCoarsePoint = pL.get<
bool>(
"aggregation: single coarse point");
151 Array<GO> gFineNodesPerDir(3);
152 Array<LO> lFineNodesPerDir(3);
156 lFineNodesPerDir = currentLevel.
Get<Array<LO> >(
"lNodesPerDim",
NoFactory::get());
158 gFineNodesPerDir = currentLevel.
Get<Array<GO> >(
"gNodesPerDim",
NoFactory::get());
162 numDimensions = Get<int>(currentLevel,
"numDimensions");
163 lFineNodesPerDir = Get<Array<LO> >(currentLevel,
"lNodesPerDim");
165 gFineNodesPerDir = Get<Array<GO> >(currentLevel,
"gNodesPerDim");
170 for (
int dim = 0; dim < 3; ++dim) {
171 if (dim >= numDimensions) {
172 gFineNodesPerDir[dim] = 1;
173 lFineNodesPerDir[dim] = 1;
178 std::string coarseningRate = pL.get<std::string>(
"aggregation: coarsening rate");
179 Teuchos::Array<LO> coarseRate;
181 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
182 }
catch (
const Teuchos::InvalidArrayStringRepresentation& e) {
183 GetOStream(
Errors, -1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** "
187 TEUCHOS_TEST_FOR_EXCEPTION((coarseRate.size() > 1) && (coarseRate.size() < numDimensions),
189 "\"aggregation: coarsening rate\" must have at least as many"
190 " components as the number of spatial dimensions in the problem.");
193 RCP<IndexManager> geoData;
205 }
else if (meshLayout ==
"Local Lexicographic") {
209 meshData = currentLevel.
Get<Array<GO> >(
"aggregation: mesh data",
NoFactory::get());
211 "The meshData array is empty, somehow the input for structured"
212 " aggregation are not captured correctly.");
215 meshData = Get<Array<GO> >(currentLevel,
"aggregation: mesh data");
231 }
else if (meshLayout ==
"Global Lexicographic") {
246 *out <<
"The index manager has now been built" << std::endl;
247 *out <<
"graph num nodes: " << fineMap->getLocalNumElements()
248 <<
", structured aggregation num nodes: " << geoData->getNumLocalFineNodes() << std::endl;
249 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getLocalNumElements() !=
static_cast<size_t>(geoData->getNumLocalFineNodes()),
251 "The local number of elements in the graph's map is not equal to "
252 "the number of nodes given by: lNodesPerDim!");
254 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getGlobalNumElements() !=
static_cast<size_t>(geoData->getNumGlobalFineNodes()),
256 "The global number of elements in the graph's map is not equal to "
257 "the number of nodes given by: gNodesPerDim!");
260 *out <<
"Compute coarse mesh data" << std::endl;
261 std::vector<std::vector<GO> > coarseMeshData = geoData->getCoarseMeshData();
265 RCP<const FactoryBase> graphFact = GetFactory(
"Graph");
266 RCP<const Map> coarseCoordinatesFineMap, coarseCoordinatesMap;
267 RCP<MueLu::AggregationStructuredAlgorithm<LocalOrdinal, GlobalOrdinal, Node> >
270 if (interpolationOrder == 0 && outputAggregates) {
272 *out <<
"Compute Aggregates" << std::endl;
273 RCP<Aggregates> aggregates = rcp(
new Aggregates(graph->GetDomainMap()));
274 aggregates->setObjectLabel(
"ST");
275 aggregates->SetIndexManager(geoData);
276 aggregates->AggregatesCrossProcessors(coupled);
277 aggregates->SetNumAggregates(geoData->getNumLocalCoarseNodes());
279 AggStatHostType aggStat(Kokkos::ViewAllocateWithoutInitializing(
"aggregation status"), geoData->getNumLocalFineNodes());
280 Kokkos::deep_copy(aggStat,
READY);
281 LO numNonAggregatedNodes = geoData->getNumLocalFineNodes();
283 myStructuredAlgorithm->BuildAggregatesNonKokkos(pL, *graph, *aggregates, aggStat,
284 numNonAggregatedNodes);
287 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
288 aggregates->ComputeAggregateSizes(
true );
289 GetOStream(
Statistics1) << aggregates->description() << std::endl;
290 Set(currentLevel,
"Aggregates", aggregates);
294 *out <<
"Compute CrsGraph" << std::endl;
295 RCP<CrsGraph> myGraph;
296 myStructuredAlgorithm->BuildGraphOnHost(*graph, geoData, dofsPerNode, myGraph,
297 coarseCoordinatesFineMap, coarseCoordinatesMap);
298 Set(currentLevel,
"prolongatorGraph", myGraph);
302 Set(currentLevel,
"gCoarseNodesPerDim", geoData->getGlobalCoarseNodesPerDir());
304 Set(currentLevel,
"lCoarseNodesPerDim", geoData->getLocalCoarseNodesPerDir());
305 Set(currentLevel,
"coarseCoordinatesFineMap", coarseCoordinatesFineMap);
306 Set(currentLevel,
"coarseCoordinatesMap", coarseCoordinatesMap);
307 Set(currentLevel,
"structuredInterpolationOrder", interpolationOrder);
308 Set(currentLevel,
"numDimensions", numDimensions);