137 RCP<Teuchos::FancyOStream> out;
138 if(
const char* dbg = std::getenv(
"MUELU_STRUCTUREDAGGREGATION_DEBUG")) {
139 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
140 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
142 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
145 using device_type =
typename LWGraph_kokkos::local_graph_type::device_type;
146 using execution_space =
typename LWGraph_kokkos::local_graph_type::device_type::execution_space;
147 using memory_space =
typename LWGraph_kokkos::local_graph_type::device_type::memory_space;
149 *out <<
"Entering structured aggregation" << std::endl;
151 ParameterList pL = GetParameterList();
152 bDefinitionPhase_ =
false;
155 RCP<const LWGraph_kokkos> graph = Get<RCP<LWGraph_kokkos> >(currentLevel,
"Graph");
156 RCP<const Map> fineMap = graph->GetDomainMap();
157 const int myRank = fineMap->getComm()->getRank();
158 const LO dofsPerNode = Get<LO>(currentLevel,
"DofsPerNode");
162 const int interpolationOrder = pL.get<
int>(
"aggregation: coarsening order");
163 std::string outputType = pL.get<std::string>(
"aggregation: output type");
164 const bool outputAggregates = (outputType ==
"Aggregates" ? true :
false);
165 Array<LO> lFineNodesPerDir(3);
169 lFineNodesPerDir = currentLevel.
Get<Array<LO> >(
"lNodesPerDim",
NoFactory::get());
173 lFineNodesPerDir = Get<Array<LO> >(currentLevel,
"lNodesPerDim");
174 numDimensions = Get<int>(currentLevel,
"numDimensions");
179 for(
int dim = 0; dim < 3; ++dim) {
180 if(dim >= numDimensions) {
181 lFineNodesPerDir[dim] = 1;
186 std::string coarseningRate = pL.get<std::string>(
"aggregation: coarsening rate");
187 Teuchos::Array<LO> coarseRate;
189 coarseRate = Teuchos::fromStringToArray<LO>(coarseningRate);
190 }
catch(
const Teuchos::InvalidArrayStringRepresentation& e) {
191 GetOStream(
Errors,-1) <<
" *** \"aggregation: coarsening rate\" must be a string convertible into an array! *** "
195 TEUCHOS_TEST_FOR_EXCEPTION((coarseRate.size() > 1) && (coarseRate.size() < numDimensions),
197 "\"aggregation: coarsening rate\" must have at least as many"
198 " components as the number of spatial dimensions in the problem.");
202 interpolationOrder, myRank,
206 *out <<
"The index manager has now been built" << std::endl;
207 TEUCHOS_TEST_FOR_EXCEPTION(fineMap->getLocalNumElements()
208 !=
static_cast<size_t>(geoData->getNumLocalFineNodes()),
210 "The local number of elements in the graph's map is not equal to "
211 "the number of nodes given by: lNodesPerDim!");
215 RCP<AggregationStructuredAlgorithm_kokkos> myStructuredAlgorithm
218 if(interpolationOrder == 0 && outputAggregates){
219 RCP<Aggregates_kokkos> aggregates = rcp(
new Aggregates_kokkos(graph->GetDomainMap()));
220 aggregates->setObjectLabel(
"ST");
221 aggregates->SetIndexManager(geoData);
222 aggregates->AggregatesCrossProcessors(
false);
223 aggregates->SetNumAggregates(geoData->getNumCoarseNodes());
225 LO numNonAggregatedNodes = geoData->getNumLocalFineNodes();
226 Kokkos::View<unsigned*, device_type> aggStat(
"aggStat", numNonAggregatedNodes);
227 Kokkos::parallel_for(
"StructuredAggregation: initialize aggStat",
228 Kokkos::RangePolicy<execution_space>(0, numNonAggregatedNodes),
229 KOKKOS_LAMBDA(
const LO nodeIdx) {aggStat(nodeIdx) =
READY;});
231 myStructuredAlgorithm->BuildAggregates(pL, *graph, *aggregates, aggStat,
232 numNonAggregatedNodes);
234 *out <<
"numNonAggregatedNodes: " << numNonAggregatedNodes << std::endl;
237 "MueLu::StructuredAggregationFactory::Build: Leftover nodes found! Error!");
238 aggregates->ComputeAggregateSizes(
true);
239 GetOStream(
Statistics1) << aggregates->description() << std::endl;
240 Set(currentLevel,
"Aggregates", aggregates);
244 RCP<CrsGraph> myGraph;
245 myStructuredAlgorithm->BuildGraph(*graph, geoData, dofsPerNode, myGraph);
246 Set(currentLevel,
"prolongatorGraph", myGraph);
249 Set(currentLevel,
"lCoarseNodesPerDim", geoData->getCoarseNodesPerDirArray());
250 Set(currentLevel,
"indexManager", geoData);
251 Set(currentLevel,
"structuredInterpolationOrder", interpolationOrder);
252 Set(currentLevel,
"numDimensions", numDimensions);