10#ifndef TPETRA_DETAILS_GETNUMDIAGS_HPP
11#define TPETRA_DETAILS_GETNUMDIAGS_HPP
20#include "Tpetra_CrsGraph.hpp"
21#include "Teuchos_CommHelpers.hpp"
33template <
class LocalGraphType,
class LocalMapType>
45 using result_type =
typename LocalMapType::local_ordinal_type;
50 result_type& diagCount)
const {
51 using LO =
typename LocalMapType::local_ordinal_type;
52 using LOT = typename ::Tpetra::Details::OrdinalTraits<LO>;
60 const LO
lclDiagCol = colMap_.getLocalElement(rowMap_.getGlobalElement(
lclRow));
81template <
class LO,
class GO,
class NT>
82typename ::Tpetra::CrsGraph<LO, GO, NT>::local_ordinal_type
83countLocalNumDiagsInFillCompleteGraph(const ::Tpetra::CrsGraph<LO, GO, NT>&
G) {
85 using local_map_type =
typename crs_graph_type::map_type::local_map_type;
86 using local_graph_device_type =
typename crs_graph_type::local_graph_device_type;
88 using execution_space =
typename crs_graph_type::device_type::execution_space;
89 using policy_type = Kokkos::RangePolicy<execution_space, LO>;
91 const auto rowMap =
G.getRowMap();
92 const auto colMap =
G.getColMap();
93 if (rowMap.get() ==
nullptr || colMap.get() ==
nullptr) {
97 functor_type f(G.getLocalGraphDevice(), rowMap->getLocalMap(), colMap->getLocalMap());
98 Kokkos::parallel_reduce(policy_type(0, G.getLocalNumRows()), f, lclNumDiags);
112template <
class MapType>
113typename MapType::local_ordinal_type
117 return colMap.getLocalElement(rowMap.getGlobalElement(
lclRow));
121template <
class LO,
class GO,
class NT>
122typename ::Tpetra::RowGraph<LO, GO, NT>::local_ordinal_type
124 using LOT = typename ::Tpetra::Details::OrdinalTraits<LO>;
126 const auto rowMap =
G.getRowMap();
127 const auto colMap =
G.getColMap();
128 if (rowMap.get() ==
nullptr || colMap.get() ==
nullptr) {
133 typename ::Tpetra::RowGraph<LO, GO, NT>::local_inds_host_view_type
135 const LO
lclNumRows =
static_cast<LO
>(
G.getLocalNumRows());
142 const LO
lclDiagCol = colMap->getLocalElement(rowMap->getGlobalElement(
lclRow));
162template <
class LO,
class GO,
class NT>
163typename ::Tpetra::RowGraph<LO, GO, NT>::local_ordinal_type
165 using LOT = typename ::Tpetra::Details::OrdinalTraits<LO>;
167 const auto rowMap =
G.getRowMap();
168 const auto colMap =
G.getColMap();
169 if (rowMap.get() ==
nullptr || colMap.get() ==
nullptr) {
172 using inds_type = typename ::Tpetra::RowGraph<LO, GO, NT>::nonconst_local_inds_host_view_type;
174 const LO
lclNumRows =
static_cast<LO
>(
G.getLocalNumRows());
186 colMap->getLocalElement(rowMap->getGlobalElement(
lclRow));
206template <
class LO,
class GO,
class NT>
207typename ::Tpetra::RowGraph<LO, GO, NT>::local_ordinal_type
209 const auto rowMap =
G.getRowMap();
210 if (rowMap.get() ==
nullptr) {
213 typename ::Tpetra::RowGraph<LO, GO, NT>::global_inds_host_view_type
215 const LO
lclNumRows =
static_cast<LO
>(
G.getLocalNumRows());
239template <
class LO,
class GO,
class NT>
240typename ::Tpetra::RowGraph<LO, GO, NT>::local_ordinal_type
242 using gids_type = typename ::Tpetra::RowGraph<LO, GO, NT>::nonconst_global_inds_host_view_type;
243 const auto rowMap =
G.getRowMap();
244 if (rowMap.get() ==
nullptr) {
248 const LO
lclNumRows =
static_cast<LO
>(
G.getLocalNumRows());
284template <
class MatrixType>
286 static typename MatrixType::local_ordinal_type
288 using LO =
typename MatrixType::local_ordinal_type;
289 using GO =
typename MatrixType::global_ordinal_type;
290 using NT =
typename MatrixType::node_type;
293 auto G =
A.getGraph();
294 if (
G.get() ==
nullptr) {
303template <
class LO,
class GO,
class NT>
306 getLocalNumDiags(const ::Tpetra::RowGraph<LO, GO, NT>&
G) {
309 const crs_graph_type*
G_crs =
dynamic_cast<const crs_graph_type*
>(&
G);
310 if (
G_crs !=
nullptr &&
G_crs->isFillComplete()) {
311 return countLocalNumDiagsInFillCompleteGraph(*
G_crs);
313 if (
G.isLocallyIndexed()) {
314 if (
G.supportsRowViews()) {
319 }
else if (
G.isGloballyIndexed()) {
320 if (
G.supportsRowViews()) {
333template <
class LO,
class GO,
class NT>
336 getLocalNumDiags(const ::Tpetra::CrsGraph<LO, GO, NT>&
G) {
345template <
class CrsGraphType>
346typename CrsGraphType::local_ordinal_type
353template <
class CrsGraphType>
354typename CrsGraphType::global_ordinal_type
356 using GO =
typename CrsGraphType::global_ordinal_type;
358 const auto map =
G.getRowMap();
359 if (
map.get() ==
nullptr) {
362 const auto comm =
map->getComm();
363 if (comm.get() ==
nullptr) {
368 using Teuchos::outArg;
369 using Teuchos::REDUCE_SUM;
370 using Teuchos::reduceAll;
Import KokkosSparse::OrdinalTraits, a traits class for "invalid" (flag) values of integer types,...
typename::Tpetra::RowGraph< LO, GO, NT >::local_ordinal_type countLocalNumDiagsInNonFillCompleteGloballyIndexedGraphWithoutRowViews(const ::Tpetra::RowGraph< LO, GO, NT > &G)
Return local number of diagonal entries.
typename::Tpetra::RowGraph< LO, GO, NT >::local_ordinal_type countLocalNumDiagsInNonFillCompleteGloballyIndexedGraphWithRowViews(const ::Tpetra::RowGraph< LO, GO, NT > &G)
Return local number of diagonal entries.
MapType::local_ordinal_type getLocalDiagonalColumnIndex(const typename MapType::local_ordinal_type lclRow, const MapType &rowMap, const MapType &colMap)
Local columm index of diagonal entry.
typename::Tpetra::RowGraph< LO, GO, NT >::local_ordinal_type countLocalNumDiagsInNonFillCompleteLocallyIndexedGraphWithoutRowViews(const ::Tpetra::RowGraph< LO, GO, NT > &G)
Return local number of diagonal entries.
typename::Tpetra::RowGraph< LO, GO, NT >::local_ordinal_type countLocalNumDiagsInNonFillCompleteLocallyIndexedGraphWithRowViews(const ::Tpetra::RowGraph< LO, GO, NT > &G)
Return local number of diagonal entries.
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
Struct that holds views of the contents of a CrsMatrix.
Kokkos::parallel_reduce functor for counting the local number of diagonal entries in a sparse graph.
KOKKOS_INLINE_FUNCTION void operator()(const typename LocalMapType::local_ordinal_type lclRow, result_type &diagCount) const
Reduction function: result is (diagonal count, error count).
An abstract interface for graphs accessed by rows.
Implementation details of Tpetra.
CrsGraphType::global_ordinal_type getGlobalNumDiags(const CrsGraphType &G)
Number of populated diagonal entries in the given sparse graph, over all processes in the graph's (MP...
CrsGraphType::local_ordinal_type getLocalNumDiags(const CrsGraphType &G)
Number of populated diagonal entries in the given sparse graph, on the calling (MPI) process.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Implementation of Tpetra::Details::getLocalNumDiags (see below).