11 #ifndef TPETRA_CRSMATRIX_DECL_HPP
12 #define TPETRA_CRSMATRIX_DECL_HPP
19 #include "KokkosSparse_Utils.hpp"
20 #include "KokkosSparse_CrsMatrix.hpp"
21 #include "Tpetra_Details_MatrixApplyHelper.hpp"
22 #include "Tpetra_RowMatrix_decl.hpp"
23 #include "Tpetra_Exceptions.hpp"
24 #include "Tpetra_DistObject.hpp"
25 #include "Tpetra_CrsGraph.hpp"
26 #include "Tpetra_Vector.hpp"
28 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
29 #include "Teuchos_DataAccess.hpp"
37 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class crsMatrix_Swap_Tester;
90 template<
class CrsMatrixType>
91 Teuchos::RCP<CrsMatrixType>
93 const Import<
typename CrsMatrixType::local_ordinal_type,
94 typename CrsMatrixType::global_ordinal_type,
95 typename CrsMatrixType::node_type>& importer,
96 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
97 typename CrsMatrixType::global_ordinal_type,
98 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
99 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
100 typename CrsMatrixType::global_ordinal_type,
101 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
102 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
157 template<
class CrsMatrixType>
158 Teuchos::RCP<CrsMatrixType>
160 const Import<
typename CrsMatrixType::local_ordinal_type,
161 typename CrsMatrixType::global_ordinal_type,
162 typename CrsMatrixType::node_type>& rowImporter,
163 const Import<
typename CrsMatrixType::local_ordinal_type,
164 typename CrsMatrixType::global_ordinal_type,
165 typename CrsMatrixType::node_type>& domainImporter,
166 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
167 typename CrsMatrixType::global_ordinal_type,
168 typename CrsMatrixType::node_type> >& domainMap,
169 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
170 typename CrsMatrixType::global_ordinal_type,
171 typename CrsMatrixType::node_type> >& rangeMap,
172 const Teuchos::RCP<Teuchos::ParameterList>& params);
207 template<
class CrsMatrixType>
208 Teuchos::RCP<CrsMatrixType>
210 const Export<
typename CrsMatrixType::local_ordinal_type,
211 typename CrsMatrixType::global_ordinal_type,
212 typename CrsMatrixType::node_type>& exporter,
213 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
214 typename CrsMatrixType::global_ordinal_type,
215 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
216 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
217 typename CrsMatrixType::global_ordinal_type,
218 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
219 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
254 template<
class CrsMatrixType>
255 Teuchos::RCP<CrsMatrixType>
257 const Export<
typename CrsMatrixType::local_ordinal_type,
258 typename CrsMatrixType::global_ordinal_type,
259 typename CrsMatrixType::node_type>& rowExporter,
260 const Export<
typename CrsMatrixType::local_ordinal_type,
261 typename CrsMatrixType::global_ordinal_type,
262 typename CrsMatrixType::node_type>& domainExporter,
263 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
264 typename CrsMatrixType::global_ordinal_type,
265 typename CrsMatrixType::node_type> >& domainMap,
266 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
267 typename CrsMatrixType::global_ordinal_type,
268 typename CrsMatrixType::node_type> >& rangeMap,
269 const Teuchos::RCP<Teuchos::ParameterList>& params);
274 template<
class SC,
class LO,
class GO,
class NO>
275 void residual(
const Operator<SC,LO,GO,NO> & A,
276 const MultiVector<SC,LO,GO,NO> & X,
277 const MultiVector<SC,LO,GO,NO> & B,
278 MultiVector<SC,LO,GO,NO> & R);
394 template <
class Scalar,
399 public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
400 public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
461 using mag_type =
typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
477 typename local_graph_device_type::size_type>;
478 using local_matrix_host_type =
479 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;
487 using local_inds_device_view_type =
488 typename row_matrix_type::local_inds_device_view_type;
489 using local_inds_host_view_type =
490 typename row_matrix_type::local_inds_host_view_type;
491 using nonconst_local_inds_host_view_type =
492 typename row_matrix_type::nonconst_local_inds_host_view_type;
494 using global_inds_device_view_type =
495 typename row_matrix_type::global_inds_device_view_type;
496 using global_inds_host_view_type =
497 typename row_matrix_type::global_inds_host_view_type;
498 using nonconst_global_inds_host_view_type =
499 typename row_matrix_type::nonconst_global_inds_host_view_type;
501 using values_device_view_type =
502 typename row_matrix_type::values_device_view_type;
503 using values_host_view_type =
504 typename row_matrix_type::values_host_view_type;
505 using nonconst_values_host_view_type =
506 typename row_matrix_type::nonconst_values_host_view_type;
514 GlobalOrdinal, Node>&) =
default;
518 GlobalOrdinal, Node>&&) =
default;
523 GlobalOrdinal, Node>&) =
default;
528 GlobalOrdinal, Node>&&) =
default;
543 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
544 const size_t maxNumEntriesPerRow,
545 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
559 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
560 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
561 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
582 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
583 const Teuchos::RCP<const map_type>& colMap,
584 const size_t maxNumEntPerRow,
585 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
605 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
606 const Teuchos::RCP<const map_type>& colMap,
607 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
608 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
639 const Teuchos::RCP<const crs_graph_type>& graph,
640 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
666 explicit CrsMatrix (
const Teuchos::RCP<const crs_graph_type>& graph,
667 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
697 explicit CrsMatrix (
const Teuchos::RCP<const crs_graph_type>& graph,
698 const typename local_matrix_device_type::values_type& values,
699 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
727 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
728 const Teuchos::RCP<const map_type>& colMap,
729 const typename local_graph_device_type::row_map_type& rowPointers,
730 const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
731 const typename local_matrix_device_type::values_type& values,
732 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
760 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
761 const Teuchos::RCP<const map_type>& colMap,
762 const Teuchos::ArrayRCP<size_t>& rowPointers,
763 const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
764 const Teuchos::ArrayRCP<Scalar>& values,
765 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
788 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
789 const Teuchos::RCP<const map_type>& colMap,
791 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
824 const Teuchos::RCP<const map_type>& rowMap,
825 const Teuchos::RCP<const map_type>& colMap,
826 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
827 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
828 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
835 const Teuchos::RCP<const map_type>& rowMap,
836 const Teuchos::RCP<const map_type>& colMap,
837 const Teuchos::RCP<const map_type>& domainMap,
838 const Teuchos::RCP<const map_type>& rangeMap,
839 const Teuchos::RCP<const import_type>& importer,
840 const Teuchos::RCP<const export_type>& exporter,
841 const Teuchos::RCP<Teuchos::ParameterList>& params =
848 const Teuchos::DataAccess copyOrView);
862 template <
class S2,
class LO2,
class GO2,
class N2>
866 template <
class S2,
class LO2,
class GO2,
class N2>
873 template <
class MatrixArray,
class MultiVectorArray>
875 const typename std::remove_pointer<typename MultiVectorArray::value_type>::type & X,
877 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
878 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
879 Teuchos::RCP<Teuchos::ParameterList> params);
953 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
954 const Teuchos::ArrayView<const Scalar>& vals);
972 const LocalOrdinal numEnt,
974 const GlobalOrdinal inds[]);
1020 const Teuchos::ArrayView<const LocalOrdinal> &cols,
1021 const Teuchos::ArrayView<const Scalar> &vals,
1045 const LocalOrdinal numEnt,
1046 const Scalar vals[],
1047 const LocalOrdinal cols[],
1061 virtual LocalOrdinal
1065 const GlobalOrdinal inds[],
1067 const LocalOrdinal numElts);
1109 const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1110 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1116 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1117 const Teuchos::ArrayView<const Scalar>& vals);
1135 const LocalOrdinal numEnt,
1136 const Scalar vals[],
1137 const GlobalOrdinal cols[]);
1150 virtual LocalOrdinal
1154 const LocalOrdinal inds[],
1156 const LocalOrdinal numElts);
1197 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1198 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1205 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1206 const Teuchos::ArrayView<const Scalar>& vals);
1227 const LocalOrdinal numEnt,
1228 const Scalar inputVals[],
1229 const LocalOrdinal inputCols[]);
1236 static const bool useAtomicUpdatesByDefault =
1237 #ifdef KOKKOS_ENABLE_SERIAL
1238 ! std::is_same<execution_space, Kokkos::Serial>::value;
1241 #endif // KOKKOS_ENABLE_SERIAL
1267 virtual LocalOrdinal
1271 const GlobalOrdinal inds[],
1273 const LocalOrdinal numElts,
1274 const bool atomic = useAtomicUpdatesByDefault);
1315 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1316 const Teuchos::ArrayView<const Scalar>& vals,
1317 const bool atomic = useAtomicUpdatesByDefault);
1343 const LocalOrdinal numEnt,
1344 const Scalar vals[],
1345 const GlobalOrdinal cols[],
1346 const bool atomic = useAtomicUpdatesByDefault);
1361 virtual LocalOrdinal
1365 const LocalOrdinal inds[],
1367 const LocalOrdinal numElts,
1368 const bool atomic = useAtomicUpdatesByDefault);
1410 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1411 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1412 const bool atomic = useAtomicUpdatesByDefault);
1445 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1446 const Teuchos::ArrayView<const Scalar>& vals,
1447 const bool atomic = useAtomicUpdatesByDefault);
1472 const LocalOrdinal numEnt,
1473 const Scalar vals[],
1474 const LocalOrdinal cols[],
1475 const bool atomic = useAtomicUpdatesByDefault);
1512 const LocalOrdinal inds[],
1514 const LocalOrdinal numElts,
1516 const bool atomic = useAtomicUpdatesByDefault);
1552 const GlobalOrdinal inds[],
1554 const LocalOrdinal numElts,
1556 const bool atomic = useAtomicUpdatesByDefault);
1585 transformLocalValues (
const LocalOrdinal lclRow,
1586 const LocalOrdinal numInputEnt,
1588 const LocalOrdinal inputCols[],
1590 const bool atomic = useAtomicUpdatesByDefault);
1619 transformGlobalValues (
const GlobalOrdinal gblRow,
1620 const LocalOrdinal numInputEnt,
1622 const GlobalOrdinal inputCols[],
1624 const bool atomic = useAtomicUpdatesByDefault);
1670 template<
class LocalIndicesViewType,
1671 class ImplScalarViewType,
1672 class BinaryFunction>
1675 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1676 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1678 const bool atomic = useAtomicUpdatesByDefault)
1686 static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1687 "First template parameter LocalIndicesViewType must be "
1689 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1690 "Second template parameter ImplScalarViewType must be a "
1692 static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1693 "First template parameter LocalIndicesViewType must "
1695 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1696 "Second template parameter ImplScalarViewType must have "
1698 static_assert (std::is_same<
1699 typename LocalIndicesViewType::non_const_value_type,
1701 "First template parameter LocalIndicesViewType must "
1702 "contain values of type local_ordinal_type.");
1703 static_assert (std::is_same<
1704 typename ImplScalarViewType::non_const_value_type,
1706 "Second template parameter ImplScalarViewType must "
1707 "contain values of type impl_scalar_type.");
1708 typedef LocalOrdinal LO;
1709 const LO numInputEnt = inputInds.extent (0);
1710 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1711 return Teuchos::OrdinalTraits<LO>::invalid ();
1713 return this->transformLocalValues (lclRow,
1762 template<
class BinaryFunction,
class InputMemorySpace>
1765 const Kokkos::View<
const GlobalOrdinal*,
1767 Kokkos::MemoryUnmanaged>& inputInds,
1770 Kokkos::MemoryUnmanaged>& inputVals,
1772 const bool atomic = useAtomicUpdatesByDefault)
1774 typedef LocalOrdinal LO;
1775 const LO numInputEnt = inputInds.extent (0);
1776 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1777 return Teuchos::OrdinalTraits<LO>::invalid ();
1779 return this->transformGlobalValues (gblRow,
1791 void scale (
const Scalar& alpha);
1818 setAllValues (
const typename local_graph_device_type::row_map_type& ptr,
1819 const typename local_graph_device_type::entries_type::non_const_type& ind,
1820 const typename local_matrix_device_type::values_type& val);
1871 const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1872 const Teuchos::ArrayRCP<Scalar>& val);
1880 {
return getCrsGraph()->getLocalRowPtrsDevice(); }
1888 {
return getCrsGraph()->getLocalIndicesDevice(); }
1937 void resumeFill (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1997 fillComplete (
const Teuchos::RCP<const map_type>& domainMap,
1998 const Teuchos::RCP<const map_type>& rangeMap,
1999 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2028 fillComplete (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2058 const Teuchos::RCP<const map_type>& rangeMap,
2059 const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2060 const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2061 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2081 replaceColMap (
const Teuchos::RCP<const map_type>& newColMap);
2166 const Teuchos::RCP<const map_type>& newColMap,
2167 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2168 const bool sortEachRow =
true);
2197 Teuchos::RCP<const import_type>& newImporter);
2226 Teuchos::RCP<const export_type>& newExporter);
2249 Teuchos::RCP<const Teuchos::Comm<int> >
getComm()
const override;
2253 Teuchos::RCP<const map_type>
getRowMap ()
const override;
2256 Teuchos::RCP<const map_type>
getColMap ()
const override;
2259 Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2263 Teuchos::RCP<const crs_graph_type>
getCrsGraph ()
const;
2279 #if __armclang_major__ == 22 && __armclang_minor__ == 1
2284 #define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2286 #define TPETRA_DETAILS_ALWAYS_INLINE
2302 local_matrix_host_type getLocalMatrixHost ()
const;
2303 #undef TPETRA_DETAILS_ALWAYS_INLINE
2534 using values_dualv_type =
2535 Kokkos::DualView<impl_scalar_type*, device_type>;
2536 using values_wdv_type =
2538 values_wdv_type valuesUnpacked_wdv;
2539 mutable values_wdv_type valuesPacked_wdv;
2593 nonconst_global_inds_host_view_type &Indices,
2594 nonconst_values_host_view_type &Values,
2595 size_t& NumEntries)
const override;
2613 nonconst_local_inds_host_view_type &Indices,
2614 nonconst_values_host_view_type &Values,
2615 size_t& NumEntries)
const override;
2632 global_inds_host_view_type &indices,
2633 values_host_view_type &values)
const override;
2649 local_inds_host_view_type &indices,
2650 values_host_view_type &values)
const override;
2738 Kokkos::MemoryUnmanaged>& offsets)
const;
2764 const Teuchos::ArrayView<const size_t>& offsets)
const;
2848 const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2849 const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one (),
2850 const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero ())
const;
2855 Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2875 Teuchos::ETransp mode = Teuchos::NO_TRANS,
2876 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2877 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const override;
2889 Teuchos::RCP<const map_type>
getDomainMap ()
const override;
2897 Teuchos::RCP<const map_type>
getRangeMap ()
const override;
2913 virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2914 add (
const Scalar& alpha,
2919 const Teuchos::RCP<Teuchos::ParameterList>& params)
const override;
2931 describe (Teuchos::FancyOStream& out,
2932 const Teuchos::EVerbosityLevel verbLevel =
2933 Teuchos::Describable::verbLevel_default)
const override;
2943 typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2952 const bool verbose);
2956 copyAndPermuteStaticGraph(
2958 const size_t numSameIDs,
2959 const LocalOrdinal permuteToLIDs[],
2960 const LocalOrdinal permuteFromLIDs[],
2961 const size_t numPermutes);
2964 copyAndPermuteNonStaticGraph(
2966 const size_t numSameIDs,
2967 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2968 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2969 const size_t numPermutes);
2982 const size_t numSameIDs,
2983 const Kokkos::DualView<
2986 const Kokkos::DualView<
2994 const Kokkos::DualView<
2997 Kokkos::DualView<char*, buffer_device_type>& exports,
2998 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2999 size_t& constantNumPackets)
override;
3012 unpackAndCombineImpl(
3015 Kokkos::DualView<char*, buffer_device_type> imports,
3016 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3017 const size_t constantNumPackets,
3019 const bool verbose);
3024 unpackAndCombineImplNonStatic(
3027 Kokkos::DualView<char*, buffer_device_type> imports,
3028 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3029 const size_t constantNumPackets,
3044 (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3045 Kokkos::DualView<char*, buffer_device_type> imports,
3046 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3047 const size_t constantNumPackets,
3163 packNew (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3164 Kokkos::DualView<char*, buffer_device_type>& exports,
3165 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3166 size_t& constantNumPackets)
const;
3176 packNonStaticNew (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3177 Kokkos::DualView<char*, buffer_device_type>& exports,
3178 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3179 size_t& constantNumPackets)
const;
3211 packRow (
char exports[],
3212 const size_t offset,
3213 const size_t numEnt,
3214 const GlobalOrdinal gidsIn[],
3216 const size_t numBytesPerValue)
const;
3242 packRowStatic (
char*
const numEntOut,
3245 const size_t numEnt,
3246 const LocalOrdinal lclRow)
const;
3274 unpackRow (GlobalOrdinal gidsOut[],
3276 const char imports[],
3277 const size_t offset,
3278 const size_t numBytes,
3279 const size_t numEnt,
3280 const size_t numBytesPerValue);
3291 allocatePackSpaceNew (Kokkos::DualView<char*, buffer_device_type>& exports,
3292 size_t& totalNumEntries,
3299 typename local_matrix_host_type::values_type::const_type
3302 return valuesPacked_wdv.getHostView(s);
3306 typename local_matrix_host_type::values_type
3309 return valuesPacked_wdv.getHostView(s);
3313 typename local_matrix_host_type::values_type
3316 return valuesPacked_wdv.getHostView(s);
3320 typename local_matrix_device_type::values_type::const_type
3323 return valuesPacked_wdv.getDeviceView(s);
3327 typename local_matrix_device_type::values_type
3330 return valuesPacked_wdv.getDeviceView(s);
3334 typename local_matrix_device_type::values_type
3337 return valuesPacked_wdv.getDeviceView(s);
3342 template<
class CrsMatrixType>
3343 friend Teuchos::RCP<CrsMatrixType>
3345 const Import<
typename CrsMatrixType::local_ordinal_type,
3346 typename CrsMatrixType::global_ordinal_type,
3347 typename CrsMatrixType::node_type>& importer,
3348 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3349 typename CrsMatrixType::global_ordinal_type,
3350 typename CrsMatrixType::node_type> >& domainMap,
3351 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3352 typename CrsMatrixType::global_ordinal_type,
3353 typename CrsMatrixType::node_type> >& rangeMap,
3354 const Teuchos::RCP<Teuchos::ParameterList>& params);
3357 template<
class CrsMatrixType>
3358 friend Teuchos::RCP<CrsMatrixType>
3360 const Import<
typename CrsMatrixType::local_ordinal_type,
3361 typename CrsMatrixType::global_ordinal_type,
3362 typename CrsMatrixType::node_type>& rowImporter,
3363 const Import<
typename CrsMatrixType::local_ordinal_type,
3364 typename CrsMatrixType::global_ordinal_type,
3365 typename CrsMatrixType::node_type>& domainImporter,
3366 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3367 typename CrsMatrixType::global_ordinal_type,
3368 typename CrsMatrixType::node_type> >& domainMap,
3369 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3370 typename CrsMatrixType::global_ordinal_type,
3371 typename CrsMatrixType::node_type> >& rangeMap,
3372 const Teuchos::RCP<Teuchos::ParameterList>& params);
3376 template<
class CrsMatrixType>
3377 friend Teuchos::RCP<CrsMatrixType>
3379 const Export<
typename CrsMatrixType::local_ordinal_type,
3380 typename CrsMatrixType::global_ordinal_type,
3381 typename CrsMatrixType::node_type>& exporter,
3382 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3383 typename CrsMatrixType::global_ordinal_type,
3384 typename CrsMatrixType::node_type> >& domainMap,
3385 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3386 typename CrsMatrixType::global_ordinal_type,
3387 typename CrsMatrixType::node_type> >& rangeMap,
3388 const Teuchos::RCP<Teuchos::ParameterList>& params);
3391 template<
class CrsMatrixType>
3392 friend Teuchos::RCP<CrsMatrixType>
3394 const Export<
typename CrsMatrixType::local_ordinal_type,
3395 typename CrsMatrixType::global_ordinal_type,
3396 typename CrsMatrixType::node_type>& rowExporter,
3397 const Export<
typename CrsMatrixType::local_ordinal_type,
3398 typename CrsMatrixType::global_ordinal_type,
3399 typename CrsMatrixType::node_type>& domainExporter,
3400 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3401 typename CrsMatrixType::global_ordinal_type,
3402 typename CrsMatrixType::node_type> >& domainMap,
3403 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3404 typename CrsMatrixType::global_ordinal_type,
3405 typename CrsMatrixType::node_type> >& rangeMap,
3406 const Teuchos::RCP<Teuchos::ParameterList>& params);
3427 const Teuchos::RCP<const map_type>& domainMap,
3428 const Teuchos::RCP<const map_type>& rangeMap,
3429 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3450 const Teuchos::RCP<const map_type>& domainMap,
3451 const Teuchos::RCP<const map_type>& rangeMap,
3452 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3473 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3474 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3475 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3496 const Teuchos::RCP<const map_type>& domainMap,
3497 const Teuchos::RCP<const map_type>& rangeMap,
3498 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3524 const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3525 const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> > & domainTransfer,
3526 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3527 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3528 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3545 const GlobalOrdinal gblColInds[],
3547 const size_t numInputEnt);
3560 insertGlobalValuesFiltered(
3561 const GlobalOrdinal globalRow,
3562 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3563 const Teuchos::ArrayView<const Scalar>& values,
3569 insertGlobalValuesFilteredChecked(
3570 const GlobalOrdinal globalRow,
3571 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3572 const Teuchos::ArrayView<const Scalar>& values,
3573 const char*
const prefix,
3575 const bool verbose);
3589 combineGlobalValues(
3590 const GlobalOrdinal globalRowIndex,
3591 const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3592 const Teuchos::ArrayView<const Scalar>& values,
3594 const char*
const prefix,
3596 const bool verbose);
3620 combineGlobalValuesRaw(
const LocalOrdinal lclRow,
3621 const LocalOrdinal numEnt,
3623 const GlobalOrdinal cols[],
3625 const char*
const prefix,
3627 const bool verbose);
3640 template<
class BinaryFunction>
3642 transformGlobalValues (
const GlobalOrdinal globalRow,
3643 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3644 const Teuchos::ArrayView<const Scalar>& values,
3646 const bool atomic = useAtomicUpdatesByDefault)
3649 typedef LocalOrdinal LO;
3650 typedef GlobalOrdinal GO;
3652 const LO numInputEnt =
static_cast<LO
> (indices.size ());
3653 if (static_cast<LO> (values.size ()) != numInputEnt) {
3654 return Teuchos::OrdinalTraits<LO>::invalid ();
3657 const GO*
const inputCols = indices.getRawPtr ();
3658 const IST*
const inputVals =
3659 reinterpret_cast<const IST*
> (values.getRawPtr ());
3660 return this->transformGlobalValues (globalRow, numInputEnt, inputVals,
3661 inputCols, f, atomic);
3671 insertNonownedGlobalValues (
const GlobalOrdinal globalRow,
3672 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3673 const Teuchos::ArrayView<const Scalar>& values);
3720 const typename crs_graph_type::SLocalGlobalViews& newInds,
3721 const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3722 const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3723 const ELocalGlobal lg,
3724 const ELocalGlobal I);
3728 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3729 typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3730 typedef Kokkos::ArithTraits<mag_type> STM;
3731 typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3732 typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3736 enum GraphAllocationStatus {
3737 GraphAlreadyAllocated,
3738 GraphNotYetAllocated
3761 const bool verbose);
3849 const bool force =
false)
const;
3874 const bool force =
false)
const;
3887 const Teuchos::ETransp mode,
3895 typename values_dualv_type::t_host::const_type
3900 typename values_dualv_type::t_dev::const_type
3905 typename values_dualv_type::t_host
3910 typename values_dualv_type::t_dev
3918 using local_matrix_int_rowptrs_device_type =
3928 local_matrix_int_rowptrs_device_type,
3932 std::shared_ptr<ApplyHelper> getApplyHelper()
const {
3935 applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3943 friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3947 template<
typename S,
typename LO,
typename GO,
typename NODE,
typename LOV>
friend struct Tpetra::MMdetails::KernelWrappers;
3948 template<
typename S,
typename LO,
typename GO,
typename NODE,
typename LOV>
friend struct Tpetra::MMdetails::KernelWrappers2;
3953 void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3954 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3955 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3956 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3957 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3958 bool userAssertsThereAreNoRemotes,
3959 const std::string& label,
3960 const Teuchos::RCP<Teuchos::ParameterList>& params);
3965 void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> & matrix);
3975 void fillLocalMatrix (
const Teuchos::RCP<Teuchos::ParameterList>& params);
3999 Teuchos::RCP<const Graph> staticGraph_;
4000 Teuchos::RCP< Graph> myGraph_;
4014 Details::STORAGE_1D_UNPACKED;
4046 std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4055 mutable std::shared_ptr<ApplyHelper> applyHelper;
4062 template<
class DestViewType,
class SrcViewType,
4063 class DestOffsetViewType,
class SrcOffsetViewType>
4064 struct pack_functor {
4068 SrcOffsetViewType src_offset_;
4069 DestOffsetViewType dst_offset_;
4070 typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4072 pack_functor (DestViewType dst,
4073 const SrcViewType src,
4074 DestOffsetViewType dst_offset,
4075 const SrcOffsetViewType src_offset) :
4078 src_offset_ (src_offset),
4079 dst_offset_ (dst_offset)
4082 KOKKOS_INLINE_FUNCTION
4083 void operator () (
const LocalOrdinal row)
const {
4084 scalar_index_type srcPos = src_offset_(row);
4085 const scalar_index_type dstEnd = dst_offset_(row+1);
4086 scalar_index_type dstPos = dst_offset_(row);
4087 for ( ; dstPos < dstEnd; ++dstPos, ++srcPos) {
4088 dst_(dstPos) = src_(srcPos);
4098 template<
class Scalar,
4100 class GlobalOrdinal,
4102 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4105 const size_t maxNumEntriesPerRow = 0,
4106 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
4110 return Teuchos::rcp(
new matrix_type(map, maxNumEntriesPerRow,
4114 template<
class CrsMatrixType>
4115 Teuchos::RCP<CrsMatrixType>
4117 const Import<
typename CrsMatrixType::local_ordinal_type,
4118 typename CrsMatrixType::global_ordinal_type,
4119 typename CrsMatrixType::node_type>& importer,
4120 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4121 typename CrsMatrixType::global_ordinal_type,
4122 typename CrsMatrixType::node_type> >& domainMap,
4123 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4124 typename CrsMatrixType::global_ordinal_type,
4125 typename CrsMatrixType::node_type> >& rangeMap,
4126 const Teuchos::RCP<Teuchos::ParameterList>& params)
4128 Teuchos::RCP<CrsMatrixType> destMatrix;
4129 sourceMatrix->importAndFillComplete (destMatrix, importer, domainMap, rangeMap, params);
4133 template<
class CrsMatrixType>
4134 Teuchos::RCP<CrsMatrixType>
4136 const Import<
typename CrsMatrixType::local_ordinal_type,
4137 typename CrsMatrixType::global_ordinal_type,
4138 typename CrsMatrixType::node_type>& rowImporter,
4139 const Import<
typename CrsMatrixType::local_ordinal_type,
4140 typename CrsMatrixType::global_ordinal_type,
4141 typename CrsMatrixType::node_type>& domainImporter,
4142 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4143 typename CrsMatrixType::global_ordinal_type,
4144 typename CrsMatrixType::node_type> >& domainMap,
4145 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4146 typename CrsMatrixType::global_ordinal_type,
4147 typename CrsMatrixType::node_type> >& rangeMap,
4148 const Teuchos::RCP<Teuchos::ParameterList>& params)
4150 Teuchos::RCP<CrsMatrixType> destMatrix;
4151 sourceMatrix->importAndFillComplete (destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4155 template<
class CrsMatrixType>
4156 Teuchos::RCP<CrsMatrixType>
4158 const Export<
typename CrsMatrixType::local_ordinal_type,
4159 typename CrsMatrixType::global_ordinal_type,
4160 typename CrsMatrixType::node_type>& exporter,
4161 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4162 typename CrsMatrixType::global_ordinal_type,
4163 typename CrsMatrixType::node_type> >& domainMap,
4164 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4165 typename CrsMatrixType::global_ordinal_type,
4166 typename CrsMatrixType::node_type> >& rangeMap,
4167 const Teuchos::RCP<Teuchos::ParameterList>& params)
4169 Teuchos::RCP<CrsMatrixType> destMatrix;
4170 sourceMatrix->exportAndFillComplete (destMatrix, exporter, domainMap, rangeMap, params);
4174 template<
class CrsMatrixType>
4175 Teuchos::RCP<CrsMatrixType>
4177 const Export<
typename CrsMatrixType::local_ordinal_type,
4178 typename CrsMatrixType::global_ordinal_type,
4179 typename CrsMatrixType::node_type>& rowExporter,
4180 const Export<
typename CrsMatrixType::local_ordinal_type,
4181 typename CrsMatrixType::global_ordinal_type,
4182 typename CrsMatrixType::node_type>& domainExporter,
4183 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4184 typename CrsMatrixType::global_ordinal_type,
4185 typename CrsMatrixType::node_type> >& domainMap,
4186 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4187 typename CrsMatrixType::global_ordinal_type,
4188 typename CrsMatrixType::node_type> >& rangeMap,
4189 const Teuchos::RCP<Teuchos::ParameterList>& params)
4191 Teuchos::RCP<CrsMatrixType> destMatrix;
4192 sourceMatrix->exportAndFillComplete (destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4202 template<
class CrsMatrixType>
4205 typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType
const & threshold =
4206 Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude( Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero() ))
4208 auto localMatrix = matrix.getLocalMatrixDevice();
4209 size_t nnzBefore = localMatrix.nnz();
4211 size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4214 size_t globalNNZRemoved = 0;
4215 Teuchos::reduceAll<int, size_t> (*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4216 if(globalNNZRemoved !=
size_t(0)) {
4217 matrix.resumeFill();
4218 matrix.setAllValues(localMatrix);
4219 matrix.expertStaticFillComplete(matrix.getDomainMap(),matrix.getRangeMap());
4232 #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.