Tpetra parallel linear algebra
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
core
src
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
52
#include "
Tpetra_Details_OrdinalTraits.hpp
"
53
#include "Tpetra_Map.hpp"
54
#include "KokkosSparse_findRelOffset.hpp"
55
56
namespace
Tpetra
{
57
namespace
Details
{
58
namespace
Impl {
59
73
template
<
class
LO,
74
class
GO,
75
class
Node,
76
class
DiagOffsetType>
77
GetGraphDiagOffsets<LO, GO, Node, DiagOffsetType>::
78
GetGraphDiagOffsets
(
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
99
template
<
class
LO,
100
class
GO,
101
class
Node,
102
class
DiagOffsetType>
103
KOKKOS_FUNCTION
void
104
GetGraphDiagOffsets<LO, GO, Node, DiagOffsetType>::
105
operator()
(
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
Tpetra_Details_OrdinalTraits.hpp
Import KokkosSparse::OrdinalTraits, a traits class for "invalid" (flag) values of integer types,...
Tpetra::execution_space
Tpetra::Details::Impl::GetGraphDiagOffsets::operator()
KOKKOS_FUNCTION void operator()(const LO &lclRowInd) const
Kokkos::parallel_for loop body.
Definition
Tpetra_Details_getGraphDiagOffsets_def.hpp:105
Tpetra::Details::Impl::GetGraphDiagOffsets::GetGraphDiagOffsets
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.
Definition
Tpetra_Details_getGraphDiagOffsets_def.hpp:78
Tpetra::Details::LocalMap::getLocalNumElements
KOKKOS_INLINE_FUNCTION LocalOrdinal getLocalNumElements() const
The number of indices that live on the calling process.
Definition
Tpetra_Details_LocalMap.hpp:121
Tpetra::Details
Nonmember function that computes a residual Computes R = B - A * X.
Definition
Tpetra_KokkosRefactor_Details_MultiVectorLocalDeepCopy.hpp:51
Tpetra
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Generated by
1.17.0