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 SC,
typename LO,
typename GO,
typename NO>
18 Teuchos::RCP<const typename Tpetra::CrsMatrix<SC, LO, GO, NO>::crs_graph_type>
19 get_graph(
const Teuchos::RCP<Tpetra::CrsMatrix<SC, LO, GO, NO> > &matrix) {
20 return matrix->getCrsGraph();
23 template <
typename SC,
typename LO,
typename GO,
typename NO>
24 Teuchos::RCP<const typename Tpetra::BlockCrsMatrix<SC, LO, GO, NO>::crs_graph_type>
25 get_graph(
const Teuchos::RCP<Tpetra::BlockCrsMatrix<SC, LO, GO, NO> > &matrix) {
26 using crs_graph_t =
typename Tpetra::BlockCrsMatrix<SC, LO, GO, NO>::crs_graph_type;
27 return Teuchos::rcp(
new crs_graph_t(matrix->getCrsGraph()));
34 template <
typename CrsMatrixType>
40 typedef typename matrix_t::crs_graph_type
graph_t;
41 typedef typename matrix_t::scalar_type
scalar_t;
42 typedef typename matrix_t::local_ordinal_type
lno_t;
43 typedef typename matrix_t::global_ordinal_type
gno_t;
44 typedef typename matrix_t::node_type
node_t;
52 : matrix(matrix_), graph(Impl::
get_graph(matrix_))
61 Teuchos::ParameterList &coloring_params,
68 const Teuchos::RCP<const matrix_t> matrix;
69 const Teuchos::RCP<const graph_t> graph;
78 Teuchos::RCP<const graph_t> graph, trans_graph;
79 Teuchos::Array<int> col_procs, trans_col_procs;
87 const Teuchos::RCP<const graph_t> &graph_,
88 const Teuchos::RCP<const graph_t> &trans_graph_ = Teuchos::null)
91 trans_graph = trans_graph_;
92 col_procs.resize(graph->getColMap()->getLocalNumElements());
93 auto gids = graph->getColMap()->getLocalElementList();
95 Tpetra::LookupStatus ret =
96 graph->getRowMap()->getRemoteIndexList(gids, col_procs());
97 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent, std::logic_error,
98 "Zoltan2::CrsColorer: getRemoteIndexList() "
101 if (trans_graph != Teuchos::null)
103 trans_col_procs.resize(trans_graph->getColMap()->getLocalNumElements());
104 gids = trans_graph->getColMap()->getLocalElementList();
105 ret = trans_graph->getRowMap()->getRemoteIndexList(gids,
107 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent,
109 "Zoltan2::CrsColorer getRemoteIndexList() "
117 get_number_of_vertices(
void *data,
int *ierr);
125 ZOLTAN_ID_PTR global_ids,
126 ZOLTAN_ID_PTR local_ids,
137 ZOLTAN_ID_PTR global_id,
138 ZOLTAN_ID_PTR local_id,
147 ZOLTAN_ID_PTR global_id,
148 ZOLTAN_ID_PTR local_id,
149 ZOLTAN_ID_PTR nbor_global_ids,
161 sym_get_number_of_vertices(
void *data,
int *ierr);
169 ZOLTAN_ID_PTR global_ids,
170 ZOLTAN_ID_PTR local_ids,
177 sym_get_number_of_edges(
181 ZOLTAN_ID_PTR global_id,
182 ZOLTAN_ID_PTR local_id,
191 ZOLTAN_ID_PTR global_id,
192 ZOLTAN_ID_PTR local_id,
193 ZOLTAN_ID_PTR nbor_global_ids,
201 template <
typename CrsMatrixType>
204 Teuchos::ParameterList &coloring_params,
212 const std::string matrixType = coloring_params.get(
"matrixType",
"Jacobian");
213 const bool symmetric = coloring_params.get(
"symmetric",
214 (matrixType ==
"Jacobian" ?
false
218 const bool symmetrize = coloring_params.get<
bool>(
"symmetrize",
false);
221 Teuchos::RCP<const Teuchos::Comm<int>> comm =
222 this->graph->getRowMap()->getComm();
223 #ifdef HAVE_ZOLTAN2_MPI
224 Teuchos::RCP<const Teuchos::MpiComm<int>> tmpicomm =
225 Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int>>(comm,
true);
226 MPI_Comm mpicomm = *tmpicomm->getRawMpiComm();
231 MPI_Initialized(&flag);
235 MPI_Init(&narg, &argv);
238 MPI_Comm mpicomm = MPI_COMM_WORLD;
242 Zoltan *zz =
new Zoltan(mpicomm);
243 if (symmetric || symmetrize) {
244 zz->Set_Param(
"COLORING_PROBLEM",
"DISTANCE-2");
247 zz->Set_Param(
"COLORING_PROBLEM",
"PARTIAL-DISTANCE-2");
250 if (!symmetric && symmetrize)
251 zz->Set_Param(
"GRAPH_SYMMETRIZE",
"TRANSPOSE");
253 zz->Set_Param(
"DEBUG_LEVEL",
"0");
256 Teuchos::ParameterList &zoltan_params = coloring_params.sublist(
"Zoltan");
257 for (
auto p : zoltan_params)
258 zz->Set_Param(p.first, Teuchos::getValue<std::string>(p.second));
261 Teuchos::RCP<const graph_t> transpose_graph;
262 if (!symmetric && !symmetrize)
269 if (symmetric || symmetrize)
271 zd.setGraphs(this->graph);
272 zz->Set_Num_Obj_Fn(sym_get_number_of_vertices, &zd);
273 zz->Set_Obj_List_Fn(sym_get_vertex_list, &zd);
274 zz->Set_Num_Edges_Fn(sym_get_number_of_edges, &zd);
275 zz->Set_Edge_List_Fn(sym_get_edge_list, &zd);
279 zd.setGraphs(this->graph, transpose_graph);
280 zz->Set_Num_Obj_Fn(get_number_of_vertices, &zd);
281 zz->Set_Obj_List_Fn(get_vertex_list, &zd);
282 zz->Set_Num_Edges_Fn(get_number_of_edges, &zd);
283 zz->Set_Edge_List_Fn(get_edge_list, &zd);
288 const size_t num_local_cols = this->graph->getLocalNumCols();
289 const size_t num_global_rows = std::max(
290 static_cast<typename CrsMatrixType::global_ordinal_type>(
291 this->graph->getGlobalNumRows()),
292 this->graph->getRowMap()->getMaxAllGlobalIndex()+1);
294 Teuchos::Array<ZOLTAN_ID_TYPE> col_gids(num_local_cols);
295 auto gids = this->graph->getColMap()->getLocalElementList();
297 if (symmetric || symmetrize)
298 for (
size_t i = 0; i < num_local_cols; ++i)
299 col_gids[i] = gids[i];
301 for (
size_t i = 0; i < num_local_cols; ++i)
302 col_gids[i] = gids[i] + num_global_rows;
306 list_of_colors_host = Kokkos::create_mirror_view(my_list_of_colors);
308 int num_gid_entries = 1;
309 int ret = zz->Color(num_gid_entries, num_local_cols, col_gids.getRawPtr(),
310 list_of_colors_host.data());
312 TEUCHOS_TEST_FOR_EXCEPTION(ret != ZOLTAN_OK, std::logic_error,
313 "Zoltan::Color returned " << ret << std::endl);
315 Kokkos::deep_copy(my_list_of_colors, list_of_colors_host);
316 list_of_colors = my_list_of_colors;
318 const bool dump_zoltan = coloring_params.get(
"Dump Zoltan Data",
false);
321 std::string zoltan_dump_file =
322 coloring_params.get(
"Zoltan Dump File Name",
"zoltan_graph.txt");
323 zz->Generate_Files(zoltan_dump_file, 0, 0, 1, 0);
329 int local_num_colors = 0;
330 Kokkos::parallel_reduce(
"ZoltanCrsColorer::find_num_colors",
331 Kokkos::RangePolicy<execution_space>(0, num_local_cols),
332 KOKKOS_LAMBDA(
const size_t i,
int &lcl_max) {
333 if (my_list_of_colors[i] > lcl_max)
334 lcl_max = my_list_of_colors[i];
336 Kokkos::Max<int>(local_num_colors));
338 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, 1, &local_num_colors,
343 template <
typename CrsMatrixType>
347 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
349 return zoltan_data->graph->getLocalNumRows() +
350 zoltan_data->trans_graph->getLocalNumRows();
354 template <
typename CrsMatrixType>
356 ZoltanCrsColorer<CrsMatrixType>::get_vertex_list(
360 ZOLTAN_ID_PTR global_ids,
361 ZOLTAN_ID_PTR local_ids,
366 assert(sizeGID == 1 && sizeLID == 1);
368 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
371 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
372 const size_t num_local_cols = zoltan_data->trans_graph->getLocalNumRows();
373 const size_t num_global_rows = std::max(
374 static_cast<typename CrsMatrixType::global_ordinal_type>(
375 zoltan_data->graph->getGlobalNumRows()),
376 zoltan_data->graph->getRowMap()->getMaxAllGlobalIndex()+1);
377 auto row_gids = zoltan_data->graph->getRowMap()->getLocalElementList();
378 auto col_gids = zoltan_data->trans_graph->getRowMap()->getLocalElementList();
380 for (
size_t i = 0; i < num_local_rows; ++i)
383 global_ids[i] = row_gids[i];
385 for (
size_t i = 0; i < num_local_cols; ++i)
387 local_ids[num_local_rows + i] = num_local_rows + i;
388 global_ids[num_local_rows + i] = num_global_rows + col_gids[i];
393 template <
typename CrsMatrixType>
395 ZoltanCrsColorer<CrsMatrixType>::get_number_of_edges(
399 ZOLTAN_ID_PTR global_id,
400 ZOLTAN_ID_PTR local_id,
403 assert(sizeGID == 1 && sizeLID == 1);
405 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
408 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
409 const ZOLTAN_ID_TYPE lid = *local_id;
412 if (lid < num_local_rows)
413 num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
416 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid - num_local_rows);
422 template <
typename CrsMatrixType>
424 ZoltanCrsColorer<CrsMatrixType>::get_edge_list(
428 ZOLTAN_ID_PTR global_id,
429 ZOLTAN_ID_PTR local_id,
430 ZOLTAN_ID_PTR nbor_global_ids,
436 using Teuchos::Array;
437 using Teuchos::ArrayView;
438 using Teuchos::arrayView;
440 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
443 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
444 const size_t num_global_rows = std::max(
445 static_cast<typename CrsMatrixType::global_ordinal_type>(
446 zoltan_data->graph->getGlobalNumRows()),
447 zoltan_data->graph->getRowMap()->getMaxAllGlobalIndex()+1);
448 const ZOLTAN_ID_TYPE lid = *local_id;
450 if (lid < num_local_rows)
452 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
453 const auto colMap = zoltan_data->graph->getColMap();
455 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
456 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
458 for (
int j = 0; j < num_nbr; ++j) {
459 nbor_global_ids[j] = num_global_rows
460 + colMap->getGlobalElement(lcl_ids[j]);
461 nbor_procs[j] = zoltan_data->col_procs[lcl_ids[j]];
467 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid-num_local_rows);
468 const auto colMap = zoltan_data->trans_graph->getColMap();
470 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
471 zoltan_data->trans_graph->getLocalRowView(lid - num_local_rows, lcl_ids);
472 for (
int j = 0; j < num_nbr; ++j)
474 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
475 nbor_procs[j] = zoltan_data->trans_col_procs[lcl_ids[j]];
481 template <
typename CrsMatrixType>
483 ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_vertices(
487 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
489 return zoltan_data->graph->getLocalNumRows();
493 template <
typename CrsMatrixType>
495 ZoltanCrsColorer<CrsMatrixType>::sym_get_vertex_list(
499 ZOLTAN_ID_PTR global_ids,
500 ZOLTAN_ID_PTR local_ids,
505 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
508 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
509 auto row_gids = zoltan_data->graph->getRowMap()->getLocalElementList();
510 for (
size_t i = 0; i < num_local_rows; ++i)
513 global_ids[i] = row_gids[i];
518 template <
typename CrsMatrixType>
520 ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_edges(
524 ZOLTAN_ID_PTR global_id,
525 ZOLTAN_ID_PTR local_id,
528 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
531 const ZOLTAN_ID_TYPE lid = *local_id;
532 int num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
537 template <
typename CrsMatrixType>
539 ZoltanCrsColorer<CrsMatrixType>::sym_get_edge_list(
543 ZOLTAN_ID_PTR global_id,
544 ZOLTAN_ID_PTR local_id,
545 ZOLTAN_ID_PTR nbor_global_ids,
551 using Teuchos::Array;
552 using Teuchos::ArrayView;
553 using Teuchos::arrayView;
555 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
558 const ZOLTAN_ID_TYPE lid = *local_id;
559 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
561 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
562 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
563 const auto colMap = zoltan_data->graph->getColMap();
565 for (
int j = 0; j < num_nbr; ++j)
567 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
568 nbor_procs[j] = zoltan_data->col_procs[lcl_ids[j]];
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
Teuchos::RCP< const typename Tpetra::CrsMatrix< SC, LO, GO, NO >::crs_graph_type > get_graph(const Teuchos::RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > &matrix)
list_of_colors_t::HostMirror list_of_colors_host_t
node_t::device_type device_t
matrix_t::global_ordinal_type gno_t
Kokkos::View< int *, device_t > list_of_colors_t
matrix_t::node_type node_t
Teuchos::RCP< Tpetra::CrsGraph< LO, GO, NO > > compute_transpose_graph(const Tpetra::CrsGraph< LO, GO, NO > &graph)
matrix_t::scalar_type scalar_t
device_t::execution_space execution_space
ZoltanCrsColorer(const Teuchos::RCP< matrix_t > &matrix_)
matrix_t::crs_graph_type graph_t
matrix_t::local_ordinal_type lno_t