48 #ifndef __IFPACK2_CRSARRAYS_DECL_HPP__
49 #define __IFPACK2_CRSARRAYS_DECL_HPP__
51 #include <Tpetra_RowMatrix.hpp>
52 #include <Tpetra_CrsMatrix.hpp>
53 #include <Tpetra_KokkosCompat_DefaultNode.hpp>
54 #include <Tpetra_BlockCrsMatrix_Helpers_decl.hpp>
55 #include <KokkosSparse_CrsMatrix.hpp>
56 #include <Ifpack2_LocalFilter.hpp>
57 #include <Ifpack2_ReorderFilter.hpp>
66 template<
typename Scalar,
typename ImplScalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
69 typedef typename Node::device_type device_type;
70 typedef typename device_type::execution_space execution_space;
71 typedef Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> TRowMatrix;
72 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> TCrsMatrix;
73 typedef Tpetra::BlockCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> TBcrsMatrix;
76 typedef KokkosSparse::CrsMatrix<ImplScalar, LocalOrdinal, execution_space> KCrsMatrix;
77 typedef Kokkos::View<LocalOrdinal*, execution_space> OrdinalArray;
78 typedef Kokkos::View<ImplScalar*, execution_space> ScalarArray;
79 typedef typename OrdinalArray::HostMirror OrdinalArrayHost;
81 typedef Kokkos::Serial functor_space;
82 typedef Kokkos::RangePolicy<functor_space, int> RangePol;
88 static void getValues(
const TRowMatrix* A, ScalarArray& vals, OrdinalArrayHost& rowptrs)
90 auto Acrs =
dynamic_cast<const TCrsMatrix*
>(A);
91 auto Abcrs =
dynamic_cast<const TBcrsMatrix*
>(A);
94 getValuesCrs(Acrs, vals);
98 getValuesBcrs(Abcrs, vals);
101 using range_type = Kokkos::pair<int, int>;
102 using local_inds_host_view_type =
typename TRowMatrix::nonconst_local_inds_host_view_type;
103 using values_host_view_type =
typename TRowMatrix::nonconst_values_host_view_type;
104 using scalar_type =
typename values_host_view_type::value_type;
106 LocalOrdinal nrows = A->getLocalNumRows();
107 size_t nnz = A->getLocalNumEntries();
108 size_t maxNnz = A->getLocalMaxNumRowEntries();
110 vals = ScalarArray(
"Values", nnz);
111 auto valsHost = Kokkos::create_mirror(vals);
112 local_inds_host_view_type lclColInds (
"lclColinds", maxNnz);
115 for(LocalOrdinal i = 0; i < nrows; i++) {
116 size_t NumEntries = A->getNumEntriesInLocalRow(i);
117 auto constLclValues = Kokkos::subview (valsHost, range_type (nnz, nnz+NumEntries));
118 values_host_view_type lclValues (const_cast<scalar_type*>(constLclValues.data()), NumEntries);
120 A->getLocalRowCopy (i, lclColInds, lclValues, NumEntries);
123 Kokkos::deep_copy(vals, valsHost);
131 static void getStructure(
const TRowMatrix* A, OrdinalArrayHost& rowptrsHost, OrdinalArray& rowptrs, OrdinalArray& colinds)
133 auto Acrs =
dynamic_cast<const TCrsMatrix*
>(A);
134 auto Abcrs =
dynamic_cast<const TBcrsMatrix*
>(A);
137 getStructureCrs(Acrs, rowptrsHost, rowptrs, colinds);
141 getStructureBcrs(Abcrs, rowptrsHost, rowptrs, colinds);
147 LocalOrdinal nrows = A->getLocalNumRows();
148 rowptrsHost = OrdinalArrayHost(
"RowPtrs (host)", nrows + 1);
150 using range_type = Kokkos::pair<int, int>;
151 using values_host_view_type =
typename TRowMatrix::nonconst_values_host_view_type;
152 using local_inds_host_view_type =
typename TRowMatrix::nonconst_local_inds_host_view_type;
153 using local_ind_type =
typename local_inds_host_view_type::value_type;
154 size_t nnz = A->getLocalNumEntries();
155 size_t maxNnz = A->getLocalMaxNumRowEntries();
157 colinds = OrdinalArray(
"ColInds", nnz);
158 auto colindsHost = Kokkos::create_mirror(colinds);
159 values_host_view_type lclValues (
"lclValues", maxNnz);
162 rowptrsHost[0] = nnz;
163 for(LocalOrdinal i = 0; i < nrows; i++) {
164 size_t NumEntries = A->getNumEntriesInLocalRow(i);
165 auto constLclValues = Kokkos::subview (colindsHost, range_type (nnz, nnz+NumEntries));
166 local_inds_host_view_type lclColInds (const_cast<local_ind_type*>(constLclValues.data()), NumEntries);
167 A->getLocalRowCopy (i, lclColInds, lclValues, NumEntries);
170 rowptrsHost[i+1] = nnz;
173 rowptrs = OrdinalArray(
"RowPtrs", nrows + 1);
174 Kokkos::deep_copy(rowptrs, rowptrsHost);
175 Kokkos::deep_copy(colinds, colindsHost);
181 static void getValuesCrs(
const TCrsMatrix* A, ScalarArray& values_)
183 auto localA = A->getLocalMatrixDevice();
184 auto values = localA.values;
185 auto nnz = values.extent(0);
186 values_ = ScalarArray(
"Values", nnz );
187 Kokkos::deep_copy(values_, values);
191 static void getStructureCrs(
const TCrsMatrix* A, OrdinalArrayHost& rowptrsHost_, OrdinalArray& rowptrs_, OrdinalArray& colinds_)
194 auto localA = A->getLocalMatrixDevice();
195 auto rowptrs = localA.graph.row_map;
196 auto colinds = localA.graph.entries;
197 auto numRows = A->getLocalNumRows();
198 auto nnz = colinds.extent(0);
200 rowptrs_ = OrdinalArray(
"RowPtrs", numRows + 1);
201 colinds_ = OrdinalArray(
"ColInds", nnz );
202 Kokkos::deep_copy(rowptrs_, rowptrs);
203 Kokkos::deep_copy(colinds_, colinds);
205 rowptrsHost_ = Kokkos::create_mirror(rowptrs_);
206 Kokkos::deep_copy(rowptrsHost_, rowptrs_);
210 static void getValuesBcrs(
const TBcrsMatrix* A, ScalarArray& values_)
212 auto localA = A->getLocalMatrixDevice();
213 auto values = localA.values;
214 auto nnz = values.extent(0);
215 values_ = ScalarArray(
"Values", nnz );
216 Kokkos::deep_copy(values_, values);
220 static void getStructureBcrs(
const TBcrsMatrix* A, OrdinalArrayHost& rowptrsHost_, OrdinalArray& rowptrs_, OrdinalArray& colinds_)
223 auto localA = A->getLocalMatrixDevice();
224 auto rowptrs = localA.graph.row_map;
225 auto colinds = localA.graph.entries;
226 auto numRows = A->getLocalNumRows();
227 auto nnz = colinds.extent(0);
229 rowptrs_ = OrdinalArray(
"RowPtrs", numRows + 1);
230 colinds_ = OrdinalArray(
"ColInds", nnz );
231 Kokkos::deep_copy(rowptrs_, rowptrs);
232 Kokkos::deep_copy(colinds_, colinds);
234 rowptrsHost_ = Kokkos::create_mirror(rowptrs_);
235 Kokkos::deep_copy(rowptrsHost_, rowptrs_);
Wraps a Tpetra::RowMatrix in a filter that reorders local rows and columns.
Definition: Ifpack2_ReorderFilter_decl.hpp:69
Access only local rows and columns of a sparse matrix.
Definition: Ifpack2_LocalFilter_decl.hpp:161