136 RCP<Teuchos::FancyOStream> out;
137 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
138 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
139 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
141 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
144 using device_type =
typename LWGraph_kokkos::local_graph_type::device_type;
145 using execution_space =
typename LWGraph_kokkos::local_graph_type::device_type::execution_space;
146 using memory_space =
typename LWGraph_kokkos::local_graph_type::device_type::memory_space;
148 *out <<
"Entering structured aggregation" << std::endl;
155 RCP<const Map> fineMap = graph->GetDomainMap();
156 const int myRank = fineMap->getComm()->getRank();
157 const LO dofsPerNode =
Get<LO>(currentLevel,
"DofsPerNode");
161 const int interpolationOrder = pL.get<
int>(
"aggregation: coarsening order");
162 std::string outputType = pL.get<std::string>(
"aggregation: output type");
163 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
164 Array<LO> lFineNodesPerDir(3);
168 lFineNodesPerDir = currentLevel.
Get<Array<LO> >(
"lNodesPerDim",
NoFactory::get());
172 lFineNodesPerDir =
Get<Array<LO> >(currentLevel,
"lNodesPerDim");
173 numDimensions =
Get<int>(currentLevel,
"numDimensions");
178 for(
int dim = 0; dim < 3; ++dim) {
179 if(dim >= numDimensions) {
180 lFineNodesPerDir[dim] = 1;
185 std::string coarseningRate = pL.get<std::string>(
"aggregation: coarsening rate");
186 Teuchos::Array<LO> coarseRate;
188 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
189 }
catch(
const Teuchos::InvalidArrayStringRepresentation& e) {
190 GetOStream(
Errors,-1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** "
194 TEUCHOS_TEST_FOR_EXCEPTION((coarseRate.size() > 1) && (coarseRate.size() < numDimensions),
196 "\"aggregation: coarsening rate\" must have at least as many"
197 " components as the number of spatial dimensions in the problem.");
201 interpolationOrder, myRank,
205 *out <<
"The index manager has now been built" << std::endl;
206 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getLocalNumElements()
207 !=
static_cast<size_t>(geoData->getNumLocalFineNodes()),
209 "The local number of elements in the graph's map is not equal to "
210 "the number of nodes given by: lNodesPerDim!");
214 RCP<AggregationStructuredAlgorithm_kokkos> myStructuredAlgorithm
217 if(interpolationOrder == 0 && outputAggregates){
218 RCP<Aggregates> aggregates = rcp(
new Aggregates(graph->GetDomainMap()));
219 aggregates->setObjectLabel(
"ST");
220 aggregates->SetIndexManagerKokkos(geoData);
221 aggregates->AggregatesCrossProcessors(
false);
222 aggregates->SetNumAggregates(geoData->getNumCoarseNodes());
224 LO numNonAggregatedNodes = geoData->getNumLocalFineNodes();
225 Kokkos::View<unsigned*, device_type> aggStat(
"aggStat", numNonAggregatedNodes);
226 Kokkos::parallel_for(
"StructuredAggregation: initialize aggStat",
227 Kokkos::RangePolicy<execution_space>(0, numNonAggregatedNodes),
228 KOKKOS_LAMBDA(
const LO nodeIdx) {aggStat(nodeIdx) =
READY;});
230 myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
231 numNonAggregatedNodes);
233 *out <<
"numNonAggregatedNodes: " << numNonAggregatedNodes << std::endl;
236 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
237 aggregates->ComputeAggregateSizes(
true);
239 Set(currentLevel,
"Aggregates", aggregates);
243 RCP<CrsGraph> myGraph;
244 myStructuredAlgorithm->BuildGraph(*graph, geoData, dofsPerNode, myGraph);
245 Set(currentLevel,
"prolongatorGraph", myGraph);
248 Set(currentLevel,
"lCoarseNodesPerDim", geoData->getCoarseNodesPerDirArray());
249 Set(currentLevel,
"indexManager", geoData);
250 Set(currentLevel,
"structuredInterpolationOrder", interpolationOrder);
251 Set(currentLevel,
"numDimensions", numDimensions);