3 #include "Teuchos_RCP.hpp"
4 #include "Teuchos_Comm.hpp"
6 #include "Tpetra_CrsGraph.hpp"
7 #include "Tpetra_CrsMatrix.hpp"
11 #include "KokkosKernels_Utils.hpp"
21 template <
typename LO,
typename GO,
typename NO,
typename list_of_colors_t>
24 const Tpetra::CrsGraph<LO, GO, NO> &graph,
25 const list_of_colors_t &list_of_colors)
27 typedef typename list_of_colors_t::execution_space execution_space;
29 Teuchos::RCP<const Teuchos::Comm<int>> comm = graph.getRowMap()->getComm();
30 const int rank = comm->getRank();
31 auto local_graph = graph.getLocalGraphDevice();
32 const size_t num_rows = graph.getNodeNumRows();
33 size_t num_conflict = 0;
35 Kokkos::parallel_reduce(
36 "check_coloring()", Kokkos::RangePolicy<execution_space>(0, num_rows),
37 KOKKOS_LAMBDA(
const size_t row,
size_t &lcl_conflict) {
38 const size_t entry_begin = local_graph.row_map(row);
39 const size_t entry_end = local_graph.row_map(row + 1);
40 for (
size_t entry = entry_begin; entry < entry_end; entry++)
42 const size_t col = local_graph.entries(entry);
43 for (
size_t entry2 = entry_begin; entry2 < entry_end; ++entry2)
45 const size_t col2 = local_graph.entries(entry2);
46 if (col != col2 && list_of_colors[col] == list_of_colors[col2])
50 "proc = %i : Invalid coloring! Local row %zu"
51 " and columns %zu, %zu have the same color %i\n",
52 rank, row, col, col2, list_of_colors[col]);
59 size_t global_num_conflict = 0;
60 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, 1, &num_conflict,
61 &global_num_conflict);
63 return global_num_conflict == 0;
67 template <
typename LocalCrsGraphType>
70 const LocalCrsGraphType &local_graph,
71 const size_t num_cols)
73 using KokkosKernels::Impl::transpose_graph;
75 typedef LocalCrsGraphType graph_t;
76 typedef typename graph_t::row_map_type lno_view_t;
77 typedef typename graph_t::entries_type lno_nnz_view_t;
78 typedef typename lno_view_t::non_const_type trans_row_view_t;
79 typedef typename lno_nnz_view_t::non_const_type trans_nnz_view_t;
80 typedef typename lno_view_t::execution_space exec_t;
83 const size_t num_rows = local_graph.row_map.extent(0) - 1;
84 const size_t num_nnz = local_graph.entries.extent(0);
86 trans_row_view_t trans_row_map(
"trans_row_map", num_cols + 1);
87 trans_nnz_view_t trans_entries(
"trans_entries", num_nnz);
89 transpose_graph<lno_view_t, lno_nnz_view_t, trans_row_view_t,
90 trans_nnz_view_t, trans_row_view_t, exec_t>(
91 num_rows, num_cols, local_graph.row_map, local_graph.entries,
92 trans_row_map, trans_entries);
94 graph_t local_trans_graph(trans_entries, trans_row_map);
96 return local_trans_graph;
114 template <
typename LO,
typename GO,
typename NO>
115 Teuchos::RCP<Tpetra::CrsGraph<LO, GO, NO>>
121 typedef Tpetra::CrsGraph<LO, GO, NO> graph_t;
122 typedef typename graph_t::local_graph_device_type local_graph_t;
125 local_graph_t local_graph = graph.getLocalGraphDevice();
126 local_graph_t local_trans_graph =
128 graph.getNodeNumCols());
143 RCP<graph_t> trans_graph_shared = rcp(
new graph_t(
144 local_trans_graph, graph.getColMap(), graph.getRowMap(),
145 graph.getRangeMap(), graph.getRowMap()));
147 RCP<graph_t> trans_graph;
151 RCP<const Tpetra::Export<LO, GO, NO>> exporter =
152 trans_graph_shared->getExporter();
153 if (exporter == Teuchos::null)
154 trans_graph = trans_graph_shared;
157 RCP<const graph_t> trans_graph_shared_const = trans_graph_shared;
158 trans_graph = Tpetra::exportAndFillCompleteCrsGraph(
159 trans_graph_shared_const, *exporter,
160 Teuchos::null, Teuchos::null, Teuchos::null);
167 template <
typename SC,
typename LO,
typename GO,
typename NO>
168 Teuchos::RCP<Tpetra::CrsGraph<LO, GO, NO>>
175 template <
typename SC,
typename LO,
typename GO,
typename NO>
176 Teuchos::RCP<Tpetra::CrsGraph<LO, GO, NO>>
Teuchos::RCP< Tpetra::CrsGraph< LO, GO, NO > > compute_transpose_graph(const Tpetra::CrsGraph< LO, GO, NO > &graph)
bool check_coloring(const Tpetra::CrsGraph< LO, GO, NO > &graph, const list_of_colors_t &list_of_colors)
LocalCrsGraphType compute_local_transpose_graph(const LocalCrsGraphType &local_graph, const size_t num_cols)
Created by mbenlioglu on Aug 31, 2020.