5 #include "Teuchos_Array.hpp"
6 #include "Teuchos_ArrayView.hpp"
7 #include "Teuchos_TestForException.hpp"
8 #include "Teuchos_DefaultMpiComm.hpp"
10 #include "zoltan_cpp.h"
17 template <
typename CrsMatrixType>
23 typedef typename matrix_t::crs_graph_type
graph_t;
24 typedef typename matrix_t::scalar_type
scalar_t;
25 typedef typename matrix_t::local_ordinal_type
lno_t;
26 typedef typename matrix_t::global_ordinal_type
gno_t;
27 typedef typename matrix_t::node_type
node_t;
35 : matrix(matrix_), graph(matrix_->getCrsGraph()), transpose_graph()
44 Teuchos::ParameterList &coloring_params,
51 const Teuchos::RCP<const matrix_t> matrix;
52 const Teuchos::RCP<const graph_t> graph;
53 Teuchos::RCP<const graph_t> transpose_graph;
62 Teuchos::RCP<const graph_t> graph, trans_graph;
63 Teuchos::Array<int> col_procs, trans_col_procs;
71 const Teuchos::RCP<const graph_t> &graph_,
72 const Teuchos::RCP<const graph_t> &trans_graph_ = Teuchos::null)
75 trans_graph = trans_graph_;
76 col_procs.resize(graph->getColMap()->getNodeNumElements());
77 auto gids = graph->getColMap()->getNodeElementList();
79 Tpetra::LookupStatus ret =
80 graph->getRowMap()->getRemoteIndexList(gids, col_procs());
81 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent, std::logic_error,
82 "Zoltan2::CrsColorer: getRemoteIndexList() "
85 if (trans_graph != Teuchos::null)
87 trans_col_procs.resize(trans_graph->getColMap()->getNodeNumElements());
88 gids = trans_graph->getColMap()->getNodeElementList();
89 ret = trans_graph->getRowMap()->getRemoteIndexList(gids,
91 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent,
93 "Zoltan2::CrsColorer getRemoteIndexList() "
101 get_number_of_vertices(
void *data,
int *ierr);
109 ZOLTAN_ID_PTR global_ids,
110 ZOLTAN_ID_PTR local_ids,
121 ZOLTAN_ID_PTR global_id,
122 ZOLTAN_ID_PTR local_id,
131 ZOLTAN_ID_PTR global_id,
132 ZOLTAN_ID_PTR local_id,
133 ZOLTAN_ID_PTR nbor_global_ids,
145 sym_get_number_of_vertices(
void *data,
int *ierr);
153 ZOLTAN_ID_PTR global_ids,
154 ZOLTAN_ID_PTR local_ids,
161 sym_get_number_of_edges(
165 ZOLTAN_ID_PTR global_id,
166 ZOLTAN_ID_PTR local_id,
175 ZOLTAN_ID_PTR global_id,
176 ZOLTAN_ID_PTR local_id,
177 ZOLTAN_ID_PTR nbor_global_ids,
185 template <
typename CrsMatrixType>
188 Teuchos::ParameterList &coloring_params,
196 const std::string matrixType = coloring_params.get(
"matrixType",
"Jacobian");
197 const bool symmetric = coloring_params.get(
"symmetric",
198 (matrixType ==
"Jacobian" ?
false
202 const bool symmetrize = coloring_params.get<
bool>(
"symmetrize",
false);
205 Teuchos::RCP<const Teuchos::Comm<int>> comm =
206 this->graph->getRowMap()->getComm();
207 #ifdef HAVE_ZOLTAN2_MPI
208 Teuchos::RCP<const Teuchos::MpiComm<int>> tmpicomm =
209 Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int>>(comm,
true);
210 MPI_Comm mpicomm = *tmpicomm->getRawMpiComm();
215 MPI_Initialized(&flag);
219 MPI_Init(&narg, &argv);
222 MPI_Comm mpicomm = MPI_COMM_WORLD;
226 Zoltan *zz =
new Zoltan(mpicomm);
227 if (symmetric || symmetrize) {
228 zz->Set_Param(
"COLORING_PROBLEM",
"DISTANCE-2");
231 zz->Set_Param(
"COLORING_PROBLEM",
"PARTIAL-DISTANCE-2");
234 if (!symmetric && symmetrize)
235 zz->Set_Param(
"GRAPH_SYMMETRIZE",
"TRANSPOSE");
237 zz->Set_Param(
"DEBUG_LEVEL",
"0");
240 Teuchos::ParameterList &zoltan_params = coloring_params.sublist(
"Zoltan");
241 for (
auto p : zoltan_params)
242 zz->Set_Param(p.first, Teuchos::getValue<std::string>(p.second));
245 Teuchos::RCP<const graph_t> transpose_graph;
246 if (!symmetric && !symmetrize)
253 if (symmetric || symmetrize)
255 zd.setGraphs(this->graph);
256 zz->Set_Num_Obj_Fn(sym_get_number_of_vertices, &zd);
257 zz->Set_Obj_List_Fn(sym_get_vertex_list, &zd);
258 zz->Set_Num_Edges_Fn(sym_get_number_of_edges, &zd);
259 zz->Set_Edge_List_Fn(sym_get_edge_list, &zd);
263 zd.setGraphs(this->graph, transpose_graph);
264 zz->Set_Num_Obj_Fn(get_number_of_vertices, &zd);
265 zz->Set_Obj_List_Fn(get_vertex_list, &zd);
266 zz->Set_Num_Edges_Fn(get_number_of_edges, &zd);
267 zz->Set_Edge_List_Fn(get_edge_list, &zd);
272 const size_t num_local_cols = this->graph->getNodeNumCols();
273 const size_t num_global_rows = this->graph->getGlobalNumRows();
275 Teuchos::Array<ZOLTAN_ID_TYPE> col_gids(num_local_cols);
276 auto gids = this->graph->getColMap()->getNodeElementList();
278 if (symmetric || symmetrize)
279 for (
size_t i = 0; i < num_local_cols; ++i)
280 col_gids[i] = gids[i];
282 for (
size_t i = 0; i < num_local_cols; ++i)
283 col_gids[i] = gids[i] + num_global_rows;
287 list_of_colors_host = Kokkos::create_mirror_view(my_list_of_colors);
289 int num_gid_entries = 1;
290 int ret = zz->Color(num_gid_entries, num_local_cols, col_gids.getRawPtr(),
291 list_of_colors_host.data());
293 TEUCHOS_TEST_FOR_EXCEPTION(ret != ZOLTAN_OK, std::logic_error,
294 "Zoltan::Color returned " << ret << std::endl);
296 Kokkos::deep_copy(my_list_of_colors, list_of_colors_host);
297 list_of_colors = my_list_of_colors;
299 const bool dump_zoltan = coloring_params.get(
"Dump Zoltan Data",
false);
302 std::string zoltan_dump_file =
303 coloring_params.get(
"Zoltan Dump File Name",
"zoltan_graph.txt");
304 zz->Generate_Files(zoltan_dump_file, 0, 0, 1, 0);
310 int local_num_colors = 0;
311 Kokkos::parallel_reduce(
"ZoltanCrsColorer::find_num_colors",
312 Kokkos::RangePolicy<execution_space>(0, num_local_cols),
313 KOKKOS_LAMBDA(
const size_t i,
int &lcl_max) {
314 if (my_list_of_colors[i] > lcl_max)
315 lcl_max = my_list_of_colors[i];
317 Kokkos::Max<int>(local_num_colors));
319 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, 1, &local_num_colors,
324 template <
typename CrsMatrixType>
328 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
330 return zoltan_data->graph->getNodeNumRows() +
331 zoltan_data->trans_graph->getNodeNumRows();
335 template <
typename CrsMatrixType>
337 ZoltanCrsColorer<CrsMatrixType>::get_vertex_list(
341 ZOLTAN_ID_PTR global_ids,
342 ZOLTAN_ID_PTR local_ids,
347 assert(sizeGID == 1 && sizeLID == 1);
349 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
352 const size_t num_local_rows = zoltan_data->graph->getNodeNumRows();
353 const size_t num_local_cols = zoltan_data->trans_graph->getNodeNumRows();
354 const size_t num_global_rows = zoltan_data->graph->getGlobalNumRows();
355 auto row_gids = zoltan_data->graph->getRowMap()->getNodeElementList();
356 auto col_gids = zoltan_data->trans_graph->getRowMap()->getNodeElementList();
358 for (
size_t i = 0; i < num_local_rows; ++i)
361 global_ids[i] = row_gids[i];
363 for (
size_t i = 0; i < num_local_cols; ++i)
365 local_ids[num_local_rows + i] = num_local_rows + i;
366 global_ids[num_local_rows + i] = num_global_rows + col_gids[i];
371 template <
typename CrsMatrixType>
373 ZoltanCrsColorer<CrsMatrixType>::get_number_of_edges(
377 ZOLTAN_ID_PTR global_id,
378 ZOLTAN_ID_PTR local_id,
381 assert(sizeGID == 1 && sizeLID == 1);
383 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
386 const size_t num_local_rows = zoltan_data->graph->getNodeNumRows();
387 const ZOLTAN_ID_TYPE lid = *local_id;
390 if (lid < num_local_rows)
391 num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
394 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid - num_local_rows);
400 template <
typename CrsMatrixType>
402 ZoltanCrsColorer<CrsMatrixType>::get_edge_list(
406 ZOLTAN_ID_PTR global_id,
407 ZOLTAN_ID_PTR local_id,
408 ZOLTAN_ID_PTR nbor_global_ids,
414 using Teuchos::Array;
415 using Teuchos::ArrayView;
416 using Teuchos::arrayView;
418 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
421 const size_t num_local_rows = zoltan_data->graph->getNodeNumRows();
422 const size_t num_global_rows = zoltan_data->graph->getGlobalNumRows();
423 const ZOLTAN_ID_TYPE lid = *local_id;
425 if (lid < num_local_rows)
427 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
428 const auto colMap = zoltan_data->graph->getColMap();
430 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
431 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
433 for (
int j = 0; j < num_nbr; ++j) {
434 nbor_global_ids[j] = num_global_rows
435 + colMap->getGlobalElement(lcl_ids[j]);
436 nbor_procs[j] = zoltan_data->col_procs[lcl_ids[j]];
442 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid-num_local_rows);
443 const auto colMap = zoltan_data->trans_graph->getColMap();
445 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
446 zoltan_data->trans_graph->getLocalRowView(lid - num_local_rows, lcl_ids);
447 for (
int j = 0; j < num_nbr; ++j)
449 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
450 nbor_procs[j] = zoltan_data->trans_col_procs[lcl_ids[j]];
456 template <
typename CrsMatrixType>
458 ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_vertices(
462 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
464 return zoltan_data->graph->getNodeNumRows();
468 template <
typename CrsMatrixType>
470 ZoltanCrsColorer<CrsMatrixType>::sym_get_vertex_list(
474 ZOLTAN_ID_PTR global_ids,
475 ZOLTAN_ID_PTR local_ids,
480 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
483 const size_t num_local_rows = zoltan_data->graph->getNodeNumRows();
484 auto row_gids = zoltan_data->graph->getRowMap()->getNodeElementList();
485 for (
size_t i = 0; i < num_local_rows; ++i)
488 global_ids[i] = row_gids[i];
493 template <
typename CrsMatrixType>
495 ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_edges(
499 ZOLTAN_ID_PTR global_id,
500 ZOLTAN_ID_PTR local_id,
503 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
506 const ZOLTAN_ID_TYPE lid = *local_id;
507 int num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
512 template <
typename CrsMatrixType>
514 ZoltanCrsColorer<CrsMatrixType>::sym_get_edge_list(
518 ZOLTAN_ID_PTR global_id,
519 ZOLTAN_ID_PTR local_id,
520 ZOLTAN_ID_PTR nbor_global_ids,
526 using Teuchos::Array;
527 using Teuchos::ArrayView;
528 using Teuchos::arrayView;
530 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
533 const ZOLTAN_ID_TYPE lid = *local_id;
534 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
536 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
537 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
538 const auto colMap = zoltan_data->graph->getColMap();
540 for (
int j = 0; j < num_nbr; ++j)
542 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
543 nbor_procs[j] = zoltan_data->col_procs[lcl_ids[j]];
matrix_t::scalar_type scalar_t
ZoltanCrsColorer(const Teuchos::RCP< matrix_t > &matrix_)
node_t::device_type device_t
void computeColoring(Teuchos::ParameterList &coloring_params, int &num_colors, list_of_colors_host_t &list_of_colors_host, list_of_colors_t &list_of_colors) const
Kokkos::View< int *, device_t > list_of_colors_t
matrix_t::global_ordinal_type gno_t
device_t::execution_space execution_space
matrix_t::node_type node_t
matrix_t::crs_graph_type graph_t
matrix_t::local_ordinal_type lno_t
list_of_colors_t::HostMirror list_of_colors_host_t
Teuchos::RCP< Tpetra::CrsGraph< LO, GO, NO > > compute_transpose_graph(const Tpetra::CrsGraph< LO, GO, NO > &graph)
Created by mbenlioglu on Aug 31, 2020.