41 #ifndef TPETRA_CRSMATRIX_DECL_HPP
42 #define TPETRA_CRSMATRIX_DECL_HPP
48 #include "KokkosSparse_Utils.hpp"
49 #include "KokkosSparse_CrsMatrix.hpp"
50 #if KOKKOSKERNELS_VERSION >= 40299
51 #include "Tpetra_Details_MatrixApplyHelper.hpp"
53 #include "Tpetra_LocalCrsMatrixOperator.hpp"
55 #include "Tpetra_RowMatrix_decl.hpp"
56 #include "Tpetra_Exceptions.hpp"
57 #include "Tpetra_DistObject.hpp"
58 #include "Tpetra_CrsGraph.hpp"
59 #include "Tpetra_Vector.hpp"
61 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
62 #include "Teuchos_DataAccess.hpp"
69 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
class crsMatrix_Swap_Tester;
122 template<
class CrsMatrixType>
123 Teuchos::RCP<CrsMatrixType>
125 const Import<
typename CrsMatrixType::local_ordinal_type,
126 typename CrsMatrixType::global_ordinal_type,
127 typename CrsMatrixType::node_type>& importer,
128 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
129 typename CrsMatrixType::global_ordinal_type,
130 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
131 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
132 typename CrsMatrixType::global_ordinal_type,
133 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
134 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
189 template<
class CrsMatrixType>
190 Teuchos::RCP<CrsMatrixType>
192 const Import<
typename CrsMatrixType::local_ordinal_type,
193 typename CrsMatrixType::global_ordinal_type,
194 typename CrsMatrixType::node_type>& rowImporter,
195 const Import<
typename CrsMatrixType::local_ordinal_type,
196 typename CrsMatrixType::global_ordinal_type,
197 typename CrsMatrixType::node_type>& domainImporter,
198 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
199 typename CrsMatrixType::global_ordinal_type,
200 typename CrsMatrixType::node_type> >& domainMap,
201 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
202 typename CrsMatrixType::global_ordinal_type,
203 typename CrsMatrixType::node_type> >& rangeMap,
204 const Teuchos::RCP<Teuchos::ParameterList>& params);
239 template<
class CrsMatrixType>
240 Teuchos::RCP<CrsMatrixType>
242 const Export<
typename CrsMatrixType::local_ordinal_type,
243 typename CrsMatrixType::global_ordinal_type,
244 typename CrsMatrixType::node_type>& exporter,
245 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
246 typename CrsMatrixType::global_ordinal_type,
247 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
248 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
249 typename CrsMatrixType::global_ordinal_type,
250 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
251 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
286 template<
class CrsMatrixType>
287 Teuchos::RCP<CrsMatrixType>
289 const Export<
typename CrsMatrixType::local_ordinal_type,
290 typename CrsMatrixType::global_ordinal_type,
291 typename CrsMatrixType::node_type>& rowExporter,
292 const Export<
typename CrsMatrixType::local_ordinal_type,
293 typename CrsMatrixType::global_ordinal_type,
294 typename CrsMatrixType::node_type>& domainExporter,
295 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
296 typename CrsMatrixType::global_ordinal_type,
297 typename CrsMatrixType::node_type> >& domainMap,
298 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
299 typename CrsMatrixType::global_ordinal_type,
300 typename CrsMatrixType::node_type> >& rangeMap,
301 const Teuchos::RCP<Teuchos::ParameterList>& params);
306 template<
class SC,
class LO,
class GO,
class NO>
307 void residual(
const Operator<SC,LO,GO,NO> & A,
308 const MultiVector<SC,LO,GO,NO> & X,
309 const MultiVector<SC,LO,GO,NO> & B,
310 MultiVector<SC,LO,GO,NO> & R);
426 template <
class Scalar,
431 public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
432 public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
493 using mag_type =
typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
509 typename local_graph_device_type::size_type>;
510 using local_matrix_host_type =
511 typename local_matrix_device_type::HostMirror;
513 #if KOKKOSKERNELS_VERSION < 40299
521 using row_ptrs_device_view_type =
522 typename row_matrix_type::row_ptrs_device_view_type;
523 using row_ptrs_host_view_type =
524 typename row_matrix_type::row_ptrs_host_view_type;
527 using local_inds_device_view_type =
528 typename row_matrix_type::local_inds_device_view_type;
529 using local_inds_host_view_type =
530 typename row_matrix_type::local_inds_host_view_type;
531 using nonconst_local_inds_host_view_type =
532 typename row_matrix_type::nonconst_local_inds_host_view_type;
534 using global_inds_device_view_type =
535 typename row_matrix_type::global_inds_device_view_type;
536 using global_inds_host_view_type =
537 typename row_matrix_type::global_inds_host_view_type;
538 using nonconst_global_inds_host_view_type =
539 typename row_matrix_type::nonconst_global_inds_host_view_type;
541 using values_device_view_type =
542 typename row_matrix_type::values_device_view_type;
543 using values_host_view_type =
544 typename row_matrix_type::values_host_view_type;
545 using nonconst_values_host_view_type =
546 typename row_matrix_type::nonconst_values_host_view_type;
554 GlobalOrdinal, Node>&) =
default;
558 GlobalOrdinal, Node>&&) =
default;
563 GlobalOrdinal, Node>&) =
default;
568 GlobalOrdinal, Node>&&) =
default;
583 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
584 const size_t maxNumEntriesPerRow,
585 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
599 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
600 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
601 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
622 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
623 const Teuchos::RCP<const map_type>& colMap,
624 const size_t maxNumEntPerRow,
625 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
645 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
646 const Teuchos::RCP<const map_type>& colMap,
647 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
648 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
679 const Teuchos::RCP<const crs_graph_type>& graph,
680 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
706 explicit CrsMatrix (
const Teuchos::RCP<const crs_graph_type>& graph,
707 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
737 explicit CrsMatrix (
const Teuchos::RCP<const crs_graph_type>& graph,
738 const typename local_matrix_device_type::values_type& values,
739 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
767 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
768 const Teuchos::RCP<const map_type>& colMap,
769 const typename local_graph_device_type::row_map_type& rowPointers,
770 const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
771 const typename local_matrix_device_type::values_type& values,
772 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
800 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
801 const Teuchos::RCP<const map_type>& colMap,
802 const Teuchos::ArrayRCP<size_t>& rowPointers,
803 const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
804 const Teuchos::ArrayRCP<Scalar>& values,
805 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
828 CrsMatrix (
const Teuchos::RCP<const map_type>& rowMap,
829 const Teuchos::RCP<const map_type>& colMap,
831 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
864 const Teuchos::RCP<const map_type>& rowMap,
865 const Teuchos::RCP<const map_type>& colMap,
866 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
867 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
868 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
875 const Teuchos::RCP<const map_type>& rowMap,
876 const Teuchos::RCP<const map_type>& colMap,
877 const Teuchos::RCP<const map_type>& domainMap,
878 const Teuchos::RCP<const map_type>& rangeMap,
879 const Teuchos::RCP<const import_type>& importer,
880 const Teuchos::RCP<const export_type>& exporter,
881 const Teuchos::RCP<Teuchos::ParameterList>& params =
888 const Teuchos::DataAccess copyOrView);
902 template <
class S2,
class LO2,
class GO2,
class N2>
906 template <
class S2,
class LO2,
class GO2,
class N2>
913 template <
class MatrixArray,
class MultiVectorArray>
915 const typename std::remove_pointer<typename MultiVectorArray::value_type>::type & X,
917 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
918 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
919 Teuchos::RCP<Teuchos::ParameterList> params);
993 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
994 const Teuchos::ArrayView<const Scalar>& vals);
1012 const LocalOrdinal numEnt,
1013 const Scalar vals[],
1014 const GlobalOrdinal inds[]);
1060 const Teuchos::ArrayView<const LocalOrdinal> &cols,
1061 const Teuchos::ArrayView<const Scalar> &vals,
1085 const LocalOrdinal numEnt,
1086 const Scalar vals[],
1087 const LocalOrdinal cols[],
1101 virtual LocalOrdinal
1105 const GlobalOrdinal inds[],
1107 const LocalOrdinal numElts);
1149 const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1150 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1156 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1157 const Teuchos::ArrayView<const Scalar>& vals);
1175 const LocalOrdinal numEnt,
1176 const Scalar vals[],
1177 const GlobalOrdinal cols[]);
1190 virtual LocalOrdinal
1194 const LocalOrdinal inds[],
1196 const LocalOrdinal numElts);
1237 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1238 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1245 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1246 const Teuchos::ArrayView<const Scalar>& vals);
1267 const LocalOrdinal numEnt,
1268 const Scalar inputVals[],
1269 const LocalOrdinal inputCols[]);
1276 static const bool useAtomicUpdatesByDefault =
1277 #ifdef KOKKOS_ENABLE_SERIAL
1278 ! std::is_same<execution_space, Kokkos::Serial>::value;
1281 #endif // KOKKOS_ENABLE_SERIAL
1307 virtual LocalOrdinal
1311 const GlobalOrdinal inds[],
1313 const LocalOrdinal numElts,
1314 const bool atomic = useAtomicUpdatesByDefault);
1355 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1356 const Teuchos::ArrayView<const Scalar>& vals,
1357 const bool atomic = useAtomicUpdatesByDefault);
1383 const LocalOrdinal numEnt,
1384 const Scalar vals[],
1385 const GlobalOrdinal cols[],
1386 const bool atomic = useAtomicUpdatesByDefault);
1401 virtual LocalOrdinal
1405 const LocalOrdinal inds[],
1407 const LocalOrdinal numElts,
1408 const bool atomic = useAtomicUpdatesByDefault);
1450 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1451 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1452 const bool atomic = useAtomicUpdatesByDefault);
1485 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1486 const Teuchos::ArrayView<const Scalar>& vals,
1487 const bool atomic = useAtomicUpdatesByDefault);
1512 const LocalOrdinal numEnt,
1513 const Scalar vals[],
1514 const LocalOrdinal cols[],
1515 const bool atomic = useAtomicUpdatesByDefault);
1552 const LocalOrdinal inds[],
1554 const LocalOrdinal numElts,
1556 const bool atomic = useAtomicUpdatesByDefault);
1592 const GlobalOrdinal inds[],
1594 const LocalOrdinal numElts,
1596 const bool atomic = useAtomicUpdatesByDefault);
1625 transformLocalValues (
const LocalOrdinal lclRow,
1626 const LocalOrdinal numInputEnt,
1628 const LocalOrdinal inputCols[],
1630 const bool atomic = useAtomicUpdatesByDefault);
1659 transformGlobalValues (
const GlobalOrdinal gblRow,
1660 const LocalOrdinal numInputEnt,
1662 const GlobalOrdinal inputCols[],
1664 const bool atomic = useAtomicUpdatesByDefault);
1710 template<
class LocalIndicesViewType,
1711 class ImplScalarViewType,
1712 class BinaryFunction>
1715 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1716 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1718 const bool atomic = useAtomicUpdatesByDefault)
1726 static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1727 "First template parameter LocalIndicesViewType must be "
1729 static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1730 "Second template parameter ImplScalarViewType must be a "
1732 static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1733 "First template parameter LocalIndicesViewType must "
1735 static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1736 "Second template parameter ImplScalarViewType must have "
1738 static_assert (std::is_same<
1739 typename LocalIndicesViewType::non_const_value_type,
1741 "First template parameter LocalIndicesViewType must "
1742 "contain values of type local_ordinal_type.");
1743 static_assert (std::is_same<
1744 typename ImplScalarViewType::non_const_value_type,
1746 "Second template parameter ImplScalarViewType must "
1747 "contain values of type impl_scalar_type.");
1748 typedef LocalOrdinal LO;
1749 const LO numInputEnt = inputInds.extent (0);
1750 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1751 return Teuchos::OrdinalTraits<LO>::invalid ();
1753 return this->transformLocalValues (lclRow,
1802 template<
class BinaryFunction,
class InputMemorySpace>
1805 const Kokkos::View<
const GlobalOrdinal*,
1807 Kokkos::MemoryUnmanaged>& inputInds,
1810 Kokkos::MemoryUnmanaged>& inputVals,
1812 const bool atomic = useAtomicUpdatesByDefault)
1814 typedef LocalOrdinal LO;
1815 const LO numInputEnt = inputInds.extent (0);
1816 if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1817 return Teuchos::OrdinalTraits<LO>::invalid ();
1819 return this->transformGlobalValues (gblRow,
1831 void scale (
const Scalar& alpha);
1858 setAllValues (
const typename local_graph_device_type::row_map_type& ptr,
1859 const typename local_graph_device_type::entries_type::non_const_type& ind,
1860 const typename local_matrix_device_type::values_type& val);
1911 const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1912 const Teuchos::ArrayRCP<Scalar>& val);
1920 {
return getCrsGraph()->getLocalRowPtrsDevice(); }
1928 {
return getCrsGraph()->getLocalIndicesDevice(); }
1977 void resumeFill (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2037 fillComplete (
const Teuchos::RCP<const map_type>& domainMap,
2038 const Teuchos::RCP<const map_type>& rangeMap,
2039 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2068 fillComplete (
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2098 const Teuchos::RCP<const map_type>& rangeMap,
2099 const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2100 const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2101 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2121 replaceColMap (
const Teuchos::RCP<const map_type>& newColMap);
2206 const Teuchos::RCP<const map_type>& newColMap,
2207 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2208 const bool sortEachRow =
true);
2237 Teuchos::RCP<const import_type>& newImporter);
2266 Teuchos::RCP<const export_type>& newExporter);
2289 Teuchos::RCP<const Teuchos::Comm<int> >
getComm()
const override;
2293 Teuchos::RCP<const map_type>
getRowMap ()
const override;
2296 Teuchos::RCP<const map_type>
getColMap ()
const override;
2299 Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2303 Teuchos::RCP<const crs_graph_type>
getCrsGraph ()
const;
2329 local_matrix_host_type getLocalMatrixHost ()
const;
2331 #if KOKKOSKERNELS_VERSION < 40299
2549 using values_dualv_type =
2550 Kokkos::DualView<impl_scalar_type*, device_type>;
2551 using values_wdv_type =
2553 values_wdv_type valuesUnpacked_wdv;
2554 mutable values_wdv_type valuesPacked_wdv;
2556 #if KOKKOSKERNELS_VERSION < 40299
2557 using ordinal_rowptrs_type =
typename local_multiply_op_type::ordinal_view_type;
2620 nonconst_global_inds_host_view_type &Indices,
2621 nonconst_values_host_view_type &Values,
2622 size_t& NumEntries)
const override;
2640 nonconst_local_inds_host_view_type &Indices,
2641 nonconst_values_host_view_type &Values,
2642 size_t& NumEntries)
const override;
2659 global_inds_host_view_type &indices,
2660 values_host_view_type &values)
const override;
2676 local_inds_host_view_type &indices,
2677 values_host_view_type &values)
const override;
2765 Kokkos::MemoryUnmanaged>& offsets)
const;
2791 const Teuchos::ArrayView<const size_t>& offsets)
const;
2875 const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2876 const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one (),
2877 const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero ())
const;
2882 Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2902 Teuchos::ETransp mode = Teuchos::NO_TRANS,
2903 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2904 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero())
const override;
2916 Teuchos::RCP<const map_type>
getDomainMap ()
const override;
2924 Teuchos::RCP<const map_type>
getRangeMap ()
const override;
2940 virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2941 add (
const Scalar& alpha,
2946 const Teuchos::RCP<Teuchos::ParameterList>& params)
const override;
2958 describe (Teuchos::FancyOStream& out,
2959 const Teuchos::EVerbosityLevel verbLevel =
2960 Teuchos::Describable::verbLevel_default)
const override;
2970 typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2979 const bool verbose);
2983 copyAndPermuteStaticGraph(
2985 const size_t numSameIDs,
2986 const LocalOrdinal permuteToLIDs[],
2987 const LocalOrdinal permuteFromLIDs[],
2988 const size_t numPermutes);
2991 copyAndPermuteNonStaticGraph(
2993 const size_t numSameIDs,
2994 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2995 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2996 const size_t numPermutes);
3009 const size_t numSameIDs,
3010 const Kokkos::DualView<
3013 const Kokkos::DualView<
3021 const Kokkos::DualView<
3024 Kokkos::DualView<char*, buffer_device_type>& exports,
3025 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3026 size_t& constantNumPackets)
override;
3039 unpackAndCombineImpl(
3042 Kokkos::DualView<char*, buffer_device_type> imports,
3043 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3044 const size_t constantNumPackets,
3046 const bool verbose);
3051 unpackAndCombineImplNonStatic(
3054 Kokkos::DualView<char*, buffer_device_type> imports,
3055 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3056 const size_t constantNumPackets,
3071 (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3072 Kokkos::DualView<char*, buffer_device_type> imports,
3073 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3074 const size_t constantNumPackets,
3190 packNew (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3191 Kokkos::DualView<char*, buffer_device_type>& exports,
3192 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3193 size_t& constantNumPackets)
const;
3203 packNonStaticNew (
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3204 Kokkos::DualView<char*, buffer_device_type>& exports,
3205 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3206 size_t& constantNumPackets)
const;
3238 packRow (
char exports[],
3239 const size_t offset,
3240 const size_t numEnt,
3241 const GlobalOrdinal gidsIn[],
3243 const size_t numBytesPerValue)
const;
3269 packRowStatic (
char*
const numEntOut,
3272 const size_t numEnt,
3273 const LocalOrdinal lclRow)
const;
3301 unpackRow (GlobalOrdinal gidsOut[],
3303 const char imports[],
3304 const size_t offset,
3305 const size_t numBytes,
3306 const size_t numEnt,
3307 const size_t numBytesPerValue);
3318 allocatePackSpaceNew (Kokkos::DualView<char*, buffer_device_type>& exports,
3319 size_t& totalNumEntries,
3326 typename local_matrix_host_type::values_type::const_type
3329 return valuesPacked_wdv.getHostView(s);
3333 typename local_matrix_host_type::values_type
3336 return valuesPacked_wdv.getHostView(s);
3340 typename local_matrix_host_type::values_type
3343 return valuesPacked_wdv.getHostView(s);
3347 typename local_matrix_device_type::values_type::const_type
3350 return valuesPacked_wdv.getDeviceView(s);
3354 typename local_matrix_device_type::values_type
3357 return valuesPacked_wdv.getDeviceView(s);
3361 typename local_matrix_device_type::values_type
3364 return valuesPacked_wdv.getDeviceView(s);
3369 template<
class CrsMatrixType>
3370 friend Teuchos::RCP<CrsMatrixType>
3372 const Import<
typename CrsMatrixType::local_ordinal_type,
3373 typename CrsMatrixType::global_ordinal_type,
3374 typename CrsMatrixType::node_type>& importer,
3375 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3376 typename CrsMatrixType::global_ordinal_type,
3377 typename CrsMatrixType::node_type> >& domainMap,
3378 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3379 typename CrsMatrixType::global_ordinal_type,
3380 typename CrsMatrixType::node_type> >& rangeMap,
3381 const Teuchos::RCP<Teuchos::ParameterList>& params);
3384 template<
class CrsMatrixType>
3385 friend Teuchos::RCP<CrsMatrixType>
3387 const Import<
typename CrsMatrixType::local_ordinal_type,
3388 typename CrsMatrixType::global_ordinal_type,
3389 typename CrsMatrixType::node_type>& rowImporter,
3390 const Import<
typename CrsMatrixType::local_ordinal_type,
3391 typename CrsMatrixType::global_ordinal_type,
3392 typename CrsMatrixType::node_type>& domainImporter,
3393 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3394 typename CrsMatrixType::global_ordinal_type,
3395 typename CrsMatrixType::node_type> >& domainMap,
3396 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3397 typename CrsMatrixType::global_ordinal_type,
3398 typename CrsMatrixType::node_type> >& rangeMap,
3399 const Teuchos::RCP<Teuchos::ParameterList>& params);
3403 template<
class CrsMatrixType>
3404 friend Teuchos::RCP<CrsMatrixType>
3406 const Export<
typename CrsMatrixType::local_ordinal_type,
3407 typename CrsMatrixType::global_ordinal_type,
3408 typename CrsMatrixType::node_type>& exporter,
3409 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3410 typename CrsMatrixType::global_ordinal_type,
3411 typename CrsMatrixType::node_type> >& domainMap,
3412 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3413 typename CrsMatrixType::global_ordinal_type,
3414 typename CrsMatrixType::node_type> >& rangeMap,
3415 const Teuchos::RCP<Teuchos::ParameterList>& params);
3418 template<
class CrsMatrixType>
3419 friend Teuchos::RCP<CrsMatrixType>
3421 const Export<
typename CrsMatrixType::local_ordinal_type,
3422 typename CrsMatrixType::global_ordinal_type,
3423 typename CrsMatrixType::node_type>& rowExporter,
3424 const Export<
typename CrsMatrixType::local_ordinal_type,
3425 typename CrsMatrixType::global_ordinal_type,
3426 typename CrsMatrixType::node_type>& domainExporter,
3427 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3428 typename CrsMatrixType::global_ordinal_type,
3429 typename CrsMatrixType::node_type> >& domainMap,
3430 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
3431 typename CrsMatrixType::global_ordinal_type,
3432 typename CrsMatrixType::node_type> >& rangeMap,
3433 const Teuchos::RCP<Teuchos::ParameterList>& params);
3454 const Teuchos::RCP<const map_type>& domainMap,
3455 const Teuchos::RCP<const map_type>& rangeMap,
3456 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3477 const Teuchos::RCP<const map_type>& domainMap,
3478 const Teuchos::RCP<const map_type>& rangeMap,
3479 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3500 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3501 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3502 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3523 const Teuchos::RCP<const map_type>& domainMap,
3524 const Teuchos::RCP<const map_type>& rangeMap,
3525 const Teuchos::RCP<Teuchos::ParameterList>& params)
const;
3551 const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3552 const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> > & domainTransfer,
3553 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3554 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3555 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
const;
3572 const GlobalOrdinal gblColInds[],
3574 const size_t numInputEnt);
3587 insertGlobalValuesFiltered(
3588 const GlobalOrdinal globalRow,
3589 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3590 const Teuchos::ArrayView<const Scalar>& values,
3596 insertGlobalValuesFilteredChecked(
3597 const GlobalOrdinal globalRow,
3598 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3599 const Teuchos::ArrayView<const Scalar>& values,
3600 const char*
const prefix,
3602 const bool verbose);
3616 combineGlobalValues(
3617 const GlobalOrdinal globalRowIndex,
3618 const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3619 const Teuchos::ArrayView<const Scalar>& values,
3621 const char*
const prefix,
3623 const bool verbose);
3647 combineGlobalValuesRaw(
const LocalOrdinal lclRow,
3648 const LocalOrdinal numEnt,
3650 const GlobalOrdinal cols[],
3652 const char*
const prefix,
3654 const bool verbose);
3667 template<
class BinaryFunction>
3669 transformGlobalValues (
const GlobalOrdinal globalRow,
3670 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3671 const Teuchos::ArrayView<const Scalar>& values,
3673 const bool atomic = useAtomicUpdatesByDefault)
3676 typedef LocalOrdinal LO;
3677 typedef GlobalOrdinal GO;
3679 const LO numInputEnt =
static_cast<LO
> (indices.size ());
3680 if (static_cast<LO> (values.size ()) != numInputEnt) {
3681 return Teuchos::OrdinalTraits<LO>::invalid ();
3684 const GO*
const inputCols = indices.getRawPtr ();
3685 const IST*
const inputVals =
3686 reinterpret_cast<const IST*
> (values.getRawPtr ());
3687 return this->transformGlobalValues (globalRow, numInputEnt, inputVals,
3688 inputCols, f, atomic);
3698 insertNonownedGlobalValues (
const GlobalOrdinal globalRow,
3699 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3700 const Teuchos::ArrayView<const Scalar>& values);
3747 const typename crs_graph_type::SLocalGlobalViews& newInds,
3748 const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3749 const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3750 const ELocalGlobal lg,
3751 const ELocalGlobal I);
3755 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3756 typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3757 typedef Kokkos::ArithTraits<mag_type> STM;
3758 typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3759 typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3763 enum GraphAllocationStatus {
3764 GraphAlreadyAllocated,
3765 GraphNotYetAllocated
3788 const bool verbose);
3876 const bool force =
false)
const;
3901 const bool force =
false)
const;
3914 const Teuchos::ETransp mode,
3922 typename values_dualv_type::t_host::const_type
3927 typename values_dualv_type::t_dev::const_type
3932 typename values_dualv_type::t_host
3937 typename values_dualv_type::t_dev
3944 friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3959 void fillLocalMatrix (
const Teuchos::RCP<Teuchos::ParameterList>& params);
3983 Teuchos::RCP<const Graph> staticGraph_;
3984 Teuchos::RCP< Graph> myGraph_;
3998 Details::STORAGE_1D_UNPACKED;
4030 std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4034 #if KOKKOSKERNELS_VERSION >= 40299
4039 using local_matrix_int_rowptrs_device_type =
4049 local_matrix_int_rowptrs_device_type,
4057 mutable std::shared_ptr<ApplyHelper> applyHelper;
4065 template<
class DestViewType,
class SrcViewType,
4066 class DestOffsetViewType,
class SrcOffsetViewType>
4067 struct pack_functor {
4071 SrcOffsetViewType src_offset_;
4072 DestOffsetViewType dst_offset_;
4073 typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4075 pack_functor (DestViewType dst,
4076 const SrcViewType src,
4077 DestOffsetViewType dst_offset,
4078 const SrcOffsetViewType src_offset) :
4081 src_offset_ (src_offset),
4082 dst_offset_ (dst_offset)
4085 KOKKOS_INLINE_FUNCTION
4086 void operator () (
const LocalOrdinal row)
const {
4087 scalar_index_type srcPos = src_offset_(row);
4088 const scalar_index_type dstEnd = dst_offset_(row+1);
4089 scalar_index_type dstPos = dst_offset_(row);
4090 for ( ; dstPos < dstEnd; ++dstPos, ++srcPos) {
4091 dst_(dstPos) = src_(srcPos);
4101 template<
class Scalar,
4103 class GlobalOrdinal,
4105 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4108 const size_t maxNumEntriesPerRow = 0,
4109 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
4113 return Teuchos::rcp(
new matrix_type(map, maxNumEntriesPerRow,
4117 template<
class CrsMatrixType>
4118 Teuchos::RCP<CrsMatrixType>
4120 const Import<
typename CrsMatrixType::local_ordinal_type,
4121 typename CrsMatrixType::global_ordinal_type,
4122 typename CrsMatrixType::node_type>& importer,
4123 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4124 typename CrsMatrixType::global_ordinal_type,
4125 typename CrsMatrixType::node_type> >& domainMap,
4126 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4127 typename CrsMatrixType::global_ordinal_type,
4128 typename CrsMatrixType::node_type> >& rangeMap,
4129 const Teuchos::RCP<Teuchos::ParameterList>& params)
4131 Teuchos::RCP<CrsMatrixType> destMatrix;
4132 sourceMatrix->importAndFillComplete (destMatrix, importer, domainMap, rangeMap, params);
4136 template<
class CrsMatrixType>
4137 Teuchos::RCP<CrsMatrixType>
4139 const Import<
typename CrsMatrixType::local_ordinal_type,
4140 typename CrsMatrixType::global_ordinal_type,
4141 typename CrsMatrixType::node_type>& rowImporter,
4142 const Import<
typename CrsMatrixType::local_ordinal_type,
4143 typename CrsMatrixType::global_ordinal_type,
4144 typename CrsMatrixType::node_type>& domainImporter,
4145 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4146 typename CrsMatrixType::global_ordinal_type,
4147 typename CrsMatrixType::node_type> >& domainMap,
4148 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4149 typename CrsMatrixType::global_ordinal_type,
4150 typename CrsMatrixType::node_type> >& rangeMap,
4151 const Teuchos::RCP<Teuchos::ParameterList>& params)
4153 Teuchos::RCP<CrsMatrixType> destMatrix;
4154 sourceMatrix->importAndFillComplete (destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4158 template<
class CrsMatrixType>
4159 Teuchos::RCP<CrsMatrixType>
4161 const Export<
typename CrsMatrixType::local_ordinal_type,
4162 typename CrsMatrixType::global_ordinal_type,
4163 typename CrsMatrixType::node_type>& exporter,
4164 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4165 typename CrsMatrixType::global_ordinal_type,
4166 typename CrsMatrixType::node_type> >& domainMap,
4167 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4168 typename CrsMatrixType::global_ordinal_type,
4169 typename CrsMatrixType::node_type> >& rangeMap,
4170 const Teuchos::RCP<Teuchos::ParameterList>& params)
4172 Teuchos::RCP<CrsMatrixType> destMatrix;
4173 sourceMatrix->exportAndFillComplete (destMatrix, exporter, domainMap, rangeMap, params);
4177 template<
class CrsMatrixType>
4178 Teuchos::RCP<CrsMatrixType>
4180 const Export<
typename CrsMatrixType::local_ordinal_type,
4181 typename CrsMatrixType::global_ordinal_type,
4182 typename CrsMatrixType::node_type>& rowExporter,
4183 const Export<
typename CrsMatrixType::local_ordinal_type,
4184 typename CrsMatrixType::global_ordinal_type,
4185 typename CrsMatrixType::node_type>& domainExporter,
4186 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4187 typename CrsMatrixType::global_ordinal_type,
4188 typename CrsMatrixType::node_type> >& domainMap,
4189 const Teuchos::RCP<
const Map<
typename CrsMatrixType::local_ordinal_type,
4190 typename CrsMatrixType::global_ordinal_type,
4191 typename CrsMatrixType::node_type> >& rangeMap,
4192 const Teuchos::RCP<Teuchos::ParameterList>& params)
4194 Teuchos::RCP<CrsMatrixType> destMatrix;
4195 sourceMatrix->exportAndFillComplete (destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4205 template<
class CrsMatrixType>
4208 typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType
const & threshold =
4209 Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude( Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero() ))
4211 auto localMatrix = matrix.getLocalMatrixDevice();
4212 size_t nnzBefore = localMatrix.nnz();
4214 size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4217 size_t globalNNZRemoved = 0;
4218 Teuchos::reduceAll<int, size_t> (*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4219 if(globalNNZRemoved !=
size_t(0)) {
4220 matrix.resumeFill();
4221 matrix.setAllValues(localMatrix);
4222 matrix.expertStaticFillComplete(matrix.getDomainMap(),matrix.getRangeMap());
4235 #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.
void checkInternalState() const
Check that this object's state is sane; throw if it's not.
Abstract interface for local operators (e.g., matrices and preconditioners).
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.
ordinal_rowptrs_type ordinalRowptrs
local_ordinal typed version of local matrix's rowptrs. This allows the LocalCrsMatrixOperator to have...
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.
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.
Kokkos::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.
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).
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.
std::shared_ptr< local_multiply_op_type > getLocalMultiplyOperator() const
The local sparse matrix operator (a wrapper of getLocalMatrixDevice() that supports local matrix-vect...
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.
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.