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/*
2// @HEADER
3// ***********************************************************************
4//
5// Tpetra: Templated Linear Algebra Services Package
6// Copyright (2008) Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ************************************************************************
41// @HEADER
42*/
43
44#ifndef TPETRA_DETAILS_GETGRAPHDIAGOFFSETS_DEF_HPP
45#define TPETRA_DETAILS_GETGRAPHDIAGOFFSETS_DEF_HPP
46
51
53#include "Tpetra_Map.hpp"
54#include "KokkosSparse_findRelOffset.hpp"
55
56namespace Tpetra {
57namespace Details {
58namespace Impl {
59
73template<class LO,
74 class GO,
75 class Node,
76 class DiagOffsetType>
78GetGraphDiagOffsets (const diag_offsets_type& diagOffsets,
79 const local_map_type& lclRowMap,
80 const local_map_type& lclColMap,
81 const row_offsets_type& ptr,
82 const lcl_col_inds_type& ind,
83 const bool isSorted) :
84 diagOffsets_ (diagOffsets),
85 lclRowMap_ (lclRowMap),
86 lclColMap_ (lclColMap),
87 ptr_ (ptr),
88 ind_ (ind),
89 isSorted_ (isSorted)
90{
91 typedef typename device_type::execution_space execution_space;
92 typedef Kokkos::RangePolicy<execution_space, LO> policy_type;
93
94 const LO lclNumRows = lclRowMap.getLocalNumElements ();
95 policy_type range (0, lclNumRows);
96 Kokkos::parallel_for (range, *this);
97}
98
99template<class LO,
100 class GO,
101 class Node,
102 class DiagOffsetType>
103KOKKOS_FUNCTION void
105operator() (const LO& lclRowInd) const
106{
107 const size_t STINV =
108 Tpetra::Details::OrdinalTraits<diag_offset_type>::invalid ();
109 const GO gblRowInd = lclRowMap_.getGlobalElement (lclRowInd);
110 const GO gblColInd = gblRowInd;
111 const LO lclColInd = lclColMap_.getLocalElement (gblColInd);
112
113 if (lclColInd == Tpetra::Details::OrdinalTraits<LO>::invalid ()) {
114 diagOffsets_[lclRowInd] = STINV;
115 }
116 else {
117 // Could be empty, but that's OK.
118 const LO numEnt = ptr_[lclRowInd+1] - ptr_[lclRowInd];
119 // std::pair doesn't have its methods marked as device
120 // functions, so we have to use Kokkos::pair.
121 auto lclColInds =
122 Kokkos::subview (ind_, Kokkos::make_pair (ptr_[lclRowInd],
123 ptr_[lclRowInd+1]));
124 using ::KokkosSparse::findRelOffset;
125 const LO diagOffset =
126 findRelOffset<LO, lcl_col_inds_type> (lclColInds, numEnt,
127 lclColInd, 0, isSorted_);
128 diagOffsets_[lclRowInd] = (diagOffset == numEnt) ? STINV :
129 static_cast<diag_offset_type> (diagOffset);
130 }
131}
132
133} // namespace Impl
134} // namespace Details
135} // namespace Tpetra
136
137// Explicit template instantiation macro for
138// Tpetra::Details::Impl::GetGraphDiagOffsets. NOT FOR USERS!!! Must
139// be used inside the Tpetra namespace.
140#define TPETRA_DETAILS_IMPL_GETGRAPHDIAGOFFSETS_INSTANT( LO, GO, NODE ) \
141 template class Details::Impl::GetGraphDiagOffsets< LO, GO, NODE::device_type >;
142
143#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.
Implementation details of Tpetra.
Namespace Tpetra contains the class and methods constituting the Tpetra library.