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).