Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_Details_getGraphDiagOffsets_def.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Tpetra: Templated Linear Algebra Services Package
4//
5// Copyright 2008 NTESS and the Tpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TPETRA_DETAILS_GETGRAPHDIAGOFFSETS_DEF_HPP
11#define TPETRA_DETAILS_GETGRAPHDIAGOFFSETS_DEF_HPP
12
17
19#include "Tpetra_Map.hpp"
20#include "KokkosSparse_findRelOffset.hpp"
21
22namespace Tpetra {
23namespace Details {
24namespace Impl {
25
39template<class LO,
40 class GO,
41 class Node,
42 class DiagOffsetType>
44GetGraphDiagOffsets (const diag_offsets_type& diagOffsets,
45 const local_map_type& lclRowMap,
46 const local_map_type& lclColMap,
47 const row_offsets_type& ptr,
48 const lcl_col_inds_type& ind,
49 const bool isSorted) :
50 diagOffsets_ (diagOffsets),
51 lclRowMap_ (lclRowMap),
52 lclColMap_ (lclColMap),
53 ptr_ (ptr),
54 ind_ (ind),
55 isSorted_ (isSorted)
56{
57 typedef typename device_type::execution_space execution_space;
58 typedef Kokkos::RangePolicy<execution_space, LO> policy_type;
59
60 const LO lclNumRows = lclRowMap.getLocalNumElements ();
61 policy_type range (0, lclNumRows);
62 Kokkos::parallel_for (range, *this);
63}
64
65template<class LO,
66 class GO,
67 class Node,
68 class DiagOffsetType>
69KOKKOS_FUNCTION void
71operator() (const LO& lclRowInd) const
72{
73 const size_t STINV =
74 Tpetra::Details::OrdinalTraits<diag_offset_type>::invalid ();
75 const GO gblRowInd = lclRowMap_.getGlobalElement (lclRowInd);
76 const GO gblColInd = gblRowInd;
77 const LO lclColInd = lclColMap_.getLocalElement (gblColInd);
78
79 if (lclColInd == Tpetra::Details::OrdinalTraits<LO>::invalid ()) {
80 diagOffsets_[lclRowInd] = STINV;
81 }
82 else {
83 // Could be empty, but that's OK.
84 const LO numEnt = ptr_[lclRowInd+1] - ptr_[lclRowInd];
85 // std::pair doesn't have its methods marked as device
86 // functions, so we have to use Kokkos::pair.
87 auto lclColInds =
88 Kokkos::subview (ind_, Kokkos::make_pair (ptr_[lclRowInd],
89 ptr_[lclRowInd+1]));
90 using ::KokkosSparse::findRelOffset;
91 const LO diagOffset =
92 findRelOffset<LO, lcl_col_inds_type> (lclColInds, numEnt,
93 lclColInd, 0, isSorted_);
94 diagOffsets_[lclRowInd] = (diagOffset == numEnt) ? STINV :
95 static_cast<diag_offset_type> (diagOffset);
96 }
97}
98
99} // namespace Impl
100} // namespace Details
101} // namespace Tpetra
102
103// Explicit template instantiation macro for
104// Tpetra::Details::Impl::GetGraphDiagOffsets. NOT FOR USERS!!! Must
105// be used inside the Tpetra namespace.
106#define TPETRA_DETAILS_IMPL_GETGRAPHDIAGOFFSETS_INSTANT( LO, GO, NODE ) \
107 template class Details::Impl::GetGraphDiagOffsets< LO, GO, NODE::device_type >;
108
109#endif // TPETRA_DETAILS_GETGRAPHDIAGOFFSETS_DEF_HPP
Import KokkosSparse::OrdinalTraits, a traits class for "invalid" (flag) values of integer types,...
KOKKOS_FUNCTION void operator()(const LO &lclRowInd) const
Kokkos::parallel_for loop body.
GetGraphDiagOffsets(const diag_offsets_type &diagOffsets, const local_map_type &lclRowMap, const local_map_type &lclColMap, const row_offsets_type &ptr, const lcl_col_inds_type &ind, const bool isSorted)
Constructor; also runs the functor.
KOKKOS_INLINE_FUNCTION LocalOrdinal getLocalNumElements() const
The number of indices that live on the calling process.
Nonmember function that computes a residual Computes R = B - A * X.
Namespace Tpetra contains the class and methods constituting the Tpetra library.