14#include "Teuchos_Array.hpp"
15#include "Teuchos_ArrayView.hpp"
16#include "Teuchos_TestForException.hpp"
17#include "Teuchos_DefaultMpiComm.hpp"
19#include "zoltan_cpp.h"
26 template <
typename SC,
typename LO,
typename GO,
typename NO>
27 Teuchos::RCP<const typename Tpetra::CrsMatrix<SC, LO, GO, NO>::crs_graph_type>
28 get_graph(
const Teuchos::RCP<Tpetra::CrsMatrix<SC, LO, GO, NO> > &matrix) {
29 return matrix->getCrsGraph();
32 template <
typename SC,
typename LO,
typename GO,
typename NO>
33 Teuchos::RCP<const typename Tpetra::BlockCrsMatrix<SC, LO, GO, NO>::crs_graph_type>
34 get_graph(
const Teuchos::RCP<Tpetra::BlockCrsMatrix<SC, LO, GO, NO> > &matrix) {
35 using crs_graph_t =
typename Tpetra::BlockCrsMatrix<SC, LO, GO, NO>::crs_graph_type;
36 return Teuchos::rcp(
new crs_graph_t(matrix->getCrsGraph()));
43template <
typename CrsMatrixType>
49 typedef typename matrix_t::crs_graph_type
graph_t;
50 typedef typename matrix_t::scalar_type
scalar_t;
51 typedef typename matrix_t::local_ordinal_type
lno_t;
52 typedef typename matrix_t::global_ordinal_type
gno_t;
53 typedef typename matrix_t::node_type
node_t;
61 : matrix(matrix_), graph(Impl::get_graph(matrix_))
70 Teuchos::ParameterList &coloring_params,
77 const Teuchos::RCP<const matrix_t> matrix;
78 const Teuchos::RCP<const graph_t> graph;
87 Teuchos::RCP<const graph_t> graph, trans_graph;
88 Teuchos::Array<int> col_procs, trans_col_procs;
96 const Teuchos::RCP<const graph_t> &graph_,
97 const Teuchos::RCP<const graph_t> &trans_graph_ = Teuchos::null)
100 trans_graph = trans_graph_;
101 col_procs.resize(graph->getColMap()->getLocalNumElements());
102 auto gids = graph->getColMap()->getLocalElementList();
104 Tpetra::LookupStatus ret =
105 graph->getRowMap()->getRemoteIndexList(gids, col_procs());
106 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent, std::logic_error,
107 "Zoltan2::CrsColorer: getRemoteIndexList() "
110 if (trans_graph != Teuchos::null)
112 trans_col_procs.resize(trans_graph->getColMap()->getLocalNumElements());
113 gids = trans_graph->getColMap()->getLocalElementList();
114 ret = trans_graph->getRowMap()->getRemoteIndexList(gids,
116 TEUCHOS_TEST_FOR_EXCEPTION(ret != Tpetra::AllIDsPresent,
118 "Zoltan2::CrsColorer getRemoteIndexList() "
126 get_number_of_vertices(
void *data,
int *ierr);
134 ZOLTAN_ID_PTR global_ids,
135 ZOLTAN_ID_PTR local_ids,
146 ZOLTAN_ID_PTR global_id,
147 ZOLTAN_ID_PTR local_id,
156 ZOLTAN_ID_PTR global_id,
157 ZOLTAN_ID_PTR local_id,
158 ZOLTAN_ID_PTR nbor_global_ids,
170 sym_get_number_of_vertices(
void *data,
int *ierr);
178 ZOLTAN_ID_PTR global_ids,
179 ZOLTAN_ID_PTR local_ids,
186 sym_get_number_of_edges(
190 ZOLTAN_ID_PTR global_id,
191 ZOLTAN_ID_PTR local_id,
200 ZOLTAN_ID_PTR global_id,
201 ZOLTAN_ID_PTR local_id,
202 ZOLTAN_ID_PTR nbor_global_ids,
210template <
typename CrsMatrixType>
213 Teuchos::ParameterList &coloring_params,
221 const std::string matrixType = coloring_params.get(
"matrixType",
"Jacobian");
222 const bool symmetric = coloring_params.get(
"symmetric",
223 (matrixType ==
"Jacobian" ?
false
227 const bool symmetrize = coloring_params.get<
bool>(
"symmetrize",
false);
230 Teuchos::RCP<const Teuchos::Comm<int>> comm =
231 this->graph->getRowMap()->getComm();
232#ifdef HAVE_ZOLTAN2_MPI
233 Teuchos::RCP<const Teuchos::MpiComm<int>> tmpicomm =
234 Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int>>(comm,
true);
235 MPI_Comm mpicomm = *tmpicomm->getRawMpiComm();
240 MPI_Initialized(&flag);
244 MPI_Init(&narg, &argv);
247 MPI_Comm mpicomm = MPI_COMM_WORLD;
251 Zoltan *zz =
new Zoltan(mpicomm);
252 if (symmetric || symmetrize) {
253 zz->Set_Param(
"COLORING_PROBLEM",
"DISTANCE-2");
256 zz->Set_Param(
"COLORING_PROBLEM",
"PARTIAL-DISTANCE-2");
259 if (!symmetric && symmetrize)
260 zz->Set_Param(
"GRAPH_SYMMETRIZE",
"TRANSPOSE");
262 zz->Set_Param(
"DEBUG_LEVEL",
"0");
265 Teuchos::ParameterList &zoltan_params = coloring_params.sublist(
"Zoltan");
266 for (
auto p : zoltan_params)
267 zz->Set_Param(p.first, Teuchos::getValue<std::string>(p.second));
270 Teuchos::RCP<const graph_t> transpose_graph;
271 if (!symmetric && !symmetrize)
278 if (symmetric || symmetrize)
280 zd.setGraphs(this->graph);
281 zz->Set_Num_Obj_Fn(sym_get_number_of_vertices, &zd);
282 zz->Set_Obj_List_Fn(sym_get_vertex_list, &zd);
283 zz->Set_Num_Edges_Fn(sym_get_number_of_edges, &zd);
284 zz->Set_Edge_List_Fn(sym_get_edge_list, &zd);
288 zd.setGraphs(this->graph, transpose_graph);
289 zz->Set_Num_Obj_Fn(get_number_of_vertices, &zd);
290 zz->Set_Obj_List_Fn(get_vertex_list, &zd);
291 zz->Set_Num_Edges_Fn(get_number_of_edges, &zd);
292 zz->Set_Edge_List_Fn(get_edge_list, &zd);
297 const size_t num_local_cols = this->graph->getLocalNumCols();
298 const size_t num_global_rows = std::max(
299 static_cast<typename CrsMatrixType::global_ordinal_type
>(
300 this->graph->getGlobalNumRows()),
301 this->graph->getRowMap()->getMaxAllGlobalIndex()+1);
303 Teuchos::Array<ZOLTAN_ID_TYPE> col_gids(num_local_cols);
304 auto gids = this->graph->getColMap()->getLocalElementList();
306 if (symmetric || symmetrize)
307 for (
size_t i = 0; i < num_local_cols; ++i)
308 col_gids[i] = gids[i];
310 for (
size_t i = 0; i < num_local_cols; ++i)
311 col_gids[i] = gids[i] + num_global_rows;
315 list_of_colors_host = Kokkos::create_mirror_view(my_list_of_colors);
317 int num_gid_entries = 1;
318 int ret = zz->Color(num_gid_entries, num_local_cols, col_gids.getRawPtr(),
319 list_of_colors_host.data());
321 TEUCHOS_TEST_FOR_EXCEPTION(ret != ZOLTAN_OK, std::logic_error,
322 "Zoltan::Color returned " << ret << std::endl);
324 Kokkos::deep_copy(my_list_of_colors, list_of_colors_host);
325 list_of_colors = my_list_of_colors;
327 const bool dump_zoltan = coloring_params.get(
"Dump Zoltan Data",
false);
330 std::string zoltan_dump_file =
331 coloring_params.get(
"Zoltan Dump File Name",
"zoltan_graph.txt");
332 zz->Generate_Files(zoltan_dump_file, 0, 0, 1, 0);
338 int local_num_colors = 0;
339 Kokkos::parallel_reduce(
"ZoltanCrsColorer::find_num_colors",
340 Kokkos::RangePolicy<execution_space>(0, num_local_cols),
341 KOKKOS_LAMBDA(
const size_t i,
int &lcl_max) {
342 if (my_list_of_colors[i] > lcl_max)
343 lcl_max = my_list_of_colors[i];
345 Kokkos::Max<int>(local_num_colors));
347 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, 1, &local_num_colors,
352template <
typename CrsMatrixType>
356 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
358 return zoltan_data->graph->getLocalNumRows() +
359 zoltan_data->trans_graph->getLocalNumRows();
363template <
typename CrsMatrixType>
365ZoltanCrsColorer<CrsMatrixType>::get_vertex_list(
369 ZOLTAN_ID_PTR global_ids,
370 ZOLTAN_ID_PTR local_ids,
375 assert(sizeGID == 1 && sizeLID == 1);
377 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
380 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
381 const size_t num_local_cols = zoltan_data->trans_graph->getLocalNumRows();
382 const size_t num_global_rows = std::max(
383 static_cast<typename CrsMatrixType::global_ordinal_type
>(
384 zoltan_data->graph->getGlobalNumRows()),
385 zoltan_data->graph->getRowMap()->getMaxAllGlobalIndex()+1);
386 auto row_gids = zoltan_data->graph->getRowMap()->getLocalElementList();
387 auto col_gids = zoltan_data->trans_graph->getRowMap()->getLocalElementList();
389 for (
size_t i = 0; i < num_local_rows; ++i)
392 global_ids[i] = row_gids[i];
394 for (
size_t i = 0; i < num_local_cols; ++i)
396 local_ids[num_local_rows + i] = num_local_rows + i;
397 global_ids[num_local_rows + i] = num_global_rows + col_gids[i];
402template <
typename CrsMatrixType>
404ZoltanCrsColorer<CrsMatrixType>::get_number_of_edges(
408 ZOLTAN_ID_PTR global_id,
409 ZOLTAN_ID_PTR local_id,
412 assert(sizeGID == 1 && sizeLID == 1);
414 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
417 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
418 const ZOLTAN_ID_TYPE lid = *local_id;
421 if (lid < num_local_rows)
422 num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
425 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid - num_local_rows);
431template <
typename CrsMatrixType>
433ZoltanCrsColorer<CrsMatrixType>::get_edge_list(
437 ZOLTAN_ID_PTR global_id,
438 ZOLTAN_ID_PTR local_id,
439 ZOLTAN_ID_PTR nbor_global_ids,
445 using Teuchos::Array;
446 using Teuchos::ArrayView;
447 using Teuchos::arrayView;
449 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
452 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
453 const size_t num_global_rows = std::max(
454 static_cast<typename CrsMatrixType::global_ordinal_type
>(
455 zoltan_data->graph->getGlobalNumRows()),
456 zoltan_data->graph->getRowMap()->getMaxAllGlobalIndex()+1);
457 const ZOLTAN_ID_TYPE lid = *local_id;
459 if (lid < num_local_rows)
461 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
462 const auto colMap = zoltan_data->graph->getColMap();
464 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
465 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
467 for (
int j = 0; j < num_nbr; ++j) {
468 nbor_global_ids[j] = num_global_rows
469 + colMap->getGlobalElement(lcl_ids[j]);
470 nbor_procs[j] = zoltan_data->col_procs[lcl_ids[j]];
476 zoltan_data->trans_graph->getNumEntriesInLocalRow(lid-num_local_rows);
477 const auto colMap = zoltan_data->trans_graph->getColMap();
479 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
480 zoltan_data->trans_graph->getLocalRowView(lid - num_local_rows, lcl_ids);
481 for (
int j = 0; j < num_nbr; ++j)
483 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
484 nbor_procs[j] = zoltan_data->trans_col_procs[lcl_ids[j]];
490template <
typename CrsMatrixType>
492ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_vertices(
496 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
498 return zoltan_data->graph->getLocalNumRows();
502template <
typename CrsMatrixType>
504ZoltanCrsColorer<CrsMatrixType>::sym_get_vertex_list(
508 ZOLTAN_ID_PTR global_ids,
509 ZOLTAN_ID_PTR local_ids,
514 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
517 const size_t num_local_rows = zoltan_data->graph->getLocalNumRows();
518 auto row_gids = zoltan_data->graph->getRowMap()->getLocalElementList();
519 for (
size_t i = 0; i < num_local_rows; ++i)
522 global_ids[i] = row_gids[i];
527template <
typename CrsMatrixType>
529ZoltanCrsColorer<CrsMatrixType>::sym_get_number_of_edges(
533 ZOLTAN_ID_PTR global_id,
534 ZOLTAN_ID_PTR local_id,
537 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
540 const ZOLTAN_ID_TYPE lid = *local_id;
541 int num_edges = zoltan_data->graph->getNumEntriesInLocalRow(lid);
546template <
typename CrsMatrixType>
548ZoltanCrsColorer<CrsMatrixType>::sym_get_edge_list(
552 ZOLTAN_ID_PTR global_id,
553 ZOLTAN_ID_PTR local_id,
554 ZOLTAN_ID_PTR nbor_global_ids,
560 using Teuchos::Array;
561 using Teuchos::ArrayView;
562 using Teuchos::arrayView;
564 ZoltanData *zoltan_data =
static_cast<ZoltanData *
>(data);
567 const ZOLTAN_ID_TYPE lid = *local_id;
568 const int num_nbr = zoltan_data->graph->getNumEntriesInLocalRow(lid);
570 typename CrsMatrixType::local_inds_host_view_type lcl_ids;
571 zoltan_data->graph->getLocalRowView(lid, lcl_ids);
572 const auto colMap = zoltan_data->graph->getColMap();
574 for (
int j = 0; j < num_nbr; ++j)
576 nbor_global_ids[j] = colMap->getGlobalElement(lcl_ids[j]);
577 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
list_of_colors_t::host_mirror_type list_of_colors_host_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
Teuchos::RCP< Tpetra::CrsGraph< LO, GO, NO > > compute_transpose_graph(const Tpetra::CrsGraph< LO, GO, NO > &graph)
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)
Created by mbenlioglu on Aug 31, 2020.