126 RCP<const GraphBase> graph;
127 bool use_color_graph = pL.get<
bool>(
"aggregation: coloring: use color graph");
136 ArrayRCP<LO> myColors;
139 RCP<LocalOrdinalVector> fc_splitting;
140 std::string coloringAlgo = pL.get<std::string>(
"aggregation: coloring algorithm");
143#ifdef HAVE_MUELU_ZOLTAN2
144 int numProcs = A->getRowMap()->getComm()->getSize();
145 if(coloringAlgo!=
"file" && numProcs>1 && graph->GetDomainMap()->lib() == Xpetra::UseTpetra)
146 coloringAlgo=
"Zoltan2";
152 int rank = graph->GetDomainMap()->getComm()->getRank();
154 printf(
"[%d,%d] graph local size = %dx%d\n",rank,currentLevel.
GetLevelID(),(
int)graph->GetDomainMap()->getLocalNumElements(),(
int)graph->GetImportMap()->getLocalNumElements());
156 std::ofstream ofs(std::string(
"m_dropped_graph_") + std::to_string(currentLevel.
GetLevelID())+std::string(
"_") + std::to_string(rank) + std::string(
".dat"),std::ofstream::out);
157 RCP<Teuchos::FancyOStream> fancy = Teuchos::fancyOStream(Teuchos::rcpFromRef(ofs));
158 graph->print(*fancy,
Debug);
161 A->getRowMap()->getComm()->barrier();
169 if(coloringAlgo!=
"file" && graph->GetDomainMap()->lib() == Xpetra::UseEpetra)
173 if(coloringAlgo ==
"file") {
176 std::string map_file = std::string(
"map_fcsplitting_") + std::to_string(currentLevel.
GetLevelID()) + std::string(
".m");
177 std::string color_file = std::string(
"fcsplitting_") + std::to_string(currentLevel.
GetLevelID()) + std::string(
".m");
179 FILE * mapfile = fopen(map_file.c_str(),
"r");
180 using real_type =
typename Teuchos::ScalarTraits<SC>::magnitudeType;
181 using RealValuedMultiVector =
typename Xpetra::MultiVector<real_type,LO,GO,NO>;
182 RCP<RealValuedMultiVector> mv;
185 GetOStream(
Statistics1) <<
"Reading FC splitting from " << color_file <<
", using map file " << map_file <<
". On rank " << A->getRowMap()->getComm()->getRank() <<
" local size is " << A->getRowMap()->getLocalNumElements() << std::endl;
188 RCP<const Map> colorMap = Xpetra::IO<Scalar, LocalOrdinal, GlobalOrdinal, Node>::ReadMap(map_file, A->getRowMap()->lib(), A->getRowMap()->getComm());
189 TEUCHOS_TEST_FOR_EXCEPTION(!colorMap->isCompatible(*A->getRowMap()),std::invalid_argument,
"Coloring on disk has incompatible map with A");
191 mv = Xpetra::IO<real_type, LocalOrdinal, GlobalOrdinal, Node>::ReadMultiVector(color_file,colorMap);
195 mv = Xpetra::IO<real_type, LocalOrdinal, GlobalOrdinal, Node>::ReadMultiVector(color_file,A->getRowMap());
197 TEUCHOS_TEST_FOR_EXCEPTION(mv.is_null(),std::invalid_argument,
"Coloring on disk cannot be read");
198 fc_splitting = LocalOrdinalVectorFactory::Build(A->getRowMap());
199 TEUCHOS_TEST_FOR_EXCEPTION(mv->getLocalLength() != fc_splitting->getLocalLength(),std::invalid_argument,
"Coloring map mismatch");
202 auto boundaryNodes = graph->GetBoundaryNodeMap();
203 ArrayRCP<const real_type> mv_data= mv->getData(0);
204 ArrayRCP<LO> fc_data= fc_splitting->getDataNonConst(0);
205 for(LO i=0; i<(LO)fc_data.size(); i++) {
209 fc_data[i] = Teuchos::as<LO>(mv_data[i]);
212#ifdef HAVE_MUELU_ZOLTAN2
213 else if(coloringAlgo.find(
"Zoltan2")!=std::string::npos && graph->GetDomainMap()->lib() == Xpetra::UseTpetra) {
218 else if(coloringAlgo ==
"MIS" || graph->GetDomainMap()->lib() == Xpetra::UseTpetra) {
220; TEUCHOS_TEST_FOR_EXCEPTION(A->getRowMap()->getComm()->getSize() != 1, std::invalid_argument,
"MIS on more than 1 MPI rank is not supported");
225 TEUCHOS_TEST_FOR_EXCEPTION(A->getRowMap()->getComm()->getSize() != 1, std::invalid_argument,
"KokkosKernels graph coloring on more than 1 MPI rank is not supported");
231 int rank = graph->GetDomainMap()->getComm()->getRank();
233 printf(
"[%d,%d] num colors %d\n",rank,currentLevel.
GetLevelID(),numColors);
235 std::ofstream ofs(std::string(
"m_colors_") + std::to_string(currentLevel.
GetLevelID())+std::string(
"_") + std::to_string(rank) + std::string(
".dat"),std::ofstream::out);
236 RCP<Teuchos::FancyOStream> fancy = Teuchos::fancyOStream(Teuchos::rcpFromRef(ofs));
237 *fancy << myColors();
240 A->getRowMap()->getComm()->barrier();
248 LO num_c_points = 0, num_d_points=0, num_f_points = 0;
249 if(fc_splitting.is_null()) {
251 auto boundaryNodes = graph->GetBoundaryNodeMap();
252 fc_splitting = LocalOrdinalVectorFactory::Build(A->getRowMap());
253 ArrayRCP<LO> myPointType = fc_splitting->getDataNonConst(0);
254 for(LO i=0; i<(LO)myColors.size(); i++) {
255 if(boundaryNodes[i]) {
259 else if ((LO)myColors[i] == 1) {
260 myPointType[i] =
C_PT;
264 myPointType[i] =
F_PT;
266 num_f_points = (LO)myColors.size() - num_d_points - num_c_points;
270 ArrayRCP<LO> myPointType = fc_splitting->getDataNonConst(0);
272 for(LO i=0; i<(LO)myPointType.size(); i++) {
275 else if (myPointType[i] ==
C_PT)
278 num_f_points = (LO)myPointType.size() - num_d_points - num_c_points;
284 GO l_counts[] = {(GO)num_c_points, (GO) num_f_points, (GO) num_d_points};
287 RCP<const Teuchos::Comm<int> > comm = A->getRowMap()->getComm();
288 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, 3, l_counts, g_counts);
289 GetOStream(
Statistics1) <<
"ClassicalMapFactory("<<coloringAlgo<<
"): C/F/D = "<<g_counts[0]<<
"/"<<g_counts[1]<<
"/"<<g_counts[2]<<std::endl;
294 RCP<const Map> coarseMap;
300 Set(currentLevel,
"FC Splitting",fc_splitting);
301 Set(currentLevel,
"CoarseMap", coarseMap);
329 using graph_t =
typename LWGraph_kokkos::local_graph_type;
330 using KernelHandle = KokkosKernels::Experimental::
331 KokkosKernelsHandle<
typename graph_t::row_map_type::value_type,
332 typename graph_t::entries_type::value_type,
333 typename graph_t::entries_type::value_type,
334 typename graph_t::device_type::execution_space,
335 typename graph_t::device_type::memory_space,
336 typename graph_t::device_type::memory_space>;
340 kh.create_graph_coloring_handle();
343 auto coloringHandle = kh.get_graph_coloring_handle();
346 if(pL.get<
bool>(
"aggregation: deterministic") ==
true) {
347 coloringHandle->set_algorithm( KokkosGraph::COLORING_SERIAL );
349 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"serial") {
350 coloringHandle->set_algorithm( KokkosGraph::COLORING_SERIAL );
352 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"vertex based") {
353 coloringHandle->set_algorithm( KokkosGraph::COLORING_VB );
355 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"vertex based bit array") {
356 coloringHandle->set_algorithm( KokkosGraph::COLORING_VBBIT );
358 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"vertex based color set") {
359 coloringHandle->set_algorithm( KokkosGraph::COLORING_VBCS );
361 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"vertex based deterministic") {
362 coloringHandle->set_algorithm( KokkosGraph::COLORING_VBD );
364 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"vertex based deterministic bit array") {
365 coloringHandle->set_algorithm( KokkosGraph::COLORING_VBDBIT );
367 }
else if(pL.get<std::string>(
"aggregation: coloring algorithm") ==
"edge based") {
368 coloringHandle->set_algorithm( KokkosGraph::COLORING_EB );
371 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
"Unrecognized distance 1 coloring algorithm");
377 auto graphLW =
dynamic_cast<const LWGraph*
>(&graph);
378 auto graphG =
dynamic_cast<const Graph*
>(&graph);
379 TEUCHOS_TEST_FOR_EXCEPTION(!graphLW && !graphLWK && !graphG,std::invalid_argument,
"Graph is not a LWGraph or LWGraph_kokkos object");
384 KokkosGraph::Experimental::graph_color(&kh,
387 graphLWK->getLocalLWGraph().getRowPtrs(),
388 graphLWK->getLocalLWGraph().getEntries(),
392 auto rowptrs = graphLW->getRowPtrs();
393 auto entries = graphLW->getEntries();
395 Teuchos::Array<size_t> rowptrs_s(rowptrs.size());
396 std::copy(rowptrs.begin(),rowptrs.end(),rowptrs_s.begin());
397 Kokkos::View<const size_t*,Kokkos::LayoutLeft,Kokkos::HostSpace> rowptrs_v(rowptrs_s.data(),(
size_t)rowptrs.size());
398 Kokkos::View<const LO*,Kokkos::LayoutLeft,Kokkos::HostSpace> entries_v(entries.getRawPtr(),(
size_t)entries.size());
399 KokkosGraph::Experimental::graph_color(&kh,
408 RCP<const CrsGraph> graphC = graphG->GetGraph();
409 size_t numEntries = graphC->getLocalNumEntries();
410 ArrayView<const LO> indices;
411 graphC->getLocalRowView(0,indices);
412 Kokkos::View<size_t*,Kokkos::LayoutLeft,Kokkos::HostSpace> rowptrs_v(
"rowptrs_v",graphC->getLocalNumRows()+1);
414 for(LO i=0; i<(LO)graphC->getLocalNumRows()+1; i++)
415 rowptrs_v[i+1] = rowptrs_v[i] + graphC->getNumEntriesInLocalRow(i);
416 Kokkos::View<const LO*,Kokkos::LayoutLeft,Kokkos::HostSpace> entries_v(&indices[0],numEntries);
417 KokkosGraph::Experimental::graph_color(&kh,
427 auto myColors_d = coloringHandle->get_vertex_colors();
428 numColors =
static_cast<LO
>(coloringHandle->get_num_colors());
431 auto myColors_h = Kokkos::create_mirror_view(myColors_d);
432 myColors_out.resize(myColors_h.size());
433 Kokkos::View<LO*,Kokkos::LayoutLeft,Kokkos::HostSpace> myColors_v(&myColors_out[0],myColors_h.size());
434 Kokkos::deep_copy(myColors_v,myColors_h);
437 kh.destroy_graph_coloring_handle();