10 #ifndef TPETRA_CRSMATRIX_DECL_HPP
11 #define TPETRA_CRSMATRIX_DECL_HPP
18 #include "KokkosSparse_Utils.hpp"
19 #include "KokkosSparse_CrsMatrix.hpp"
20 #include "Tpetra_Details_MatrixApplyHelper.hpp"
21 #include "Tpetra_RowMatrix_decl.hpp"
22 #include "Tpetra_Exceptions.hpp"
23 #include "Tpetra_DistObject.hpp"
24 #include "Tpetra_CrsGraph.hpp"
25 #include "Tpetra_Vector.hpp"
27 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
28 #include "Teuchos_DataAccess.hpp"
35 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
36 class crsMatrix_Swap_Tester;
89 template <
class CrsMatrixType>
90 Teuchos::RCP<CrsMatrixType>
92 const Import<
typename CrsMatrixType::local_ordinal_type,
93 typename CrsMatrixType::global_ordinal_type,
94 typename CrsMatrixType::node_type>& importer,
95 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
96 typename CrsMatrixType::global_ordinal_type,
97 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
98 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
99 typename CrsMatrixType::global_ordinal_type,
100 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
101 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
156 template <
class CrsMatrixType>
157 Teuchos::RCP<CrsMatrixType>
159 const Import<
typename CrsMatrixType::local_ordinal_type,
160 typename CrsMatrixType::global_ordinal_type,
161 typename CrsMatrixType::node_type>& rowImporter,
162 const Import<
typename CrsMatrixType::local_ordinal_type,
163 typename CrsMatrixType::global_ordinal_type,
164 typename CrsMatrixType::node_type>& domainImporter,
165 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
166 typename CrsMatrixType::global_ordinal_type,
167 typename CrsMatrixType::node_type> >& domainMap,
168 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
169 typename CrsMatrixType::global_ordinal_type,
170 typename CrsMatrixType::node_type> >& rangeMap,
171 const Teuchos::RCP<Teuchos::ParameterList>& params);
206 template <
class CrsMatrixType>
207 Teuchos::RCP<CrsMatrixType>
209 const Export<
typename CrsMatrixType::local_ordinal_type,
210 typename CrsMatrixType::global_ordinal_type,
211 typename CrsMatrixType::node_type>& exporter,
212 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
213 typename CrsMatrixType::global_ordinal_type,
214 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
215 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
216 typename CrsMatrixType::global_ordinal_type,
217 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
218 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
253 template <
class CrsMatrixType>
254 Teuchos::RCP<CrsMatrixType>
256 const Export<
typename CrsMatrixType::local_ordinal_type,
257 typename CrsMatrixType::global_ordinal_type,
258 typename CrsMatrixType::node_type>& rowExporter,
259 const Export<
typename CrsMatrixType::local_ordinal_type,
260 typename CrsMatrixType::global_ordinal_type,
261 typename CrsMatrixType::node_type>& domainExporter,
262 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
263 typename CrsMatrixType::global_ordinal_type,
264 typename CrsMatrixType::node_type> >& domainMap,
265 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
266 typename CrsMatrixType::global_ordinal_type,
267 typename CrsMatrixType::node_type> >& rangeMap,
268 const Teuchos::RCP<Teuchos::ParameterList>& params);
273 template <
class SC,
class LO,
class GO,
class NO>
274 void residual(
const Operator<SC, LO, GO, NO>& A,
275 const MultiVector<SC, LO, GO, NO>& X,
276 const MultiVector<SC, LO, GO, NO>& B,
277 MultiVector<SC, LO, GO, NO>& R);
393 template <
class Scalar,
398 public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
456 using mag_type =
typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
472 typename local_graph_device_type::size_type>;
473 #if KOKKOS_VERSION >= 40799
474 using local_matrix_host_type =
475 typename local_matrix_device_type::host_mirror_type;
477 using local_matrix_host_type =
478 typename local_matrix_device_type::HostMirror;
481 using row_ptrs_device_view_type =
482 typename row_matrix_type::row_ptrs_device_view_type;
483 using row_ptrs_host_view_type =
484 typename row_matrix_type::row_ptrs_host_view_type;
486 using local_inds_device_view_type =
487 typename row_matrix_type::local_inds_device_view_type;
488 using local_inds_host_view_type =
489 typename row_matrix_type::local_inds_host_view_type;
490 using nonconst_local_inds_host_view_type =
491 typename row_matrix_type::nonconst_local_inds_host_view_type;
493 using global_inds_device_view_type =
494 typename row_matrix_type::global_inds_device_view_type;
495 using global_inds_host_view_type =
496 typename row_matrix_type::global_inds_host_view_type;
497 using nonconst_global_inds_host_view_type =
498 typename row_matrix_type::nonconst_global_inds_host_view_type;
500 using values_device_view_type =
501 typename row_matrix_type::values_device_view_type;
502 using values_host_view_type =
503 typename row_matrix_type::values_host_view_type;
504 using nonconst_values_host_view_type =
505 typename row_matrix_type::nonconst_values_host_view_type;
513 GlobalOrdinal, Node>&) =
default;
517 GlobalOrdinal, Node>&&) =
default;
522 GlobalOrdinal, Node>&) =
default;
527 GlobalOrdinal, Node>&&) =
default;
542 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
543 const size_t maxNumEntriesPerRow,
544 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
558 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
559 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
560 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
580 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
581 const Teuchos::RCP<const map_type>& colMap,
582 const size_t maxNumEntPerRow,
583 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
603 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
604 const Teuchos::RCP<const map_type>& colMap,
605 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
606 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
637 const Teuchos::RCP<const crs_graph_type>& graph,
638 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
664 explicit CrsMatrix(
const Teuchos::RCP<const crs_graph_type>& graph,
665 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
695 explicit CrsMatrix(
const Teuchos::RCP<const crs_graph_type>& graph,
696 const typename local_matrix_device_type::values_type& values,
697 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
725 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
726 const Teuchos::RCP<const map_type>& colMap,
727 const typename local_graph_device_type::row_map_type& rowPointers,
728 const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
729 const typename local_matrix_device_type::values_type& values,
730 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
758 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
759 const Teuchos::RCP<const map_type>& colMap,
760 const Teuchos::ArrayRCP<size_t>& rowPointers,
761 const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
762 const Teuchos::ArrayRCP<Scalar>& values,
763 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
786 CrsMatrix(
const Teuchos::RCP<const map_type>& rowMap,
787 const Teuchos::RCP<const map_type>& colMap,
789 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
822 const Teuchos::RCP<const map_type>& rowMap,
823 const Teuchos::RCP<const map_type>& colMap,
824 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
825 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
826 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
833 const Teuchos::RCP<const map_type>& rowMap,
834 const Teuchos::RCP<const map_type>& colMap,
835 const Teuchos::RCP<const map_type>& domainMap,
836 const Teuchos::RCP<const map_type>& rangeMap,
837 const Teuchos::RCP<const import_type>& importer,
838 const Teuchos::RCP<const export_type>& exporter,
839 const Teuchos::RCP<Teuchos::ParameterList>& params =
846 const Teuchos::DataAccess copyOrView);
860 template <
class S2,
class LO2,
class GO2,
class N2>
864 template <
class S2,
class LO2,
class GO2,
class N2>
871 template <
class MatrixArray,
class MultiVectorArray>
873 const typename std::remove_pointer<typename MultiVectorArray::value_type>::type& X,
875 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
876 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
877 Teuchos::RCP<Teuchos::ParameterList> params);
951 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
952 const Teuchos::ArrayView<const Scalar>& vals);
970 const LocalOrdinal numEnt,
972 const GlobalOrdinal inds[]);
1018 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1019 const Teuchos::ArrayView<const Scalar>& vals,
1043 const LocalOrdinal numEnt,
1044 const Scalar vals[],
1045 const LocalOrdinal cols[],
1059 virtual LocalOrdinal
1063 const GlobalOrdinal inds[],
1065 const LocalOrdinal numElts);
1107 const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1108 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1114 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1115 const Teuchos::ArrayView<const Scalar>& vals);
1133 const LocalOrdinal numEnt,
1134 const Scalar vals[],
1135 const GlobalOrdinal cols[]);
1148 virtual LocalOrdinal
1152 const LocalOrdinal inds[],
1154 const LocalOrdinal numElts);
1195 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1196 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1203 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1204 const Teuchos::ArrayView<const Scalar>& vals);
1225 const LocalOrdinal numEnt,
1226 const Scalar inputVals[],
1227 const LocalOrdinal inputCols[]);
1234 static const bool useAtomicUpdatesByDefault =
1235 #ifdef KOKKOS_ENABLE_SERIAL
1236 !std::is_same<execution_space, Kokkos::Serial>::value;
1239 #endif // KOKKOS_ENABLE_SERIAL
1265 virtual LocalOrdinal
1269 const GlobalOrdinal inds[],
1271 const LocalOrdinal numElts,
1272 const bool atomic = useAtomicUpdatesByDefault);
1313 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1314 const Teuchos::ArrayView<const Scalar>& vals,
1315 const bool atomic = useAtomicUpdatesByDefault);
1341 const LocalOrdinal numEnt,
1342 const Scalar vals[],
1343 const GlobalOrdinal cols[],
1344 const bool atomic = useAtomicUpdatesByDefault);
1359 virtual LocalOrdinal
1363 const LocalOrdinal inds[],
1365 const LocalOrdinal numElts,
1366 const bool atomic = useAtomicUpdatesByDefault);
1408 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1409 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1410 const bool atomic = useAtomicUpdatesByDefault);
1443 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1444 const Teuchos::ArrayView<const Scalar>& vals,
1445 const bool atomic = useAtomicUpdatesByDefault);
1470 const LocalOrdinal numEnt,
1471 const Scalar vals[],
1472 const LocalOrdinal cols[],
1473 const bool atomic = useAtomicUpdatesByDefault);
1510 const LocalOrdinal inds[],
1512 const LocalOrdinal numElts,
1514 const bool atomic = useAtomicUpdatesByDefault);
1550 const GlobalOrdinal inds[],
1552 const LocalOrdinal numElts,
1554 const bool atomic = useAtomicUpdatesByDefault);
1583 transformLocalValues(
const LocalOrdinal lclRow,
1584 const LocalOrdinal numInputEnt,
1586 const LocalOrdinal inputCols[],
1588 const bool atomic = useAtomicUpdatesByDefault);
1617 transformGlobalValues(
const GlobalOrdinal gblRow,
1618 const LocalOrdinal numInputEnt,
1620 const GlobalOrdinal inputCols[],
1622 const bool atomic = useAtomicUpdatesByDefault);
1668 template <
class LocalIndicesViewType,
1669 class ImplScalarViewType,
1670 class BinaryFunction>
1673 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1674 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1676 const bool atomic = useAtomicUpdatesByDefault) {
1683 static_assert(Kokkos::is_view<LocalIndicesViewType>::value,
1684 "First template parameter LocalIndicesViewType must be "
1686 static_assert(Kokkos::is_view<ImplScalarViewType>::value,
1687 "Second template parameter ImplScalarViewType must be a "
1689 static_assert(static_cast<int>(LocalIndicesViewType::rank) == 1,
1690 "First template parameter LocalIndicesViewType must "
1692 static_assert(static_cast<int>(ImplScalarViewType::rank) == 1,
1693 "Second template parameter ImplScalarViewType must have "
1695 static_assert(std::is_same<
1696 typename LocalIndicesViewType::non_const_value_type,
1698 "First template parameter LocalIndicesViewType must "
1699 "contain values of type local_ordinal_type.");
1700 static_assert(std::is_same<
1701 typename ImplScalarViewType::non_const_value_type,
1703 "Second template parameter ImplScalarViewType must "
1704 "contain values of type impl_scalar_type.");
1705 typedef LocalOrdinal LO;
1706 const LO numInputEnt = inputInds.extent(0);
1707 if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1708 return Teuchos::OrdinalTraits<LO>::invalid();
1710 return this->transformLocalValues(lclRow,
1759 template <
class BinaryFunction,
class InputMemorySpace>
1762 const Kokkos::View<
const GlobalOrdinal*,
1764 Kokkos::MemoryUnmanaged>& inputInds,
1767 Kokkos::MemoryUnmanaged>& inputVals,
1769 const bool atomic = useAtomicUpdatesByDefault) {
1770 typedef LocalOrdinal LO;
1771 const LO numInputEnt = inputInds.extent(0);
1772 if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1773 return Teuchos::OrdinalTraits<LO>::invalid();
1775 return this->transformGlobalValues(gblRow,
1787 void scale(
const Scalar& alpha);
1814 setAllValues(
const typename local_graph_device_type::row_map_type& ptr,
1815 const typename local_graph_device_type::entries_type::non_const_type& ind,
1816 const typename local_matrix_device_type::values_type& val);
1867 const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1868 const Teuchos::ArrayRCP<Scalar>& val);
1929 void resumeFill(
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1989 fillComplete(
const Teuchos::RCP<const map_type>& domainMap,
1990 const Teuchos::RCP<const map_type>& rangeMap,
1991 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2020 fillComplete(
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2050 const Teuchos::RCP<const map_type>& rangeMap,
2051 const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2052 const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2053 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2073 replaceColMap(
const Teuchos::RCP<const map_type>& newColMap);
2158 const Teuchos::RCP<const map_type>& newColMap,
2159 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2160 const bool sortEachRow =
true);
2189 Teuchos::RCP<const import_type>& newImporter);
2218 Teuchos::RCP<const export_type>& newExporter);
2241 Teuchos::RCP<const Teuchos::Comm<int> >
getComm()
const override;
2244 Teuchos::RCP<const map_type>
getRowMap()
const override;
2247 Teuchos::RCP<const map_type>
getColMap()
const override;
2250 Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2254 Teuchos::RCP<const crs_graph_type>
getCrsGraph()
const;
2270 #if __armclang_major__ == 22 && __armclang_minor__ == 1
2275 #define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2277 #define TPETRA_DETAILS_ALWAYS_INLINE
2293 local_matrix_host_type getLocalMatrixHost()
const;
2294 #undef TPETRA_DETAILS_ALWAYS_INLINE
2524 using values_dualv_type =
2525 Kokkos::DualView<impl_scalar_type*, device_type>;
2526 using values_wdv_type =
2528 values_wdv_type valuesUnpacked_wdv;
2529 mutable values_wdv_type valuesPacked_wdv;
2582 nonconst_global_inds_host_view_type& Indices,
2583 nonconst_values_host_view_type& Values,
2584 size_t& NumEntries)
const override;
2602 nonconst_local_inds_host_view_type& Indices,
2603 nonconst_values_host_view_type& Values,
2604 size_t& NumEntries)
const override;
2621 global_inds_host_view_type& indices,
2622 values_host_view_type& values)
const override;
2638 local_inds_host_view_type& indices,
2639 values_host_view_type& values)
const override;
2727 Kokkos::MemoryUnmanaged>& offsets)
const;
2753 const Teuchos::ArrayView<const size_t>& offsets)
const;
2837 const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2838 const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one(),
2839 const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero())
const;
2844 Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2864 Teuchos::ETransp mode = Teuchos::NO_TRANS,
2865 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2866 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const override;
2878 Teuchos::RCP<const map_type>
getDomainMap()
const override;
2886 Teuchos::RCP<const map_type>
getRangeMap()
const override;
2902 virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2903 add(
const Scalar& alpha,
2908 const Teuchos::RCP<Teuchos::ParameterList>& params)
const override;
2920 describe(Teuchos::FancyOStream& out,
2921 const Teuchos::EVerbosityLevel verbLevel =
2922 Teuchos::Describable::verbLevel_default)
const override;
2932 typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2941 const bool verbose);
2945 copyAndPermuteStaticGraph(
2947 const size_t numSameIDs,
2948 const LocalOrdinal permuteToLIDs[],
2949 const LocalOrdinal permuteFromLIDs[],
2950 const size_t numPermutes);
2953 copyAndPermuteNonStaticGraph(
2955 const size_t numSameIDs,
2956 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2957 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2958 const size_t numPermutes);
2967 const size_t numSameIDs,
2968 const Kokkos::DualView<
2971 const Kokkos::DualView<
2978 const Kokkos::DualView<
2981 Kokkos::DualView<char*, buffer_device_type>& exports,
2982 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2983 size_t& constantNumPackets)
override;
2994 unpackAndCombineImpl(
2997 Kokkos::DualView<char*, buffer_device_type> imports,
2998 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2999 const size_t constantNumPackets,
3001 const bool verbose);
3006 unpackAndCombineImplNonStatic(
3009 Kokkos::DualView<char*, buffer_device_type> imports,
3010 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3011 const size_t constantNumPackets,
3025 unpackAndCombine(
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3026 Kokkos::DualView<char*, buffer_device_type> imports,
3027 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3028 const size_t constantNumPackets,
3142 packNew(
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3143 Kokkos::DualView<char*, buffer_device_type>& exports,
3144 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3145 size_t& constantNumPackets)
const;
3155 packNonStaticNew(
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3156 Kokkos::DualView<char*, buffer_device_type>& exports,
3157 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3158 size_t& constantNumPackets)
const;
3190 packRow(
char exports[],
3191 const size_t offset,
3192 const size_t numEnt,
3193 const GlobalOrdinal gidsIn[],
3195 const size_t numBytesPerValue)
const;
3221 packRowStatic(
char*
const numEntOut,
3224 const size_t numEnt,
3225 const LocalOrdinal lclRow)
const;
3253 unpackRow(GlobalOrdinal gidsOut[],
3255 const char imports[],
3256 const size_t offset,
3257 const size_t numBytes,
3258 const size_t numEnt,
3259 const size_t numBytesPerValue);
3270 allocatePackSpaceNew(Kokkos::DualView<char*, buffer_device_type>& exports,
3271 size_t& totalNumEntries,
3278 typename local_matrix_host_type::values_type::const_type
3280 return valuesPacked_wdv.getHostView(s);
3284 typename local_matrix_host_type::values_type
3286 return valuesPacked_wdv.getHostView(s);
3290 typename local_matrix_host_type::values_type
3292 return valuesPacked_wdv.getHostView(s);
3296 typename local_matrix_device_type::values_type::const_type
3298 return valuesPacked_wdv.getDeviceView(s);
3302 typename local_matrix_device_type::values_type
3304 return valuesPacked_wdv.getDeviceView(s);
3308 typename local_matrix_device_type::values_type
3310 return valuesPacked_wdv.getDeviceView(s);
3315 template <
class CrsMatrixType>
3316 friend Teuchos::RCP<CrsMatrixType>
3318 const Import<
typename CrsMatrixType::local_ordinal_type,
3319 typename CrsMatrixType::global_ordinal_type,
3320 typename CrsMatrixType::node_type>& importer,
3321 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3322 typename CrsMatrixType::global_ordinal_type,
3323 typename CrsMatrixType::node_type> >& domainMap,
3324 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3325 typename CrsMatrixType::global_ordinal_type,
3326 typename CrsMatrixType::node_type> >& rangeMap,
3327 const Teuchos::RCP<Teuchos::ParameterList>& params);
3330 template <
class CrsMatrixType>
3331 friend Teuchos::RCP<CrsMatrixType>
3333 const Import<
typename CrsMatrixType::local_ordinal_type,
3334 typename CrsMatrixType::global_ordinal_type,
3335 typename CrsMatrixType::node_type>& rowImporter,
3336 const Import<
typename CrsMatrixType::local_ordinal_type,
3337 typename CrsMatrixType::global_ordinal_type,
3338 typename CrsMatrixType::node_type>& domainImporter,
3339 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3340 typename CrsMatrixType::global_ordinal_type,
3341 typename CrsMatrixType::node_type> >& domainMap,
3342 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3343 typename CrsMatrixType::global_ordinal_type,
3344 typename CrsMatrixType::node_type> >& rangeMap,
3345 const Teuchos::RCP<Teuchos::ParameterList>& params);
3348 template <
class CrsMatrixType>
3349 friend Teuchos::RCP<CrsMatrixType>
3351 const Export<
typename CrsMatrixType::local_ordinal_type,
3352 typename CrsMatrixType::global_ordinal_type,
3353 typename CrsMatrixType::node_type>& exporter,
3354 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3355 typename CrsMatrixType::global_ordinal_type,
3356 typename CrsMatrixType::node_type> >& domainMap,
3357 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3358 typename CrsMatrixType::global_ordinal_type,
3359 typename CrsMatrixType::node_type> >& rangeMap,
3360 const Teuchos::RCP<Teuchos::ParameterList>& params);
3363 template <
class CrsMatrixType>
3364 friend Teuchos::RCP<CrsMatrixType>
3366 const Export<
typename CrsMatrixType::local_ordinal_type,
3367 typename CrsMatrixType::global_ordinal_type,
3368 typename CrsMatrixType::node_type>& rowExporter,
3369 const Export<
typename CrsMatrixType::local_ordinal_type,
3370 typename CrsMatrixType::global_ordinal_type,
3371 typename CrsMatrixType::node_type>& domainExporter,
3372 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3373 typename CrsMatrixType::global_ordinal_type,
3374 typename CrsMatrixType::node_type> >& domainMap,
3375 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3376 typename CrsMatrixType::global_ordinal_type,
3377 typename CrsMatrixType::node_type> >& rangeMap,
3378 const Teuchos::RCP<Teuchos::ParameterList>& params);
3399 const Teuchos::RCP<const map_type>& domainMap,
3400 const Teuchos::RCP<const map_type>& rangeMap,
3401 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3422 const Teuchos::RCP<const map_type>& domainMap,
3423 const Teuchos::RCP<const map_type>& rangeMap,
3424 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3444 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3445 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3446 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3467 const Teuchos::RCP<const map_type>& domainMap,
3468 const Teuchos::RCP<const map_type>& rangeMap,
3469 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3494 const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3495 const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> >& domainTransfer,
3496 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3497 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3498 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3515 const GlobalOrdinal gblColInds[],
3517 const size_t numInputEnt);
3530 insertGlobalValuesFiltered(
3531 const GlobalOrdinal globalRow,
3532 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3533 const Teuchos::ArrayView<const Scalar>& values,
3539 insertGlobalValuesFilteredChecked(
3540 const GlobalOrdinal globalRow,
3541 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3542 const Teuchos::ArrayView<const Scalar>& values,
3543 const char*
const prefix,
3545 const bool verbose);
3559 combineGlobalValues(
3560 const GlobalOrdinal globalRowIndex,
3561 const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3562 const Teuchos::ArrayView<const Scalar>& values,
3564 const char*
const prefix,
3566 const bool verbose);
3590 combineGlobalValuesRaw(
const LocalOrdinal lclRow,
3591 const LocalOrdinal numEnt,
3593 const GlobalOrdinal cols[],
3595 const char*
const prefix,
3597 const bool verbose);
3610 template <
class BinaryFunction>
3612 transformGlobalValues(
const GlobalOrdinal globalRow,
3613 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3614 const Teuchos::ArrayView<const Scalar>& values,
3616 const bool atomic = useAtomicUpdatesByDefault) {
3618 typedef LocalOrdinal LO;
3619 typedef GlobalOrdinal GO;
3621 const LO numInputEnt =
static_cast<LO
>(indices.size());
3622 if (static_cast<LO>(values.size()) != numInputEnt) {
3623 return Teuchos::OrdinalTraits<LO>::invalid();
3626 const GO*
const inputCols = indices.getRawPtr();
3627 const IST*
const inputVals =
3628 reinterpret_cast<const IST*
>(values.getRawPtr());
3629 return this->transformGlobalValues(globalRow, numInputEnt, inputVals,
3630 inputCols, f, atomic);
3640 insertNonownedGlobalValues(
const GlobalOrdinal globalRow,
3641 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3642 const Teuchos::ArrayView<const Scalar>& values);
3689 const typename crs_graph_type::SLocalGlobalViews& newInds,
3690 const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3691 const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3692 const ELocalGlobal lg,
3693 const ELocalGlobal I);
3697 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3698 typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3699 typedef Kokkos::ArithTraits<mag_type> STM;
3700 typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3701 typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3705 enum GraphAllocationStatus {
3706 GraphAlreadyAllocated,
3707 GraphNotYetAllocated
3730 const bool verbose);
3817 const bool force =
false)
const;
3842 const bool force =
false)
const;
3855 const Teuchos::ETransp mode,
3863 typename values_dualv_type::t_host::const_type
3868 typename values_dualv_type::t_dev::const_type
3873 typename values_dualv_type::t_host
3878 typename values_dualv_type::t_dev
3886 using local_matrix_int_rowptrs_device_type =
3896 local_matrix_int_rowptrs_device_type,
3899 std::shared_ptr<ApplyHelper> getApplyHelper()
const {
3902 applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3909 friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3913 template <
typename S,
typename LO,
typename GO,
typename NODE,
typename LOV>
3914 friend struct Tpetra::MMdetails::KernelWrappers;
3915 template <
typename S,
typename LO,
typename GO,
typename NODE,
typename LOV>
3916 friend struct Tpetra::MMdetails::KernelWrappers2;
3919 friend void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3920 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3921 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3922 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3923 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3924 bool userAssertsThereAreNoRemotes,
3925 const std::string& label,
3926 const Teuchos::RCP<Teuchos::ParameterList>& params);
3931 void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& matrix);
3939 void fillLocalMatrix(
const Teuchos::RCP<Teuchos::ParameterList>& params);
3963 Teuchos::RCP<const Graph> staticGraph_;
3964 Teuchos::RCP<Graph> myGraph_;
3978 Details::STORAGE_1D_UNPACKED;
4010 std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4011 Teuchos::Array<Scalar> > >
4020 mutable std::shared_ptr<ApplyHelper> applyHelper;
4027 template <
class DestViewType,
class SrcViewType,
4028 class DestOffsetViewType,
class SrcOffsetViewType>
4029 struct pack_functor {
4033 SrcOffsetViewType src_offset_;
4034 DestOffsetViewType dst_offset_;
4035 typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4037 pack_functor(DestViewType dst,
4038 const SrcViewType src,
4039 DestOffsetViewType dst_offset,
4040 const SrcOffsetViewType src_offset)
4043 , src_offset_(src_offset)
4044 , dst_offset_(dst_offset) {}
4046 KOKKOS_INLINE_FUNCTION
4047 void operator()(
const LocalOrdinal row)
const {
4048 scalar_index_type srcPos = src_offset_(row);
4049 const scalar_index_type dstEnd = dst_offset_(row + 1);
4050 scalar_index_type dstPos = dst_offset_(row);
4051 for (; dstPos < dstEnd; ++dstPos, ++srcPos) {
4052 dst_(dstPos) = src_(srcPos);
4062 template <
class Scalar,
4064 class GlobalOrdinal,
4066 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4069 const size_t maxNumEntriesPerRow = 0,
4070 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
4073 return Teuchos::rcp(
new matrix_type(map, maxNumEntriesPerRow,
4077 template <
class CrsMatrixType>
4078 Teuchos::RCP<CrsMatrixType>
4080 const Import<
typename CrsMatrixType::local_ordinal_type,
4081 typename CrsMatrixType::global_ordinal_type,
4082 typename CrsMatrixType::node_type>& importer,
4083 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4084 typename CrsMatrixType::global_ordinal_type,
4085 typename CrsMatrixType::node_type> >& domainMap,
4086 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4087 typename CrsMatrixType::global_ordinal_type,
4088 typename CrsMatrixType::node_type> >& rangeMap,
4089 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4090 Teuchos::RCP<CrsMatrixType> destMatrix;
4091 sourceMatrix->importAndFillComplete(destMatrix, importer, domainMap, rangeMap, params);
4095 template <
class CrsMatrixType>
4096 Teuchos::RCP<CrsMatrixType>
4098 const Import<
typename CrsMatrixType::local_ordinal_type,
4099 typename CrsMatrixType::global_ordinal_type,
4100 typename CrsMatrixType::node_type>& rowImporter,
4101 const Import<
typename CrsMatrixType::local_ordinal_type,
4102 typename CrsMatrixType::global_ordinal_type,
4103 typename CrsMatrixType::node_type>& domainImporter,
4104 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4105 typename CrsMatrixType::global_ordinal_type,
4106 typename CrsMatrixType::node_type> >& domainMap,
4107 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4108 typename CrsMatrixType::global_ordinal_type,
4109 typename CrsMatrixType::node_type> >& rangeMap,
4110 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4111 Teuchos::RCP<CrsMatrixType> destMatrix;
4112 sourceMatrix->importAndFillComplete(destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4116 template <
class CrsMatrixType>
4117 Teuchos::RCP<CrsMatrixType>
4119 const Export<
typename CrsMatrixType::local_ordinal_type,
4120 typename CrsMatrixType::global_ordinal_type,
4121 typename CrsMatrixType::node_type>& exporter,
4122 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4123 typename CrsMatrixType::global_ordinal_type,
4124 typename CrsMatrixType::node_type> >& domainMap,
4125 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4126 typename CrsMatrixType::global_ordinal_type,
4127 typename CrsMatrixType::node_type> >& rangeMap,
4128 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4129 Teuchos::RCP<CrsMatrixType> destMatrix;
4130 sourceMatrix->exportAndFillComplete(destMatrix, exporter, domainMap, rangeMap, params);
4134 template <
class CrsMatrixType>
4135 Teuchos::RCP<CrsMatrixType>
4137 const Export<
typename CrsMatrixType::local_ordinal_type,
4138 typename CrsMatrixType::global_ordinal_type,
4139 typename CrsMatrixType::node_type>& rowExporter,
4140 const Export<
typename CrsMatrixType::local_ordinal_type,
4141 typename CrsMatrixType::global_ordinal_type,
4142 typename CrsMatrixType::node_type>& domainExporter,
4143 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4144 typename CrsMatrixType::global_ordinal_type,
4145 typename CrsMatrixType::node_type> >& domainMap,
4146 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4147 typename CrsMatrixType::global_ordinal_type,
4148 typename CrsMatrixType::node_type> >& rangeMap,
4149 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4150 Teuchos::RCP<CrsMatrixType> destMatrix;
4151 sourceMatrix->exportAndFillComplete(destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4161 template <
class CrsMatrixType>
4163 typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType
const& threshold =
4164 Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude(Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero())) {
4165 auto localMatrix = matrix.getLocalMatrixDevice();
4166 size_t nnzBefore = localMatrix.nnz();
4168 size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4171 size_t globalNNZRemoved = 0;
4172 Teuchos::reduceAll<int, size_t>(*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4173 if (globalNNZRemoved !=
size_t(0)) {
4174 matrix.resumeFill();
4175 matrix.setAllValues(localMatrix);
4176 matrix.expertStaticFillComplete(matrix.getDomainMap(), matrix.getRangeMap());
4189 #endif // TPETRA_CRSMATRIX_DECL_HPP
CrsMatrix & operator=(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assignment.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
KokkosSparse::StaticCrsGraph< local_ordinal_type, Kokkos::LayoutLeft, device_type, void, size_t > local_graph_device_type
The type of the part of the sparse graph on each MPI process.
void checkInternalState() const
Check that this object's state is sane; throw if it's not.
Sparse matrix that presents a row-oriented interface that lets users read or modify entries...
Teuchos::RCP< CrsMatrixType > exportAndFillCompleteCrsMatrix(const Teuchos::RCP< const CrsMatrixType > &sourceMatrix, const Export< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &exporter, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Nonmember CrsMatrix constructor that fuses Export and fillComplete().
CrsGraph< LocalOrdinal, GlobalOrdinal, Node > crs_graph_type
The CrsGraph specialization suitable for this CrsMatrix specialization.
void replaceColMap(const Teuchos::RCP< const map_type > &newColMap)
Replace the matrix's column Map with the given Map.
virtual LocalOrdinal replaceGlobalValuesImpl(impl_scalar_type rowVals[], const crs_graph_type &graph, const RowInfo &rowInfo, const GlobalOrdinal inds[], const impl_scalar_type newVals[], const LocalOrdinal numElts)
Implementation detail of replaceGlobalValues.
virtual bool supportsRowViews() const override
Return true if getLocalRowView() and getGlobalRowView() are valid for this object.
mag_type getNormInf() const
Compute and return the infinity norm of the matrix.
void replaceDomainMapAndImporter(const Teuchos::RCP< const map_type > &newDomainMap, Teuchos::RCP< const import_type > &newImporter)
Replace the current domain Map and Import with the given objects.
static size_t mergeRowIndicesAndValues(size_t rowLen, local_ordinal_type *cols, impl_scalar_type *vals)
Merge duplicate row indices in the given row, along with their corresponding values.
void getGlobalRowCopy(GlobalOrdinal GlobalRow, nonconst_global_inds_host_view_type &Indices, nonconst_values_host_view_type &Values, size_t &NumEntries) const override
Fill given arrays with a deep copy of the locally owned entries of the matrix in a given row...
virtual void copyAndPermute(const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM)
Perform copies and permutations that are local to the calling (MPI) process.
Teuchos::RCP< const map_type > getRangeMap() const override
The range Map of this matrix.
global_size_t getGlobalNumRows() const override
Number of global elements in the row map of this matrix.
std::map< GlobalOrdinal, std::pair< Teuchos::Array< GlobalOrdinal >, Teuchos::Array< Scalar > > > nonlocals_
Nonlocal data added using insertGlobalValues().
void sortAndMergeIndicesAndValues(const bool sorted, const bool merged)
Sort and merge duplicate local column indices in all rows on the calling process, along with their co...
typename device_type::execution_space execution_space
The Kokkos execution space.
void packNew(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< char *, buffer_device_type > &exports, const Kokkos::DualView< size_t *, buffer_device_type > &numPacketsPerLID, size_t &constantNumPackets) const
Pack this object's data for an Import or Export.
virtual void insertGlobalValuesImpl(crs_graph_type &graph, RowInfo &rowInfo, const GlobalOrdinal gblColInds[], const impl_scalar_type vals[], const size_t numInputEnt)
Common implementation detail of insertGlobalValues and insertGlobalValuesFiltered.
row_ptrs_device_view_type getLocalRowPtrsDevice() const
Get a device view of the CRS packed row pointers.
local_matrix_device_type::values_type getLocalValuesDevice(Access::OverwriteAllStruct s)
Get the Kokkos local values on device, overwrite all.
typename Kokkos::ArithTraits< impl_scalar_type >::mag_type mag_type
Type of a norm result.
void getGlobalRowView(GlobalOrdinal GlobalRow, global_inds_host_view_type &indices, values_host_view_type &values) const override
Get a constant, nonpersisting view of a row of this matrix, using global row and column indices...
void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to alpha.
mag_type getNorm1(bool assumeSymmetric=false) const
Compute and return the 1-norm of the matrix.
void replaceRangeMapAndExporter(const Teuchos::RCP< const map_type > &newRangeMap, Teuchos::RCP< const export_type > &newExporter)
Replace the current Range Map and Export with the given objects.
One or more distributed dense vectors.
void scale(const Scalar &alpha)
Scale the matrix's values: this := alpha*this.
size_t getLocalNumCols() const override
The number of columns connected to the locally owned rows of this matrix.
void fillLocalGraphAndMatrix(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Fill data into the local graph and matrix.
void resumeFill(const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Resume operations that may change the values or structure of the matrix.
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the left with the given Vector.
GlobalOrdinal global_ordinal_type
The type of each global index in the matrix.
Declaration and generic definition of traits class that tells Tpetra::CrsMatrix how to pack and unpac...
local_inds_host_view_type getLocalIndicesHost() const
Get a host view of the CRS packed column indicies.
typename device_type::memory_space memory_space
The Kokkos memory space.
virtual ~CrsMatrix()=default
Destructor (virtual for memory safety of derived classes).
void reindexColumns(crs_graph_type *const graph, const Teuchos::RCP< const map_type > &newColMap, const Teuchos::RCP< const import_type > &newImport=Teuchos::null, const bool sortEachRow=true)
Reindex the column indices in place, and replace the column Map. Optionally, replace the Import objec...
Import< LocalOrdinal, GlobalOrdinal, Node > import_type
The Import specialization suitable for this CrsMatrix specialization.
local_matrix_host_type::values_type getLocalValuesHost(Access::OverwriteAllStruct s)
Get the Kokkos local values on host, overwrite all.
Teuchos::RCP< const crs_graph_type > getCrsGraph() const
This matrix's graph, as a CrsGraph.
virtual void unpackAndCombine(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< packet_type *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode combineMode)
Perform any unpacking and combining after communication.
size_t getGlobalMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, over all processes in the matrix's communicator...
void applyNonTranspose(const MV &X_in, MV &Y_in, Scalar alpha, Scalar beta) const
Special case of apply() for mode == Teuchos::NO_TRANS.
Teuchos::RCP< CrsMatrix< T, LocalOrdinal, GlobalOrdinal, Node > > convert() const
Return another CrsMatrix with the same entries, but converted to a different Scalar type T...
Scalar scalar_type
The type of each entry in the matrix.
Allocation information for a locally owned row in a CrsGraph or CrsMatrix.
void swap(CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &matrix)
Swaps the data from *this with the data and maps from crsMatrix.
void fillLocalMatrix(const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Fill data into the local matrix.
LocalOrdinal transformGlobalValues(const GlobalOrdinal gblRow, const Kokkos::View< const GlobalOrdinal *, InputMemorySpace, Kokkos::MemoryUnmanaged > &inputInds, const Kokkos::View< const impl_scalar_type *, InputMemorySpace, Kokkos::MemoryUnmanaged > &inputVals, BinaryFunction f, const bool atomic=useAtomicUpdatesByDefault)
Transform CrsMatrix entries in place, using global indices to select the entries in the row to transf...
void globalAssemble()
Communicate nonlocal contributions to other processes.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag) const override
Get a constant, nonpersisting view of a row of this matrix, using local row and column indices...
KokkosSparse::CrsMatrix< impl_scalar_type, local_ordinal_type, device_type, void, typename local_graph_device_type::size_type > local_matrix_device_type
The specialization of Kokkos::CrsMatrix that represents the part of the sparse matrix on each MPI pro...
virtual LocalOrdinal sumIntoLocalValuesImpl(impl_scalar_type rowVals[], const crs_graph_type &graph, const RowInfo &rowInfo, const LocalOrdinal inds[], const impl_scalar_type newVals[], const LocalOrdinal numElts, const bool atomic=useAtomicUpdatesByDefault)
Implementation detail of sumIntoLocalValues.
local_matrix_host_type::values_type::const_type getLocalValuesHost(Access::ReadOnlyStruct s) const
Get the Kokkos local values on host, read only.
bool isFillActive() const
Whether the matrix is not fill complete.
typename Kokkos::ArithTraits< Scalar >::val_type impl_scalar_type
The type used internally in place of Scalar.
Teuchos::RCP< MV > importMV_
Column Map MultiVector used in apply().
bool isStaticGraph() const
Indicates that the graph is static, so that new entries cannot be added to this matrix.
size_t global_size_t
Global size_t object.
bool hasTransposeApply() const override
Whether apply() allows applying the transpose or conjugate transpose.
size_t getLocalMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, on this process.
void exportAndFillComplete(Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &destMatrix, const export_type &exporter, const Teuchos::RCP< const map_type > &domainMap=Teuchos::null, const Teuchos::RCP< const map_type > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null) const
Export from this to the given destination matrix, and make the result fill complete.
values_dualv_type::t_dev::const_type getValuesViewDevice(const RowInfo &rowinfo) const
Get a const Device view of the locally owned values row myRow, such that rowinfo = getRowInfo(myRow)...
bool isFillComplete() const override
Whether the matrix is fill complete.
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
The communicator over which the matrix is distributed.
void importAndFillComplete(Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &destMatrix, const import_type &importer, const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null) const
Import from this to the given destination matrix, and make the result fill complete.
Abstract interface for operators (e.g., matrices and preconditioners).
TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type getLocalMatrixDevice() const
The local sparse matrix.
local_matrix_device_type::values_type getLocalValuesDevice(Access::ReadWriteStruct s)
Get the Kokkos local values on device, read write.
GlobalOrdinal getIndexBase() const override
The index base for global indices for this matrix.
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
virtual void packAndPrepare(const SrcDistObject &source, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< packet_type *, buffer_device_type > &exports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, size_t &constantNumPackets)
Pack data and metadata for communication (sends).
Teuchos::RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > createCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, const size_t maxNumEntriesPerRow=0, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Create an empty CrsMatrix given a row map and a single integer upper bound on the number of stored en...
Node node_type
This class' Kokkos Node type.
Teuchos::RCP< MV > getColumnMapMultiVector(const MV &X_domainMap, const bool force=false) const
Create a (or fetch a cached) column Map MultiVector.
Keep track of how much more space a CrsGraph or CrsMatrix needs, when the graph or matrix is the targ...
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const override
Print this object with the given verbosity level to the given output stream.
Teuchos::RCP< const RowGraph< LocalOrdinal, GlobalOrdinal, Node > > getGraph() const override
This matrix's graph, as a RowGraph.
CombineMode
Rule for combining data in an Import or Export.
row_ptrs_host_view_type getLocalRowPtrsHost() const
Get a host view of the CRS packed row pointers.
DistObject< Scalar, LocalOrdinal, GlobalOrdinal, Node >::buffer_device_type buffer_device_type
Kokkos::Device specialization for communication buffers.
void unpackAndCombine(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< char *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode CM) override
Unpack the imported column indices and values, and combine into matrix.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
A class can inherit from this if it wants to use Tpetra managed spaces.
bool isGloballyIndexed() const override
Whether the matrix is globally indexed on the calling process.
Forward declaration of Tpetra::CrsMatrix.
LocalOrdinal sumIntoGlobalValues(const GlobalOrdinal globalRow, const Teuchos::ArrayView< const GlobalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals, const bool atomic=useAtomicUpdatesByDefault)
Sum into one or more sparse matrix entries, using global indices.
bool fillComplete_
Whether the matrix is fill complete.
virtual Teuchos::RCP< RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > add(const Scalar &alpha, const RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) const override
Implementation of RowMatrix::add: return alpha*A + beta*this.
local_ordinal_type replaceGlobalValues(const global_ordinal_type globalRow, const Kokkos::View< const global_ordinal_type *, Kokkos::AnonymousSpace > &inputInds, const Kokkos::View< const impl_scalar_type *, Kokkos::AnonymousSpace > &inputVals)
Replace one or more entries' values, using global indices.
virtual LocalOrdinal sumIntoGlobalValuesImpl(impl_scalar_type rowVals[], const crs_graph_type &graph, const RowInfo &rowInfo, const GlobalOrdinal inds[], const impl_scalar_type newVals[], const LocalOrdinal numElts, const bool atomic=useAtomicUpdatesByDefault)
Implementation detail of sumIntoGlobalValues.
Abstract base class for objects that can be the source of an Import or Export operation.
local_ordinal_type sumIntoLocalValues(const local_ordinal_type localRow, const Kokkos::View< const local_ordinal_type *, Kokkos::AnonymousSpace > &inputInds, const Kokkos::View< const impl_scalar_type *, Kokkos::AnonymousSpace > &inputVals, const bool atomic=useAtomicUpdatesByDefault)
Sum into one or more sparse matrix entries, using local row and column indices.
typename Node::device_type device_type
The Kokkos device type.
size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const override
Number of entries in the sparse matrix in the given local row, on the calling (MPI) process...
Teuchos::RCP< MV > getRowMapMultiVector(const MV &Y_rangeMap, const bool force=false) const
Create a (or fetch a cached) row Map MultiVector.
std::string description() const override
A one-line description of this object.
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &offsets) const
Get offsets of the diagonal entries in the matrix.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const override
Compute a sparse matrix-MultiVector multiply.
size_t getLocalNumEntries() const override
The local number of entries in this matrix.
void fillComplete(const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Tell the matrix that you are done changing its structure or values, and that you are ready to do comp...
void insertGlobalValues(const GlobalOrdinal globalRow, const Teuchos::ArrayView< const GlobalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals)
Insert one or more entries into the matrix, using global column indices.
virtual LocalOrdinal replaceLocalValuesImpl(impl_scalar_type rowVals[], const crs_graph_type &graph, const RowInfo &rowInfo, const LocalOrdinal inds[], const impl_scalar_type newVals[], const LocalOrdinal numElts)
Implementation detail of replaceLocalValues.
values_dualv_type::t_dev getValuesViewDeviceNonConst(const RowInfo &rowinfo)
Get a non-const Device view of the locally owned values row myRow, such that rowinfo = getRowInfo(myR...
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap) override
Remove processes owning zero rows from the Maps and their communicator.
virtual bool checkSizes(const SrcDistObject &source) override
Compare the source and target (this) objects for compatibility.
LocalOrdinal transformLocalValues(const LocalOrdinal lclRow, const typename UnmanagedView< LocalIndicesViewType >::type &inputInds, const typename UnmanagedView< ImplScalarViewType >::type &inputVals, BinaryFunction f, const bool atomic=useAtomicUpdatesByDefault)
Transform CrsMatrix entries in place, using local indices to select the entries in the row to transfo...
virtual LocalOrdinal getBlockSize() const override
The number of degrees of freedom per mesh point.
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
typename row_matrix_type::impl_scalar_type impl_scalar_type
The type used internally in place of Scalar.
A parallel distribution of indices over processes.
void getLocalRowCopy(LocalOrdinal LocalRow, nonconst_local_inds_host_view_type &Indices, nonconst_values_host_view_type &Values, size_t &NumEntries) const override
Fill given arrays with a deep copy of the locally owned entries of the matrix in a given row...
Teuchos::RCP< const map_type > getDomainMap() const override
The domain Map of this matrix.
local_matrix_host_type::values_type getLocalValuesHost(Access::ReadWriteStruct s)
Get the Kokkos local values on host, read write.
void insertLocalValues(const LocalOrdinal localRow, const Teuchos::ArrayView< const LocalOrdinal > &cols, const Teuchos::ArrayView< const Scalar > &vals, const CombineMode CM=ADD)
Insert one or more entries into the matrix, using local column indices.
Details::EStorageStatus storageStatus_
Status of the matrix's storage, when not in a fill-complete state.
A read-only, row-oriented interface to a sparse matrix.
local_inds_device_view_type getLocalIndicesDevice() const
Get a device_view of the CRS packed column indicies.
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the right with the given Vector.
void replaceDomainMap(const Teuchos::RCP< const map_type > &newDomainMap)
Replace the current domain Map with the given objects.
void getLocalRowView(LocalOrdinal LocalRow, local_inds_host_view_type &indices, values_host_view_type &values) const override
Get a constant view of a row of this matrix, using local row and column indices.
values_dualv_type::t_host::const_type getValuesViewHost(const RowInfo &rowinfo) const
Get a const Host view of the locally owned values row myRow, such that rowinfo = getRowInfo(myRow).
A distributed dense vector.
Teuchos::RCP< CrsMatrixType > importAndFillCompleteCrsMatrix(const Teuchos::RCP< const CrsMatrixType > &sourceMatrix, const Import< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &importer, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Nonmember CrsMatrix constructor that fuses Import and fillComplete().
void applyTranspose(const MV &X_in, MV &Y_in, const Teuchos::ETransp mode, Scalar alpha, Scalar beta) const
Special case of apply() for mode != Teuchos::NO_TRANS.
void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas, const bool verbose)
Allocate values (and optionally indices) using the Node.
void expertStaticFillComplete(const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap, const Teuchos::RCP< const import_type > &importer=Teuchos::null, const Teuchos::RCP< const export_type > &exporter=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Perform a fillComplete on a matrix that already has data.
size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const override
Number of entries in the sparse matrix in the given global row, on the calling (MPI) process...
void residual(const Operator< SC, LO, GO, NO > &A, const MultiVector< SC, LO, GO, NO > &X, const MultiVector< SC, LO, GO, NO > &B, MultiVector< SC, LO, GO, NO > &R)
Computes R = B - A * X.
local_matrix_device_type::values_type::const_type getLocalValuesDevice(Access::ReadOnlyStruct s) const
Get the Kokkos local values on device, read only.
void setAllValues(const typename local_graph_device_type::row_map_type &ptr, const typename local_graph_device_type::entries_type::non_const_type &ind, const typename local_matrix_device_type::values_type &val)
Set the local matrix using three (compressed sparse row) arrays.
bool isLocallyIndexed() const override
Whether the matrix is locally indexed on the calling process.
Teuchos::RCP< const map_type > getColMap() const override
The Map that describes the column distribution in this matrix.
local_ordinal_type replaceLocalValues(const local_ordinal_type localRow, const Kokkos::View< const local_ordinal_type *, Kokkos::AnonymousSpace > &inputInds, const Kokkos::View< const impl_scalar_type *, Kokkos::AnonymousSpace > &inputVals)
Replace one or more entries' values, using local row and column indices.
friend void batchedApply(const MatrixArray &Matrices, const typename std::remove_pointer< typename MultiVectorArray::value_type >::type &X, MultiVectorArray &Y, typename std::remove_pointer< typename MatrixArray::value_type >::type::scalar_type alpha, typename std::remove_pointer< typename MatrixArray::value_type >::type::scalar_type beta, Teuchos::RCP< Teuchos::ParameterList > params)
Does multiply matrix apply() calls with a single X vector.
void replaceRangeMap(const Teuchos::RCP< const map_type > &newRangeMap)
Replace the current range Map with the given objects.
Base class for distributed Tpetra objects that support data redistribution.
typename local_graph_device_type::HostMirror local_graph_host_type
The type of the part of the sparse graph on each MPI process.
void removeCrsMatrixZeros(CrsMatrixType &matrix, typename Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::magnitudeType const &threshold=Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::magnitude(Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::zero()))
Remove zero entries from a matrix.
LocalOrdinal local_ordinal_type
The type of each local index in the matrix.
EStorageStatus
Status of the graph's or matrix's storage, when not in a fill-complete state.
mag_type getFrobeniusNorm() const override
Compute and return the Frobenius norm of the matrix.
typename crs_graph_type::local_graph_device_type local_graph_device_type
The part of the sparse matrix's graph on each MPI process.
void localApply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, const Teuchos::ETransp mode=Teuchos::NO_TRANS, const Scalar &alpha=Teuchos::ScalarTraits< Scalar >::one(), const Scalar &beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Compute the local part of a sparse matrix-(Multi)Vector multiply.
Forward declaration of some Tpetra Matrix Matrix objects.
bool isStorageOptimized() const
Returns true if storage has been optimized.
virtual void copyAndPermute(const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM) override
values_dualv_type::t_host getValuesViewHostNonConst(const RowInfo &rowinfo)
Get a non-const Host view of the locally owned values row myRow, such that rowinfo = getRowInfo(myRow...
Export< LocalOrdinal, GlobalOrdinal, Node > export_type
The Export specialization suitable for this CrsMatrix specialization.
Teuchos::RCP< MV > exportMV_
Row Map MultiVector used in apply().
size_t getLocalNumRows() const override
The number of matrix rows owned by the calling process.
Teuchos::RCP< const map_type > getRowMap() const override
The Map that describes the row distribution in this matrix.
global_size_t getGlobalNumEntries() const override
The global number of entries in this matrix.