101 RCP<Teuchos::FancyOStream> out;
102 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
103 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
104 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
106 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
109 using device_type =
typename LWGraph_kokkos::local_graph_type::device_type;
110 using execution_space =
typename LWGraph_kokkos::local_graph_type::device_type::execution_space;
111 using memory_space =
typename LWGraph_kokkos::local_graph_type::device_type::memory_space;
113 *out <<
"Entering structured aggregation" << std::endl;
115 ParameterList pL = GetParameterList();
116 bDefinitionPhase_ =
false;
119 RCP<const LWGraph_kokkos> graph = Get<RCP<LWGraph_kokkos> >(currentLevel,
"Graph");
120 RCP<const Map> fineMap = graph->GetDomainMap();
121 const int myRank = fineMap->getComm()->getRank();
122 const LO dofsPerNode = Get<LO>(currentLevel,
"DofsPerNode");
126 const int interpolationOrder = pL.get<
int>(
"aggregation: coarsening order");
127 std::string outputType = pL.get<std::string>(
"aggregation: output type");
128 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
129 Array<LO> lFineNodesPerDir(3);
133 lFineNodesPerDir = currentLevel.
Get<Array<LO> >(
"lNodesPerDim",
NoFactory::get());
137 lFineNodesPerDir = Get<Array<LO> >(currentLevel,
"lNodesPerDim");
138 numDimensions = Get<int>(currentLevel,
"numDimensions");
142 for (
int dim = 0; dim < 3; ++dim) {
143 if (dim >= numDimensions) {
144 lFineNodesPerDir[dim] = 1;
149 std::string coarseningRate = pL.get<std::string>(
"aggregation: coarsening rate");
150 Teuchos::Array<LO> coarseRate;
152 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
153 }
catch (
const Teuchos::InvalidArrayStringRepresentation& e) {
154 GetOStream(
Errors, -1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** "
158 TEUCHOS_TEST_FOR_EXCEPTION((coarseRate.size() > 1) && (coarseRate.size() < numDimensions),
160 "\"aggregation: coarsening rate\" must have at least as many"
161 " components as the number of spatial dimensions in the problem.");
165 interpolationOrder, myRank,
169 *out <<
"The index manager has now been built" << std::endl;
170 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getLocalNumElements() !=
static_cast<size_t>(geoData->getNumLocalFineNodes()),
172 "The local number of elements in the graph's map is not equal to "
173 "the number of nodes given by: lNodesPerDim!");
179 if (interpolationOrder == 0 && outputAggregates) {
180 RCP<Aggregates> aggregates = rcp(
new Aggregates(graph->GetDomainMap()));
181 aggregates->setObjectLabel(
"ST");
182 aggregates->SetIndexManagerKokkos(geoData);
183 aggregates->AggregatesCrossProcessors(
false);
184 aggregates->SetNumAggregates(geoData->getNumCoarseNodes());
186 LO numNonAggregatedNodes = geoData->getNumLocalFineNodes();
187 Kokkos::View<unsigned*, device_type> aggStat(
"aggStat", numNonAggregatedNodes);
188 Kokkos::parallel_for(
189 "StructuredAggregation: initialize aggStat",
190 Kokkos::RangePolicy<execution_space>(0, numNonAggregatedNodes),
191 KOKKOS_LAMBDA(
const LO nodeIdx) { aggStat(nodeIdx) =
READY; });
193 myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
194 numNonAggregatedNodes);
196 *out <<
"numNonAggregatedNodes: " << numNonAggregatedNodes << std::endl;
199 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
200 aggregates->ComputeAggregateSizes(
true );
201 GetOStream(
Statistics1) << aggregates->description() << std::endl;
202 Set(currentLevel,
"Aggregates", aggregates);
206 RCP<CrsGraph> myGraph;
207 myStructuredAlgorithm->BuildGraph(*graph, geoData, dofsPerNode, myGraph);
208 Set(currentLevel,
"prolongatorGraph", myGraph);
211 Set(currentLevel,
"lCoarseNodesPerDim", geoData->getCoarseNodesPerDirArray());
212 Set(currentLevel,
"indexManager", geoData);
213 Set(currentLevel,
"structuredInterpolationOrder", interpolationOrder);
214 Set(currentLevel,
"numDimensions", numDimensions);