156 RCP<Teuchos::FancyOStream> out;
157 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
158 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
159 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
161 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
164 *out <<
"Entering structured aggregation" << std::endl;
171 RCP<const Map> fineMap = graph->GetDomainMap();
172 const int myRank = fineMap->getComm()->getRank();
173 const int numRanks = fineMap->getComm()->getSize();
174 const GO minGlobalIndex = fineMap->getMinGlobalIndex();
175 const LO dofsPerNode =
Get<LO>(currentLevel,
"DofsPerNode");
179 const int interpolationOrder = pL.get<
int>(
"aggregation: coarsening order");
180 std::string meshLayout = pL.get<std::string>(
"aggregation: mesh layout");
181 std::string coupling = pL.get<std::string>(
"aggregation: mode");
182 const bool coupled = (coupling ==
"coupled" ? true :
false);
183 std::string outputType = pL.get<std::string>(
"aggregation: output type");
184 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
185 const bool singleCoarsePoint = pL.get<
bool>(
"aggregation: single coarse point");
187 Array<GO> gFineNodesPerDir(3);
188 Array<LO> lFineNodesPerDir(3);
192 lFineNodesPerDir = currentLevel.
Get<Array<LO> >(
"lNodesPerDim",
NoFactory::get());
194 gFineNodesPerDir = currentLevel.
Get<Array<GO> >(
"gNodesPerDim",
NoFactory::get());
198 numDimensions =
Get<int>(currentLevel,
"numDimensions");
199 lFineNodesPerDir =
Get<Array<LO> >(currentLevel,
"lNodesPerDim");
201 gFineNodesPerDir =
Get<Array<GO> >(currentLevel,
"gNodesPerDim");
207 for(
int dim = 0; dim < 3; ++dim) {
208 if(dim >= numDimensions) {
209 gFineNodesPerDir[dim] = 1;
210 lFineNodesPerDir[dim] = 1;
215 std::string coarseningRate = pL.get<std::string>(
"aggregation: coarsening rate");
216 Teuchos::Array<LO> coarseRate;
218 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
219 }
catch(
const Teuchos::InvalidArrayStringRepresentation& e) {
220 GetOStream(
Errors,-1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** "
224 TEUCHOS_TEST_FOR_EXCEPTION((coarseRate.size() > 1) && (coarseRate.size() < numDimensions),
226 "\"aggregation: coarsening rate\" must have at least as many"
227 " components as the number of spatial dimensions in the problem.");
230 RCP<IndexManager > geoData;
242 }
else if(meshLayout ==
"Local Lexicographic") {
246 meshData = currentLevel.
Get<Array<GO> >(
"aggregation: mesh data",
NoFactory::get());
248 "The meshData array is empty, somehow the input for structured"
249 " aggregation are not captured correctly.");
252 meshData =
Get<Array<GO> >(currentLevel,
"aggregation: mesh data");
268 }
else if(meshLayout ==
"Global Lexicographic") {
284 *out <<
"The index manager has now been built" << std::endl;
285 *out <<
"graph num nodes: " << fineMap->getLocalNumElements()
286 <<
", structured aggregation num nodes: " << geoData->getNumLocalFineNodes() << std::endl;
287 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getLocalNumElements()
288 !=
static_cast<size_t>(geoData->getNumLocalFineNodes()),
290 "The local number of elements in the graph's map is not equal to "
291 "the number of nodes given by: lNodesPerDim!");
293 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getGlobalNumElements()
294 !=
static_cast<size_t>(geoData->getNumGlobalFineNodes()),
296 "The global number of elements in the graph's map is not equal to "
297 "the number of nodes given by: gNodesPerDim!");
300 *out <<
"Compute coarse mesh data" << std::endl;
301 std::vector<std::vector<GO> > coarseMeshData = geoData->getCoarseMeshData();
305 RCP<const FactoryBase> graphFact =
GetFactory(
"Graph");
306 RCP<const Map> coarseCoordinatesFineMap, coarseCoordinatesMap;
307 RCP<MueLu::AggregationStructuredAlgorithm<LocalOrdinal, GlobalOrdinal, Node> >
310 if(interpolationOrder == 0 && outputAggregates){
312 *out <<
"Compute Aggregates" << std::endl;
313 RCP<Aggregates> aggregates = rcp(
new Aggregates(graph->GetDomainMap()));
314 aggregates->setObjectLabel(
"ST");
315 aggregates->SetIndexManager(geoData);
316 aggregates->AggregatesCrossProcessors(coupled);
317 aggregates->SetNumAggregates(geoData->getNumLocalCoarseNodes());
318 std::vector<unsigned> aggStat(geoData->getNumLocalFineNodes(),
READY);
319 LO numNonAggregatedNodes = geoData->getNumLocalFineNodes();
321 myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
322 numNonAggregatedNodes);
325 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
326 aggregates->ComputeAggregateSizes(
true);
328 Set(currentLevel,
"Aggregates", aggregates);
332 *out <<
"Compute CrsGraph" << std::endl;
333 RCP<CrsGraph> myGraph;
334 myStructuredAlgorithm->BuildGraph(*graph, geoData, dofsPerNode, myGraph,
335 coarseCoordinatesFineMap, coarseCoordinatesMap);
336 Set(currentLevel,
"prolongatorGraph", myGraph);
340 Set(currentLevel,
"gCoarseNodesPerDim", geoData->getGlobalCoarseNodesPerDir());
342 Set(currentLevel,
"lCoarseNodesPerDim", geoData->getLocalCoarseNodesPerDir());
343 Set(currentLevel,
"coarseCoordinatesFineMap", coarseCoordinatesFineMap);
344 Set(currentLevel,
"coarseCoordinatesMap", coarseCoordinatesMap);
345 Set(currentLevel,
"structuredInterpolationOrder", interpolationOrder);
346 Set(currentLevel,
"numDimensions", numDimensions);