Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Tpetra_CrsMatrix_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Tpetra: Templated Linear Algebra Services Package
4 //
5 // Copyright 2008 NTESS and the Tpetra contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef TPETRA_CRSMATRIX_DECL_HPP
11 #define TPETRA_CRSMATRIX_DECL_HPP
12 
15 
16 #include "Tpetra_CrsMatrix_fwd.hpp"
18 #include "KokkosSparse_Utils.hpp"
19 #include "KokkosSparse_CrsMatrix.hpp"
20 #include "Tpetra_Details_MatrixApplyHelper.hpp"
21 #include "Tpetra_RowMatrix_decl.hpp"
22 #include "Tpetra_Exceptions.hpp"
23 #include "Tpetra_DistObject.hpp"
24 #include "Tpetra_CrsGraph.hpp"
25 #include "Tpetra_Vector.hpp"
26 #include "Tpetra_Details_PackTraits.hpp" // unused here, could delete
27 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
28 #include "Teuchos_DataAccess.hpp"
29 
30 #include <memory> // std::shared_ptr
31 
32 namespace Tpetra {
33 
34 // Forward declaration for CrsMatrix::swap() test
35 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
36 class crsMatrix_Swap_Tester;
37 
89 template <class CrsMatrixType>
90 Teuchos::RCP<CrsMatrixType>
91 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
92  const Import<typename CrsMatrixType::local_ordinal_type,
93  typename CrsMatrixType::global_ordinal_type,
94  typename CrsMatrixType::node_type>& importer,
95  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
96  typename CrsMatrixType::global_ordinal_type,
97  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
98  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
99  typename CrsMatrixType::global_ordinal_type,
100  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
101  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
102 
156 template <class CrsMatrixType>
157 Teuchos::RCP<CrsMatrixType>
158 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
159  const Import<typename CrsMatrixType::local_ordinal_type,
160  typename CrsMatrixType::global_ordinal_type,
161  typename CrsMatrixType::node_type>& rowImporter,
162  const Import<typename CrsMatrixType::local_ordinal_type,
163  typename CrsMatrixType::global_ordinal_type,
164  typename CrsMatrixType::node_type>& domainImporter,
165  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
166  typename CrsMatrixType::global_ordinal_type,
167  typename CrsMatrixType::node_type> >& domainMap,
168  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
169  typename CrsMatrixType::global_ordinal_type,
170  typename CrsMatrixType::node_type> >& rangeMap,
171  const Teuchos::RCP<Teuchos::ParameterList>& params);
172 
206 template <class CrsMatrixType>
207 Teuchos::RCP<CrsMatrixType>
208 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
209  const Export<typename CrsMatrixType::local_ordinal_type,
210  typename CrsMatrixType::global_ordinal_type,
211  typename CrsMatrixType::node_type>& exporter,
212  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
213  typename CrsMatrixType::global_ordinal_type,
214  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
215  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
216  typename CrsMatrixType::global_ordinal_type,
217  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
218  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
219 
253 template <class CrsMatrixType>
254 Teuchos::RCP<CrsMatrixType>
255 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
256  const Export<typename CrsMatrixType::local_ordinal_type,
257  typename CrsMatrixType::global_ordinal_type,
258  typename CrsMatrixType::node_type>& rowExporter,
259  const Export<typename CrsMatrixType::local_ordinal_type,
260  typename CrsMatrixType::global_ordinal_type,
261  typename CrsMatrixType::node_type>& domainExporter,
262  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
263  typename CrsMatrixType::global_ordinal_type,
264  typename CrsMatrixType::node_type> >& domainMap,
265  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
266  typename CrsMatrixType::global_ordinal_type,
267  typename CrsMatrixType::node_type> >& rangeMap,
268  const Teuchos::RCP<Teuchos::ParameterList>& params);
269 
272 namespace Details {
273 template <class SC, class LO, class GO, class NO>
274 void residual(const Operator<SC, LO, GO, NO>& A,
275  const MultiVector<SC, LO, GO, NO>& X,
276  const MultiVector<SC, LO, GO, NO>& B,
277  MultiVector<SC, LO, GO, NO>& R);
278 }
279 
393 template <class Scalar,
394  class LocalOrdinal,
395  class GlobalOrdinal,
396  class Node>
397 class CrsMatrix : public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
398  public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
399  public Details::Spaces::User {
400  private:
401  using dist_object_type =
402  DistObject<char, LocalOrdinal, GlobalOrdinal,
403  Node>;
404 
406  public:
408 
409 
411  using scalar_type = Scalar;
413  using local_ordinal_type = LocalOrdinal;
415  using global_ordinal_type = GlobalOrdinal;
417  using device_type = typename Node::device_type;
419  using execution_space = typename device_type::execution_space;
421  using memory_space = typename device_type::memory_space;
422 
427  using node_type = Node;
428 
431 
434 
437 
440 
456 #if KOKKOS_VERSION >= 40799
457  using mag_type = typename KokkosKernels::ArithTraits<impl_scalar_type>::mag_type;
458 #else
459  using mag_type = typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
460 #endif
461 
464 
467  using local_graph_host_type = typename crs_graph_type::local_graph_host_type;
468 
472  KokkosSparse::CrsMatrix<impl_scalar_type,
474  device_type,
475  void,
476  typename local_graph_device_type::size_type>;
477 #if KOKKOS_VERSION >= 40799
478  using local_matrix_host_type =
479  typename local_matrix_device_type::host_mirror_type;
480 #else
481  using local_matrix_host_type =
482  typename local_matrix_device_type::HostMirror;
483 #endif
484 
485  using row_ptrs_device_view_type =
486  typename row_matrix_type::row_ptrs_device_view_type;
487  using row_ptrs_host_view_type =
488  typename row_matrix_type::row_ptrs_host_view_type;
489 
490  using local_inds_device_view_type =
491  typename row_matrix_type::local_inds_device_view_type;
492  using local_inds_host_view_type =
493  typename row_matrix_type::local_inds_host_view_type;
494  using nonconst_local_inds_host_view_type =
495  typename row_matrix_type::nonconst_local_inds_host_view_type;
496 
497  using global_inds_device_view_type =
498  typename row_matrix_type::global_inds_device_view_type;
499  using global_inds_host_view_type =
500  typename row_matrix_type::global_inds_host_view_type;
501  using nonconst_global_inds_host_view_type =
502  typename row_matrix_type::nonconst_global_inds_host_view_type;
503 
504  using values_device_view_type =
505  typename row_matrix_type::values_device_view_type;
506  using values_host_view_type =
507  typename row_matrix_type::values_host_view_type;
508  using nonconst_values_host_view_type =
509  typename row_matrix_type::nonconst_values_host_view_type;
510 
512 
514 
516  CrsMatrix(const CrsMatrix<Scalar, LocalOrdinal,
517  GlobalOrdinal, Node>&) = default;
518 
520  CrsMatrix(CrsMatrix<Scalar, LocalOrdinal,
521  GlobalOrdinal, Node>&&) = default;
522 
524  CrsMatrix&
525  operator=(const CrsMatrix<Scalar, LocalOrdinal,
526  GlobalOrdinal, Node>&) = default;
527 
529  CrsMatrix&
530  operator=(CrsMatrix<Scalar, LocalOrdinal,
531  GlobalOrdinal, Node>&&) = default;
532 
546  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
547  const size_t maxNumEntriesPerRow,
548  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
549 
562  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
563  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
564  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
565 
584  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
585  const Teuchos::RCP<const map_type>& colMap,
586  const size_t maxNumEntPerRow,
587  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
588 
607  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
608  const Teuchos::RCP<const map_type>& colMap,
609  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
610  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
611 
641  const Teuchos::RCP<const crs_graph_type>& graph,
642  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
643 
668  explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
669  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
670 
699  explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
700  const typename local_matrix_device_type::values_type& values,
701  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
702 
729  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
730  const Teuchos::RCP<const map_type>& colMap,
731  const typename local_graph_device_type::row_map_type& rowPointers,
732  const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
733  const typename local_matrix_device_type::values_type& values,
734  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
735 
762  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
763  const Teuchos::RCP<const map_type>& colMap,
764  const Teuchos::ArrayRCP<size_t>& rowPointers,
765  const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
766  const Teuchos::ArrayRCP<Scalar>& values,
767  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
768 
790  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
791  const Teuchos::RCP<const map_type>& colMap,
792  const local_matrix_device_type& lclMatrix,
793  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
794 
825  CrsMatrix(const local_matrix_device_type& lclMatrix,
826  const Teuchos::RCP<const map_type>& rowMap,
827  const Teuchos::RCP<const map_type>& colMap,
828  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
829  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
830  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
831 
836  CrsMatrix(const local_matrix_device_type& lclMatrix,
837  const Teuchos::RCP<const map_type>& rowMap,
838  const Teuchos::RCP<const map_type>& colMap,
839  const Teuchos::RCP<const map_type>& domainMap,
840  const Teuchos::RCP<const map_type>& rangeMap,
841  const Teuchos::RCP<const import_type>& importer,
842  const Teuchos::RCP<const export_type>& exporter,
843  const Teuchos::RCP<Teuchos::ParameterList>& params =
844  Teuchos::null);
845 
847  // This function in 'Copy' mode is only guaranteed to work correctly for matrices
848  // which are fillComplete.
850  const Teuchos::DataAccess copyOrView);
851 
861  virtual ~CrsMatrix() = default;
862 
863  // This friend declaration makes the clone() method work.
864  template <class S2, class LO2, class GO2, class N2>
865  friend class CrsMatrix;
866 
867  // This friend declaration allows for fused residual calculation
868  template <class S2, class LO2, class GO2, class N2>
869  friend void Details::residual(const Operator<S2, LO2, GO2, N2>& A,
873 
874  // This friend declaration allows for batching of apply calls
875  template <class MatrixArray, class MultiVectorArray>
876  friend void batchedApply(const MatrixArray& Matrices,
877  const typename std::remove_pointer<typename MultiVectorArray::value_type>::type& X,
878  MultiVectorArray& Y,
879  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
880  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
881  Teuchos::RCP<Teuchos::ParameterList> params);
882 
883  public:
885 
887 
911  //
953  void
954  insertGlobalValues(const GlobalOrdinal globalRow,
955  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
956  const Teuchos::ArrayView<const Scalar>& vals);
957 
972  void
973  insertGlobalValues(const GlobalOrdinal globalRow,
974  const LocalOrdinal numEnt,
975  const Scalar vals[],
976  const GlobalOrdinal inds[]);
977 
1020  void
1021  insertLocalValues(const LocalOrdinal localRow,
1022  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1023  const Teuchos::ArrayView<const Scalar>& vals,
1024  const CombineMode CM = ADD);
1025 
1045  void
1046  insertLocalValues(const LocalOrdinal localRow,
1047  const LocalOrdinal numEnt,
1048  const Scalar vals[],
1049  const LocalOrdinal cols[],
1050  const CombineMode CM = ADD);
1051 
1052  protected:
1063  virtual LocalOrdinal
1065  const crs_graph_type& graph,
1066  const RowInfo& rowInfo,
1067  const GlobalOrdinal inds[],
1068  const impl_scalar_type newVals[],
1069  const LocalOrdinal numElts);
1070 
1071  public:
1110  const global_ordinal_type globalRow,
1111  const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1112  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1113 
1116  LocalOrdinal
1117  replaceGlobalValues(const GlobalOrdinal globalRow,
1118  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1119  const Teuchos::ArrayView<const Scalar>& vals);
1120 
1135  LocalOrdinal
1136  replaceGlobalValues(const GlobalOrdinal globalRow,
1137  const LocalOrdinal numEnt,
1138  const Scalar vals[],
1139  const GlobalOrdinal cols[]);
1140 
1141  protected:
1152  virtual LocalOrdinal
1154  const crs_graph_type& graph,
1155  const RowInfo& rowInfo,
1156  const LocalOrdinal inds[],
1157  const impl_scalar_type newVals[],
1158  const LocalOrdinal numElts);
1159 
1160  public:
1198  const local_ordinal_type localRow,
1199  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1200  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1201 
1205  LocalOrdinal
1206  replaceLocalValues(const LocalOrdinal localRow,
1207  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1208  const Teuchos::ArrayView<const Scalar>& vals);
1209 
1227  LocalOrdinal
1228  replaceLocalValues(const LocalOrdinal localRow,
1229  const LocalOrdinal numEnt,
1230  const Scalar inputVals[],
1231  const LocalOrdinal inputCols[]);
1232 
1233  private:
1238  static const bool useAtomicUpdatesByDefault =
1239 #ifdef KOKKOS_ENABLE_SERIAL
1240  !std::is_same<execution_space, Kokkos::Serial>::value;
1241 #else
1242  true;
1243 #endif // KOKKOS_ENABLE_SERIAL
1244 
1268  protected:
1269  virtual LocalOrdinal
1271  const crs_graph_type& graph,
1272  const RowInfo& rowInfo,
1273  const GlobalOrdinal inds[],
1274  const impl_scalar_type newVals[],
1275  const LocalOrdinal numElts,
1276  const bool atomic = useAtomicUpdatesByDefault);
1277 
1278  public:
1315  LocalOrdinal
1316  sumIntoGlobalValues(const GlobalOrdinal globalRow,
1317  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1318  const Teuchos::ArrayView<const Scalar>& vals,
1319  const bool atomic = useAtomicUpdatesByDefault);
1320 
1343  LocalOrdinal
1344  sumIntoGlobalValues(const GlobalOrdinal globalRow,
1345  const LocalOrdinal numEnt,
1346  const Scalar vals[],
1347  const GlobalOrdinal cols[],
1348  const bool atomic = useAtomicUpdatesByDefault);
1349 
1350  protected:
1363  virtual LocalOrdinal
1365  const crs_graph_type& graph,
1366  const RowInfo& rowInfo,
1367  const LocalOrdinal inds[],
1368  const impl_scalar_type newVals[],
1369  const LocalOrdinal numElts,
1370  const bool atomic = useAtomicUpdatesByDefault);
1371 
1372  public:
1411  const local_ordinal_type localRow,
1412  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1413  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1414  const bool atomic = useAtomicUpdatesByDefault);
1415 
1445  LocalOrdinal
1446  sumIntoLocalValues(const LocalOrdinal localRow,
1447  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1448  const Teuchos::ArrayView<const Scalar>& vals,
1449  const bool atomic = useAtomicUpdatesByDefault);
1450 
1472  LocalOrdinal
1473  sumIntoLocalValues(const LocalOrdinal localRow,
1474  const LocalOrdinal numEnt,
1475  const Scalar vals[],
1476  const LocalOrdinal cols[],
1477  const bool atomic = useAtomicUpdatesByDefault);
1478 
1479  private:
1510  LocalOrdinal
1511  transformLocalValues(impl_scalar_type rowVals[],
1512  const crs_graph_type& graph,
1513  const RowInfo& rowInfo,
1514  const LocalOrdinal inds[],
1515  const impl_scalar_type newVals[],
1516  const LocalOrdinal numElts,
1517  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1518  const bool atomic = useAtomicUpdatesByDefault);
1519 
1550  LocalOrdinal
1551  transformGlobalValues(impl_scalar_type rowVals[],
1552  const crs_graph_type& graph,
1553  const RowInfo& rowInfo,
1554  const GlobalOrdinal inds[],
1555  const impl_scalar_type newVals[],
1556  const LocalOrdinal numElts,
1557  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1558  const bool atomic = useAtomicUpdatesByDefault);
1559 
1586  LocalOrdinal
1587  transformLocalValues(const LocalOrdinal lclRow,
1588  const LocalOrdinal numInputEnt,
1589  const impl_scalar_type inputVals[],
1590  const LocalOrdinal inputCols[],
1591  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1592  const bool atomic = useAtomicUpdatesByDefault);
1593 
1620  LocalOrdinal
1621  transformGlobalValues(const GlobalOrdinal gblRow,
1622  const LocalOrdinal numInputEnt,
1623  const impl_scalar_type inputVals[],
1624  const GlobalOrdinal inputCols[],
1625  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1626  const bool atomic = useAtomicUpdatesByDefault);
1627 
1628  public:
1672  template <class LocalIndicesViewType,
1673  class ImplScalarViewType,
1674  class BinaryFunction>
1675  LocalOrdinal
1676  transformLocalValues(const LocalOrdinal lclRow,
1677  const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1678  const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1679  BinaryFunction f,
1680  const bool atomic = useAtomicUpdatesByDefault) {
1681  // We use static_assert here to check the template parameters,
1682  // rather than std::enable_if (e.g., on the return value, to
1683  // enable compilation only if the template parameters match the
1684  // desired attributes). This turns obscure link errors into
1685  // clear compilation errors. It also makes the return value a
1686  // lot easier to see.
1687  static_assert(Kokkos::is_view<LocalIndicesViewType>::value,
1688  "First template parameter LocalIndicesViewType must be "
1689  "a Kokkos::View.");
1690  static_assert(Kokkos::is_view<ImplScalarViewType>::value,
1691  "Second template parameter ImplScalarViewType must be a "
1692  "Kokkos::View.");
1693  static_assert(static_cast<int>(LocalIndicesViewType::rank) == 1,
1694  "First template parameter LocalIndicesViewType must "
1695  "have rank 1.");
1696  static_assert(static_cast<int>(ImplScalarViewType::rank) == 1,
1697  "Second template parameter ImplScalarViewType must have "
1698  "rank 1.");
1699  static_assert(std::is_same<
1700  typename LocalIndicesViewType::non_const_value_type,
1701  local_ordinal_type>::value,
1702  "First template parameter LocalIndicesViewType must "
1703  "contain values of type local_ordinal_type.");
1704  static_assert(std::is_same<
1705  typename ImplScalarViewType::non_const_value_type,
1706  impl_scalar_type>::value,
1707  "Second template parameter ImplScalarViewType must "
1708  "contain values of type impl_scalar_type.");
1709  typedef LocalOrdinal LO;
1710  const LO numInputEnt = inputInds.extent(0);
1711  if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1712  return Teuchos::OrdinalTraits<LO>::invalid();
1713  }
1714  return this->transformLocalValues(lclRow,
1715  numInputEnt,
1716  inputVals.data(),
1717  inputInds.data(),
1718  f,
1719  atomic);
1720  }
1721 
1763  template <class BinaryFunction, class InputMemorySpace>
1764  LocalOrdinal
1765  transformGlobalValues(const GlobalOrdinal gblRow,
1766  const Kokkos::View<const GlobalOrdinal*,
1767  InputMemorySpace,
1768  Kokkos::MemoryUnmanaged>& inputInds,
1769  const Kokkos::View<const impl_scalar_type*,
1770  InputMemorySpace,
1771  Kokkos::MemoryUnmanaged>& inputVals,
1772  BinaryFunction f,
1773  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();
1778  }
1779  return this->transformGlobalValues(gblRow,
1780  numInputEnt,
1781  inputVals.data(),
1782  inputInds.data(),
1783  f,
1784  atomic);
1785  }
1786 
1788  void setAllToScalar(const Scalar& alpha);
1789 
1791  void scale(const Scalar& alpha);
1792 
1817  void
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);
1821 
1842  void
1843  setAllValues(const local_matrix_device_type& localMatrix);
1844 
1869  void
1870  setAllValues(const Teuchos::ArrayRCP<size_t>& ptr,
1871  const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1872  const Teuchos::ArrayRCP<Scalar>& val);
1873 
1875  row_ptrs_host_view_type getLocalRowPtrsHost() const { return getCrsGraph()->getLocalRowPtrsHost(); }
1876 
1878  row_ptrs_device_view_type getLocalRowPtrsDevice() const { return getCrsGraph()->getLocalRowPtrsDevice(); }
1879 
1881  local_inds_host_view_type getLocalIndicesHost() const { return getCrsGraph()->getLocalIndicesHost(); }
1882 
1884  local_inds_device_view_type getLocalIndicesDevice() const { return getCrsGraph()->getLocalIndicesDevice(); }
1885 
1887 
1889 
1918  void globalAssemble();
1919 
1933  void resumeFill(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1934 
1992  void
1993  fillComplete(const Teuchos::RCP<const map_type>& domainMap,
1994  const Teuchos::RCP<const map_type>& rangeMap,
1995  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1996 
2023  void
2024  fillComplete(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2025 
2052  void
2053  expertStaticFillComplete(const Teuchos::RCP<const map_type>& domainMap,
2054  const Teuchos::RCP<const map_type>& rangeMap,
2055  const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2056  const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2057  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2058 
2076  void
2077  replaceColMap(const Teuchos::RCP<const map_type>& newColMap);
2078 
2160  void
2161  reindexColumns(crs_graph_type* const graph,
2162  const Teuchos::RCP<const map_type>& newColMap,
2163  const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2164  const bool sortEachRow = true);
2165 
2175  void
2176  replaceDomainMap(const Teuchos::RCP<const map_type>& newDomainMap);
2177 
2191  void
2192  replaceDomainMapAndImporter(const Teuchos::RCP<const map_type>& newDomainMap,
2193  Teuchos::RCP<const import_type>& newImporter);
2194 
2204  void
2205  replaceRangeMap(const Teuchos::RCP<const map_type>& newRangeMap);
2206 
2220  void
2221  replaceRangeMapAndExporter(const Teuchos::RCP<const map_type>& newRangeMap,
2222  Teuchos::RCP<const export_type>& newExporter);
2223 
2237  virtual void
2238  removeEmptyProcessesInPlace(const Teuchos::RCP<const map_type>& newMap) override;
2239 
2241 
2243 
2245  Teuchos::RCP<const Teuchos::Comm<int> > getComm() const override;
2246 
2248  Teuchos::RCP<const map_type> getRowMap() const override;
2249 
2251  Teuchos::RCP<const map_type> getColMap() const override;
2252 
2254  Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2255  getGraph() const override;
2256 
2258  Teuchos::RCP<const crs_graph_type> getCrsGraph() const;
2259 
2260  private:
2271  const crs_graph_type& getCrsGraphRef() const;
2272 
2273  public:
2274 #if __armclang_major__ == 22 && __armclang_minor__ == 1
2275  // On Stria, PR 13052 caused a 25% performance regression in the
2276  // CGSolve performance test that is fixed by forcing
2277  // getLocalMatrixDevice to always be inlined. Restrict the fix
2278  // to the specific toolchain where the problem was observed
2279 #define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2280 #else
2281 #define TPETRA_DETAILS_ALWAYS_INLINE
2282 #endif
2283  TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type
2296  getLocalMatrixDevice() const;
2297  local_matrix_host_type getLocalMatrixHost() const;
2298 #undef TPETRA_DETAILS_ALWAYS_INLINE
2299 
2319  global_size_t getGlobalNumRows() const override;
2320 
2326  global_size_t getGlobalNumCols() const override;
2327 
2334  size_t getLocalNumRows() const override;
2335 
2339  size_t getLocalNumCols() const override;
2340 
2342  GlobalOrdinal getIndexBase() const override;
2343 
2345  global_size_t getGlobalNumEntries() const override;
2346 
2348  size_t getLocalNumEntries() const override;
2349 
2356  size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const override;
2357 
2364  size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const override;
2365 
2373  size_t getGlobalMaxNumRowEntries() const override;
2374 
2382  size_t getLocalMaxNumRowEntries() const override;
2383 
2385  virtual LocalOrdinal getBlockSize() const override { return 1; }
2386 
2388  bool hasColMap() const override;
2389 
2410  bool isLocallyIndexed() const override;
2411 
2432  bool isGloballyIndexed() const override;
2433 
2456  bool isFillComplete() const override;
2457 
2480  bool isFillActive() const;
2481 
2483 
2489  bool isStorageOptimized() const;
2490 
2492  bool isStaticGraph() const;
2493 
2501  mag_type getNormInf() const;
2502 
2506  //
2512  mag_type getNorm1(bool assumeSymmetric = false) const;
2513 
2521  mag_type getFrobeniusNorm() const override;
2522 
2525  virtual bool supportsRowViews() const override;
2526 
2527  protected:
2528  using values_dualv_type =
2529  Kokkos::DualView<impl_scalar_type*, device_type>;
2530  using values_wdv_type =
2532  values_wdv_type valuesUnpacked_wdv;
2533  mutable values_wdv_type valuesPacked_wdv;
2534 
2535  public:
2584  void
2585  getGlobalRowCopy(GlobalOrdinal GlobalRow,
2586  nonconst_global_inds_host_view_type& Indices,
2587  nonconst_values_host_view_type& Values,
2588  size_t& NumEntries) const override;
2604  void
2605  getLocalRowCopy(LocalOrdinal LocalRow,
2606  nonconst_local_inds_host_view_type& Indices,
2607  nonconst_values_host_view_type& Values,
2608  size_t& NumEntries) const override;
2609 
2622 
2623  void
2624  getGlobalRowView(GlobalOrdinal GlobalRow,
2625  global_inds_host_view_type& indices,
2626  values_host_view_type& values) const override;
2627 
2640  void
2641  getLocalRowView(LocalOrdinal LocalRow,
2642  local_inds_host_view_type& indices,
2643  values_host_view_type& values) const override;
2644 
2652 
2659  void
2661 
2705  void getLocalDiagOffsets(Teuchos::ArrayRCP<size_t>& offsets) const;
2706 
2728  void
2730  const Kokkos::View<const size_t*, device_type,
2731  Kokkos::MemoryUnmanaged>& offsets) const;
2732 
2755  void
2757  const Teuchos::ArrayView<const size_t>& offsets) const;
2758 
2763  void
2765 
2770  void
2772 
2774 
2776 
2838  void
2841  const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2842  const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one(),
2843  const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero()) const;
2844 
2847  template <class T>
2848  Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2849  convert() const;
2850 
2852 
2854 
2865  void
2868  Teuchos::ETransp mode = Teuchos::NO_TRANS,
2869  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2870  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const override;
2871 
2874  bool hasTransposeApply() const override;
2875 
2882  Teuchos::RCP<const map_type> getDomainMap() const override;
2883 
2890  Teuchos::RCP<const map_type> getRangeMap() const override;
2891 
2893 
2895 
2906  virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2907  add(const Scalar& alpha,
2909  const Scalar& beta,
2910  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap,
2911  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap,
2912  const Teuchos::RCP<Teuchos::ParameterList>& params) const override;
2913 
2915 
2917 
2919  std::string description() const override;
2920 
2923  void
2924  describe(Teuchos::FancyOStream& out,
2925  const Teuchos::EVerbosityLevel verbLevel =
2926  Teuchos::Describable::verbLevel_default) const override;
2927 
2929 
2931 
2936  typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2938 
2939  virtual bool
2940  checkSizes(const SrcDistObject& source) override;
2941 
2942  void
2943  applyCrsPadding(
2944  const typename crs_graph_type::padding_type& padding,
2945  const bool verbose);
2946 
2947  private:
2948  void
2949  copyAndPermuteStaticGraph(
2951  const size_t numSameIDs,
2952  const LocalOrdinal permuteToLIDs[],
2953  const LocalOrdinal permuteFromLIDs[],
2954  const size_t numPermutes);
2955 
2956  void
2957  copyAndPermuteNonStaticGraph(
2959  const size_t numSameIDs,
2960  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2961  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2962  const size_t numPermutes);
2963 
2964  protected:
2965  using dist_object_type::
2967 
2969  virtual void
2970  copyAndPermute(const SrcDistObject& source,
2971  const size_t numSameIDs,
2972  const Kokkos::DualView<
2973  const local_ordinal_type*,
2974  buffer_device_type>& permuteToLIDs,
2975  const Kokkos::DualView<
2976  const local_ordinal_type*,
2977  buffer_device_type>& permuteFromLIDs,
2978  const CombineMode CM) override;
2979 
2980  virtual void
2981  packAndPrepare(const SrcDistObject& source,
2982  const Kokkos::DualView<
2983  const local_ordinal_type*,
2984  buffer_device_type>& exportLIDs,
2985  Kokkos::DualView<char*, buffer_device_type>& exports,
2986  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2987  size_t& constantNumPackets) override;
2988 
2990 
2994  private:
2997  void
2998  unpackAndCombineImpl(
2999  const Kokkos::DualView<const local_ordinal_type*,
3000  buffer_device_type>& importLIDs,
3001  Kokkos::DualView<char*, buffer_device_type> imports,
3002  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3003  const size_t constantNumPackets,
3004  const CombineMode combineMode,
3005  const bool verbose);
3006 
3009  void
3010  unpackAndCombineImplNonStatic(
3011  const Kokkos::DualView<const local_ordinal_type*,
3012  buffer_device_type>& importLIDs,
3013  Kokkos::DualView<char*, buffer_device_type> imports,
3014  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3015  const size_t constantNumPackets,
3016  const CombineMode combineMode);
3017 
3018  public:
3028  void
3029  unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3030  Kokkos::DualView<char*, buffer_device_type> imports,
3031  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3032  const size_t constantNumPackets,
3033  const CombineMode CM) override;
3034 
3036 
3145  void
3146  packNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3147  Kokkos::DualView<char*, buffer_device_type>& exports,
3148  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3149  size_t& constantNumPackets) const;
3150 
3151  private:
3158  void
3159  packNonStaticNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3160  Kokkos::DualView<char*, buffer_device_type>& exports,
3161  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3162  size_t& constantNumPackets) const;
3163 
3193  size_t
3194  packRow(char exports[],
3195  const size_t offset,
3196  const size_t numEnt,
3197  const GlobalOrdinal gidsIn[],
3198  const impl_scalar_type valsIn[],
3199  const size_t numBytesPerValue) const;
3200 
3224  bool
3225  packRowStatic(char* const numEntOut,
3226  char* const valOut,
3227  char* const indOut,
3228  const size_t numEnt,
3229  const LocalOrdinal lclRow) const;
3230 
3256  size_t
3257  unpackRow(GlobalOrdinal gidsOut[],
3258  impl_scalar_type valsOut[],
3259  const char imports[],
3260  const size_t offset,
3261  const size_t numBytes,
3262  const size_t numEnt,
3263  const size_t numBytesPerValue);
3264 
3273  void
3274  allocatePackSpaceNew(Kokkos::DualView<char*, buffer_device_type>& exports,
3275  size_t& totalNumEntries,
3276  const Kokkos::DualView<const local_ordinal_type*,
3277  buffer_device_type>& exportLIDs) const;
3279 
3280  public:
3282  typename local_matrix_host_type::values_type::const_type
3283  getLocalValuesHost(Access::ReadOnlyStruct s) const {
3284  return valuesPacked_wdv.getHostView(s);
3285  }
3286 
3288  typename local_matrix_host_type::values_type
3289  getLocalValuesHost(Access::ReadWriteStruct s) {
3290  return valuesPacked_wdv.getHostView(s);
3291  }
3292 
3294  typename local_matrix_host_type::values_type
3295  getLocalValuesHost(Access::OverwriteAllStruct s) {
3296  return valuesPacked_wdv.getHostView(s);
3297  }
3298 
3300  typename local_matrix_device_type::values_type::const_type
3301  getLocalValuesDevice(Access::ReadOnlyStruct s) const {
3302  return valuesPacked_wdv.getDeviceView(s);
3303  }
3304 
3306  typename local_matrix_device_type::values_type
3307  getLocalValuesDevice(Access::ReadWriteStruct s) {
3308  return valuesPacked_wdv.getDeviceView(s);
3309  }
3310 
3312  typename local_matrix_device_type::values_type
3313  getLocalValuesDevice(Access::OverwriteAllStruct s) {
3314  return valuesPacked_wdv.getDeviceView(s);
3315  }
3316 
3317  private:
3318  // Friend declaration for nonmember function.
3319  template <class CrsMatrixType>
3320  friend Teuchos::RCP<CrsMatrixType>
3321  Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3322  const Import<typename CrsMatrixType::local_ordinal_type,
3323  typename CrsMatrixType::global_ordinal_type,
3324  typename CrsMatrixType::node_type>& importer,
3325  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3326  typename CrsMatrixType::global_ordinal_type,
3327  typename CrsMatrixType::node_type> >& domainMap,
3328  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3329  typename CrsMatrixType::global_ordinal_type,
3330  typename CrsMatrixType::node_type> >& rangeMap,
3331  const Teuchos::RCP<Teuchos::ParameterList>& params);
3332 
3333  // Friend declaration for nonmember function.
3334  template <class CrsMatrixType>
3335  friend Teuchos::RCP<CrsMatrixType>
3336  Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3337  const Import<typename CrsMatrixType::local_ordinal_type,
3338  typename CrsMatrixType::global_ordinal_type,
3339  typename CrsMatrixType::node_type>& rowImporter,
3340  const Import<typename CrsMatrixType::local_ordinal_type,
3341  typename CrsMatrixType::global_ordinal_type,
3342  typename CrsMatrixType::node_type>& domainImporter,
3343  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3344  typename CrsMatrixType::global_ordinal_type,
3345  typename CrsMatrixType::node_type> >& domainMap,
3346  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3347  typename CrsMatrixType::global_ordinal_type,
3348  typename CrsMatrixType::node_type> >& rangeMap,
3349  const Teuchos::RCP<Teuchos::ParameterList>& params);
3350 
3351  // Friend declaration for nonmember function.
3352  template <class CrsMatrixType>
3353  friend Teuchos::RCP<CrsMatrixType>
3354  Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3355  const Export<typename CrsMatrixType::local_ordinal_type,
3356  typename CrsMatrixType::global_ordinal_type,
3357  typename CrsMatrixType::node_type>& exporter,
3358  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3359  typename CrsMatrixType::global_ordinal_type,
3360  typename CrsMatrixType::node_type> >& domainMap,
3361  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3362  typename CrsMatrixType::global_ordinal_type,
3363  typename CrsMatrixType::node_type> >& rangeMap,
3364  const Teuchos::RCP<Teuchos::ParameterList>& params);
3365 
3366  // Friend declaration for nonmember function.
3367  template <class CrsMatrixType>
3368  friend Teuchos::RCP<CrsMatrixType>
3369  Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3370  const Export<typename CrsMatrixType::local_ordinal_type,
3371  typename CrsMatrixType::global_ordinal_type,
3372  typename CrsMatrixType::node_type>& rowExporter,
3373  const Export<typename CrsMatrixType::local_ordinal_type,
3374  typename CrsMatrixType::global_ordinal_type,
3375  typename CrsMatrixType::node_type>& domainExporter,
3376  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3377  typename CrsMatrixType::global_ordinal_type,
3378  typename CrsMatrixType::node_type> >& domainMap,
3379  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3380  typename CrsMatrixType::global_ordinal_type,
3381  typename CrsMatrixType::node_type> >& rangeMap,
3382  const Teuchos::RCP<Teuchos::ParameterList>& params);
3383 
3384  public:
3400  void
3402  const import_type& importer,
3403  const Teuchos::RCP<const map_type>& domainMap,
3404  const Teuchos::RCP<const map_type>& rangeMap,
3405  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3406 
3422  void
3424  const import_type& rowImporter,
3425  const import_type& domainImporter,
3426  const Teuchos::RCP<const map_type>& domainMap,
3427  const Teuchos::RCP<const map_type>& rangeMap,
3428  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3429 
3445  void
3447  const export_type& exporter,
3448  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3449  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3450  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3451 
3467  void
3469  const export_type& rowExporter,
3470  const export_type& domainExporter,
3471  const Teuchos::RCP<const map_type>& domainMap,
3472  const Teuchos::RCP<const map_type>& rangeMap,
3473  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3474 
3475  private:
3496  void
3497  transferAndFillComplete(Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& destMatrix,
3498  const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3499  const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> >& domainTransfer,
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;
3503 
3515  protected:
3516  virtual void
3518  RowInfo& rowInfo,
3519  const GlobalOrdinal gblColInds[],
3520  const impl_scalar_type vals[],
3521  const size_t numInputEnt);
3522 
3523  private:
3533  void
3534  insertGlobalValuesFiltered(
3535  const GlobalOrdinal globalRow,
3536  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3537  const Teuchos::ArrayView<const Scalar>& values,
3538  const bool debug);
3539 
3542  void
3543  insertGlobalValuesFilteredChecked(
3544  const GlobalOrdinal globalRow,
3545  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3546  const Teuchos::ArrayView<const Scalar>& values,
3547  const char* const prefix,
3548  const bool debug,
3549  const bool verbose);
3550 
3562  void
3563  combineGlobalValues(
3564  const GlobalOrdinal globalRowIndex,
3565  const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3566  const Teuchos::ArrayView<const Scalar>& values,
3567  const Tpetra::CombineMode combineMode,
3568  const char* const prefix,
3569  const bool debug,
3570  const bool verbose);
3571 
3593  LocalOrdinal
3594  combineGlobalValuesRaw(const LocalOrdinal lclRow,
3595  const LocalOrdinal numEnt,
3596  const impl_scalar_type vals[],
3597  const GlobalOrdinal cols[],
3598  const Tpetra::CombineMode combineMode,
3599  const char* const prefix,
3600  const bool debug,
3601  const bool verbose);
3602 
3614  template <class BinaryFunction>
3615  LocalOrdinal
3616  transformGlobalValues(const GlobalOrdinal globalRow,
3617  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3618  const Teuchos::ArrayView<const Scalar>& values,
3619  BinaryFunction f,
3620  const bool atomic = useAtomicUpdatesByDefault) {
3621  typedef impl_scalar_type IST;
3622  typedef LocalOrdinal LO;
3623  typedef GlobalOrdinal GO;
3624 
3625  const LO numInputEnt = static_cast<LO>(indices.size());
3626  if (static_cast<LO>(values.size()) != numInputEnt) {
3627  return Teuchos::OrdinalTraits<LO>::invalid();
3628  }
3629 
3630  const GO* const inputCols = indices.getRawPtr();
3631  const IST* const inputVals =
3632  reinterpret_cast<const IST*>(values.getRawPtr());
3633  return this->transformGlobalValues(globalRow, numInputEnt, inputVals,
3634  inputCols, f, atomic);
3635  }
3636 
3643  void
3644  insertNonownedGlobalValues(const GlobalOrdinal globalRow,
3645  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3646  const Teuchos::ArrayView<const Scalar>& values);
3647 
3690  void
3691  insertIndicesAndValues(crs_graph_type& graph,
3692  RowInfo& rowInfo,
3693  const typename crs_graph_type::SLocalGlobalViews& newInds,
3694  const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3695  const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3696  const ELocalGlobal lg,
3697  const ELocalGlobal I);
3698 
3699  protected:
3700  // useful typedefs
3701  typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3702 #if KOKKOS_VERSION >= 40799
3703  typedef KokkosKernels::ArithTraits<impl_scalar_type> STS;
3704 #else
3705  typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3706 #endif
3707 #if KOKKOS_VERSION >= 40799
3708  typedef KokkosKernels::ArithTraits<mag_type> STM;
3709 #else
3710  typedef Kokkos::ArithTraits<mag_type> STM;
3711 #endif
3712  typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3713  typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3714  typedef crs_graph_type Graph;
3715 
3716  // Enums
3717  enum GraphAllocationStatus {
3718  GraphAlreadyAllocated,
3719  GraphNotYetAllocated
3720  };
3721 
3722  protected:
3741  void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas,
3742  const bool verbose);
3743 
3754  static size_t
3755  mergeRowIndicesAndValues(size_t rowLen, local_ordinal_type* cols, impl_scalar_type* vals);
3756 
3771  void
3772  sortAndMergeIndicesAndValues(const bool sorted,
3773  const bool merged);
3774 
3775  public:
3777  bool haveGlobalConstants() const;
3778 
3779  protected:
3792  mutable Teuchos::RCP<MV> importMV_;
3793 
3806  mutable Teuchos::RCP<MV> exportMV_;
3807 
3827  Teuchos::RCP<MV>
3828  getColumnMapMultiVector(const MV& X_domainMap,
3829  const bool force = false) const;
3830 
3852  Teuchos::RCP<MV>
3853  getRowMapMultiVector(const MV& Y_rangeMap,
3854  const bool force = false) const;
3855 
3857  void
3858  applyNonTranspose(const MV& X_in,
3859  MV& Y_in,
3860  Scalar alpha,
3861  Scalar beta) const;
3862 
3864  void
3865  applyTranspose(const MV& X_in,
3866  MV& Y_in,
3867  const Teuchos::ETransp mode,
3868  Scalar alpha,
3869  Scalar beta) const;
3870 
3871  // matrix data accessors
3872 
3875  typename values_dualv_type::t_host::const_type
3876  getValuesViewHost(const RowInfo& rowinfo) const;
3877 
3880  typename values_dualv_type::t_dev::const_type
3881  getValuesViewDevice(const RowInfo& rowinfo) const;
3882 
3885  typename values_dualv_type::t_host
3886  getValuesViewHostNonConst(const RowInfo& rowinfo);
3887 
3890  typename values_dualv_type::t_dev
3891  getValuesViewDeviceNonConst(const RowInfo& rowinfo);
3892 
3893  private:
3894  // TODO: When KokkosKernels 4.4 is released, local_matrix_device_type can be permanently modified to use the default_size_type
3895  // of KK. This is always a type that is enabled by KK's ETI (preferring int if both or neither int and size_t are enabled).
3896  //
3897  // At that point the ApplyHelper can be replaced with just a SPMVHandle.
3898  using local_matrix_int_rowptrs_device_type =
3899  KokkosSparse::CrsMatrix<impl_scalar_type,
3901  device_type,
3902  void,
3903  int>;
3904 
3908  local_matrix_int_rowptrs_device_type,
3910 
3911  std::shared_ptr<ApplyHelper> getApplyHelper() const {
3912  if (!applyHelper) {
3913  auto A_lcl = getLocalMatrixDevice();
3914  applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3915  }
3916  return applyHelper;
3917  }
3918 
3919  protected:
3920  // Friend the tester for CrsMatrix::swap
3921  friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3922 
3923  // Friend the matrix multiply kernels so they can access internally-cached integer
3924  // row pointers without making them part of the CrsMatrix interface
3925  template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3926  friend struct Tpetra::MMdetails::KernelWrappers;
3927  template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3928  friend struct Tpetra::MMdetails::KernelWrappers2;
3929 
3930  // friend Matrix Matrix utility function that needs to access integer-typed rowptrs
3931  friend void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3932  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3933  Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3934  CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3935  Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3936  bool userAssertsThereAreNoRemotes,
3937  const std::string& label,
3938  const Teuchos::RCP<Teuchos::ParameterList>& params);
3939 
3943  void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& matrix);
3944 
3945  protected:
3951  void fillLocalMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3952 
3958  void fillLocalGraphAndMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3959 
3961  void checkInternalState() const;
3962 
3974 
3975  Teuchos::RCP<const Graph> staticGraph_;
3976  Teuchos::RCP<Graph> myGraph_;
3978 
3979  protected:
3990  Details::STORAGE_1D_UNPACKED;
3991 
3993  bool fillComplete_ = false;
3994 
4022  std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4023  Teuchos::Array<Scalar> > >
4025 
4026  private:
4032  mutable std::shared_ptr<ApplyHelper> applyHelper;
4033 
4034  public:
4035  // FIXME (mfh 24 Feb 2014) Is it _really_ necessary to make this a
4036  // public inner class of CrsMatrix? It looks like it doesn't
4037  // depend on any implementation details of CrsMatrix at all. It
4038  // should really be declared and defined outside of CrsMatrix.
4039  template <class DestViewType, class SrcViewType,
4040  class DestOffsetViewType, class SrcOffsetViewType>
4041  struct pack_functor {
4042  typedef typename DestViewType::execution_space execution_space;
4043  SrcViewType src_;
4044  DestViewType dst_;
4045  SrcOffsetViewType src_offset_;
4046  DestOffsetViewType dst_offset_;
4047  typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4048 
4049  pack_functor(DestViewType dst,
4050  const SrcViewType src,
4051  DestOffsetViewType dst_offset,
4052  const SrcOffsetViewType src_offset)
4053  : src_(src)
4054  , dst_(dst)
4055  , src_offset_(src_offset)
4056  , dst_offset_(dst_offset) {}
4057 
4058  KOKKOS_INLINE_FUNCTION
4059  void operator()(const LocalOrdinal row) const {
4060  scalar_index_type srcPos = src_offset_(row);
4061  const scalar_index_type dstEnd = dst_offset_(row + 1);
4062  scalar_index_type dstPos = dst_offset_(row);
4063  for (; dstPos < dstEnd; ++dstPos, ++srcPos) {
4064  dst_(dstPos) = src_(srcPos);
4065  }
4066  }
4067  };
4068 }; // class CrsMatrix
4069 
4074 template <class Scalar,
4075  class LocalOrdinal,
4076  class GlobalOrdinal,
4077  class Node>
4078 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4080  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map,
4081  const size_t maxNumEntriesPerRow = 0,
4082  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
4083  using matrix_type =
4085  return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow,
4086  params));
4087 }
4088 
4089 template <class CrsMatrixType>
4090 Teuchos::RCP<CrsMatrixType>
4091 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4092  const Import<typename CrsMatrixType::local_ordinal_type,
4093  typename CrsMatrixType::global_ordinal_type,
4094  typename CrsMatrixType::node_type>& importer,
4095  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4096  typename CrsMatrixType::global_ordinal_type,
4097  typename CrsMatrixType::node_type> >& domainMap,
4098  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4099  typename CrsMatrixType::global_ordinal_type,
4100  typename CrsMatrixType::node_type> >& rangeMap,
4101  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4102  Teuchos::RCP<CrsMatrixType> destMatrix;
4103  sourceMatrix->importAndFillComplete(destMatrix, importer, domainMap, rangeMap, params);
4104  return destMatrix;
4105 }
4106 
4107 template <class CrsMatrixType>
4108 Teuchos::RCP<CrsMatrixType>
4109 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4110  const Import<typename CrsMatrixType::local_ordinal_type,
4111  typename CrsMatrixType::global_ordinal_type,
4112  typename CrsMatrixType::node_type>& rowImporter,
4113  const Import<typename CrsMatrixType::local_ordinal_type,
4114  typename CrsMatrixType::global_ordinal_type,
4115  typename CrsMatrixType::node_type>& domainImporter,
4116  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4117  typename CrsMatrixType::global_ordinal_type,
4118  typename CrsMatrixType::node_type> >& domainMap,
4119  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4120  typename CrsMatrixType::global_ordinal_type,
4121  typename CrsMatrixType::node_type> >& rangeMap,
4122  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4123  Teuchos::RCP<CrsMatrixType> destMatrix;
4124  sourceMatrix->importAndFillComplete(destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4125  return destMatrix;
4126 }
4127 
4128 template <class CrsMatrixType>
4129 Teuchos::RCP<CrsMatrixType>
4130 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4131  const Export<typename CrsMatrixType::local_ordinal_type,
4132  typename CrsMatrixType::global_ordinal_type,
4133  typename CrsMatrixType::node_type>& exporter,
4134  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4135  typename CrsMatrixType::global_ordinal_type,
4136  typename CrsMatrixType::node_type> >& domainMap,
4137  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4138  typename CrsMatrixType::global_ordinal_type,
4139  typename CrsMatrixType::node_type> >& rangeMap,
4140  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4141  Teuchos::RCP<CrsMatrixType> destMatrix;
4142  sourceMatrix->exportAndFillComplete(destMatrix, exporter, domainMap, rangeMap, params);
4143  return destMatrix;
4144 }
4145 
4146 template <class CrsMatrixType>
4147 Teuchos::RCP<CrsMatrixType>
4148 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4149  const Export<typename CrsMatrixType::local_ordinal_type,
4150  typename CrsMatrixType::global_ordinal_type,
4151  typename CrsMatrixType::node_type>& rowExporter,
4152  const Export<typename CrsMatrixType::local_ordinal_type,
4153  typename CrsMatrixType::global_ordinal_type,
4154  typename CrsMatrixType::node_type>& domainExporter,
4155  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4156  typename CrsMatrixType::global_ordinal_type,
4157  typename CrsMatrixType::node_type> >& domainMap,
4158  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4159  typename CrsMatrixType::global_ordinal_type,
4160  typename CrsMatrixType::node_type> >& rangeMap,
4161  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4162  Teuchos::RCP<CrsMatrixType> destMatrix;
4163  sourceMatrix->exportAndFillComplete(destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4164  return destMatrix;
4165 }
4166 
4173 template <class CrsMatrixType>
4174 void removeCrsMatrixZeros(CrsMatrixType& matrix,
4175  typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType const& threshold =
4176  Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude(Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero())) {
4177  auto localMatrix = matrix.getLocalMatrixDevice();
4178  size_t nnzBefore = localMatrix.nnz();
4179  localMatrix = KokkosSparse::removeCrsMatrixZeros(localMatrix, threshold);
4180  size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4181  // Skip the expertStaticFillComplete if no entries were removed on any process.
4182  // The fill complete can perform MPI collectives, so it can only be skipped on all processes or none.
4183  size_t globalNNZRemoved = 0;
4184  Teuchos::reduceAll<int, size_t>(*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4185  if (globalNNZRemoved != size_t(0)) {
4186  matrix.resumeFill();
4187  matrix.setAllValues(localMatrix);
4188  matrix.expertStaticFillComplete(matrix.getDomainMap(), matrix.getRangeMap());
4189  }
4190 }
4191 
4192 } // namespace Tpetra
4193 
4201 #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&#39;s state is sane; throw if it&#39;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 > &params=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&#39;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&#39;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&#39;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 > &params)
Fill data into the local graph and matrix.
void resumeFill(const Teuchos::RCP< Teuchos::ParameterList > &params=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&#39;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&#39;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 > &params)
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 > &params=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 > &params=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 > &params=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&#39; 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&#39;s graph, as a RowGraph.
CombineMode
Rule for combining data in an Import or Export.
Sum new values.
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 > &params) 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&#39; 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 > &params=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&#39;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 > &params=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 > &params=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&#39; 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&#39;s or matrix&#39;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&#39;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.