40 #ifndef TPETRA_DETAILS_LOCALDEEPCOPYROWMATRIX_DEF_HPP
41 #define TPETRA_DETAILS_LOCALDEEPCOPYROWMATRIX_DEF_HPP
47 #include "Tpetra_Map.hpp"
48 #include "Tpetra_RowMatrix.hpp"
49 #include "Tpetra_Details_localRowOffsets.hpp"
50 #include "Teuchos_TestForException.hpp"
51 #include "Teuchos_Array.hpp"
52 #include "Kokkos_Core.hpp"
59 template <
class SC,
class LO,
class GO,
class NT>
60 KokkosSparse::CrsMatrix<
61 typename Kokkos::ArithTraits<SC>::val_type,
63 typename NT::execution_space,
69 TEUCHOS_TEST_FOR_EXCEPTION
71 "Tpetra::Details::localDeepCopyLocallyIndexedRowMatrix: "
72 "Input RowMatrix is globally indexed.");
75 using offsets_type =
typename lro_result_type::offsets_type;
76 using offset_type =
typename lro_result_type::offset_type;
85 maxNumEnt = result.maxNumEnt;
88 using Kokkos::view_alloc;
89 using Kokkos::WithoutInitializing;
90 using IST =
typename Kokkos::ArithTraits<SC>::val_type;
91 using local_matrix_type = KokkosSparse::CrsMatrix<
92 IST, LO,
typename NT::execution_space,
void>;
93 using local_graph_type =
94 typename local_matrix_type::staticcrsgraph_type;
95 using inds_type =
typename local_graph_type::entries_type;
96 inds_type ind (view_alloc (
"ind", WithoutInitializing), nnz);
97 auto ind_h = Kokkos::create_mirror_view (ind);
99 using values_type =
typename local_matrix_type::values_type;
100 values_type val (view_alloc (
"val", WithoutInitializing), nnz);
101 auto val_h = Kokkos::create_mirror_view (val);
105 Teuchos::Array<LO> inputIndsBuf;
106 Teuchos::Array<SC> inputValsBuf;
108 inputIndsBuf.resize (maxNumEnt);
109 inputValsBuf.resize (maxNumEnt);
113 offset_type curPos = 0;
114 for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) {
115 Teuchos::ArrayView<const LO> inputInds_av;
116 Teuchos::ArrayView<const SC> inputVals_av;
121 numEnt =
static_cast<size_t> (inputInds_av.size ());
125 inputValsBuf (), numEnt);
126 inputInds_av = inputIndsBuf.view (0, numEnt);
127 inputVals_av = inputValsBuf.view (0, numEnt);
130 reinterpret_cast<const IST*
> (inputVals_av.getRawPtr ());
131 const LO* inInds = inputInds_av.getRawPtr ();
132 std::copy (inInds, inInds + numEnt, ind_h.data () + curPos);
133 std::copy (inVals, inVals + numEnt, val_h.data () + curPos);
134 curPos += offset_type (numEnt);
139 local_graph_type lclGraph (ind, ptr);
140 const size_t numCols = A.
getColMap ()->getNodeNumElements ();
141 return local_matrix_type (label, numCols, val, lclGraph);
152 #define TPETRA_DETAILS_LOCALDEEPCOPYROWMATRIX_INSTANT(SC, LO, GO, NT) \
153 namespace Details { \
154 template KokkosSparse::CrsMatrix< \
155 Kokkos::ArithTraits<SC>::val_type, \
156 LO, NT::execution_space, void> \
157 localDeepCopyLocallyIndexedRowMatrix<SC, LO, GO, NT> \
158 (const RowMatrix<SC, LO, GO, NT>& A, \
159 const char label[]); \
162 #endif // TPETRA_DETAILS_LOCALDEEPCOPYROWMATRIX_DEF_HPP