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  using mag_type = typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
457 
460 
463  using local_graph_host_type = typename crs_graph_type::local_graph_host_type;
464 
468  KokkosSparse::CrsMatrix<impl_scalar_type,
470  device_type,
471  void,
472  typename local_graph_device_type::size_type>;
473 #if KOKKOS_VERSION >= 40799
474  using local_matrix_host_type =
475  typename local_matrix_device_type::host_mirror_type;
476 #else
477  using local_matrix_host_type =
478  typename local_matrix_device_type::HostMirror;
479 #endif
480 
481  using row_ptrs_device_view_type =
482  typename row_matrix_type::row_ptrs_device_view_type;
483  using row_ptrs_host_view_type =
484  typename row_matrix_type::row_ptrs_host_view_type;
485 
486  using local_inds_device_view_type =
487  typename row_matrix_type::local_inds_device_view_type;
488  using local_inds_host_view_type =
489  typename row_matrix_type::local_inds_host_view_type;
490  using nonconst_local_inds_host_view_type =
491  typename row_matrix_type::nonconst_local_inds_host_view_type;
492 
493  using global_inds_device_view_type =
494  typename row_matrix_type::global_inds_device_view_type;
495  using global_inds_host_view_type =
496  typename row_matrix_type::global_inds_host_view_type;
497  using nonconst_global_inds_host_view_type =
498  typename row_matrix_type::nonconst_global_inds_host_view_type;
499 
500  using values_device_view_type =
501  typename row_matrix_type::values_device_view_type;
502  using values_host_view_type =
503  typename row_matrix_type::values_host_view_type;
504  using nonconst_values_host_view_type =
505  typename row_matrix_type::nonconst_values_host_view_type;
506 
508 
510 
512  CrsMatrix(const CrsMatrix<Scalar, LocalOrdinal,
513  GlobalOrdinal, Node>&) = default;
514 
516  CrsMatrix(CrsMatrix<Scalar, LocalOrdinal,
517  GlobalOrdinal, Node>&&) = default;
518 
520  CrsMatrix&
521  operator=(const CrsMatrix<Scalar, LocalOrdinal,
522  GlobalOrdinal, Node>&) = default;
523 
525  CrsMatrix&
526  operator=(CrsMatrix<Scalar, LocalOrdinal,
527  GlobalOrdinal, Node>&&) = default;
528 
542  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
543  const size_t maxNumEntriesPerRow,
544  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
545 
558  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
559  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
560  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
561 
580  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
581  const Teuchos::RCP<const map_type>& colMap,
582  const size_t maxNumEntPerRow,
583  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
584 
603  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
604  const Teuchos::RCP<const map_type>& colMap,
605  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
606  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
607 
637  const Teuchos::RCP<const crs_graph_type>& graph,
638  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
639 
664  explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
665  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
666 
695  explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
696  const typename local_matrix_device_type::values_type& values,
697  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
698 
725  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
726  const Teuchos::RCP<const map_type>& colMap,
727  const typename local_graph_device_type::row_map_type& rowPointers,
728  const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
729  const typename local_matrix_device_type::values_type& values,
730  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
731 
758  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
759  const Teuchos::RCP<const map_type>& colMap,
760  const Teuchos::ArrayRCP<size_t>& rowPointers,
761  const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
762  const Teuchos::ArrayRCP<Scalar>& values,
763  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
764 
786  CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
787  const Teuchos::RCP<const map_type>& colMap,
788  const local_matrix_device_type& lclMatrix,
789  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
790 
821  CrsMatrix(const local_matrix_device_type& lclMatrix,
822  const Teuchos::RCP<const map_type>& rowMap,
823  const Teuchos::RCP<const map_type>& colMap,
824  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
825  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
826  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
827 
832  CrsMatrix(const local_matrix_device_type& lclMatrix,
833  const Teuchos::RCP<const map_type>& rowMap,
834  const Teuchos::RCP<const map_type>& colMap,
835  const Teuchos::RCP<const map_type>& domainMap,
836  const Teuchos::RCP<const map_type>& rangeMap,
837  const Teuchos::RCP<const import_type>& importer,
838  const Teuchos::RCP<const export_type>& exporter,
839  const Teuchos::RCP<Teuchos::ParameterList>& params =
840  Teuchos::null);
841 
843  // This function in 'Copy' mode is only guaranteed to work correctly for matrices
844  // which are fillComplete.
846  const Teuchos::DataAccess copyOrView);
847 
857  virtual ~CrsMatrix() = default;
858 
859  // This friend declaration makes the clone() method work.
860  template <class S2, class LO2, class GO2, class N2>
861  friend class CrsMatrix;
862 
863  // This friend declaration allows for fused residual calculation
864  template <class S2, class LO2, class GO2, class N2>
865  friend void Details::residual(const Operator<S2, LO2, GO2, N2>& A,
869 
870  // This friend declaration allows for batching of apply calls
871  template <class MatrixArray, class MultiVectorArray>
872  friend void batchedApply(const MatrixArray& Matrices,
873  const typename std::remove_pointer<typename MultiVectorArray::value_type>::type& X,
874  MultiVectorArray& Y,
875  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
876  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
877  Teuchos::RCP<Teuchos::ParameterList> params);
878 
879  public:
881 
883 
907  //
949  void
950  insertGlobalValues(const GlobalOrdinal globalRow,
951  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
952  const Teuchos::ArrayView<const Scalar>& vals);
953 
968  void
969  insertGlobalValues(const GlobalOrdinal globalRow,
970  const LocalOrdinal numEnt,
971  const Scalar vals[],
972  const GlobalOrdinal inds[]);
973 
1016  void
1017  insertLocalValues(const LocalOrdinal localRow,
1018  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1019  const Teuchos::ArrayView<const Scalar>& vals,
1020  const CombineMode CM = ADD);
1021 
1041  void
1042  insertLocalValues(const LocalOrdinal localRow,
1043  const LocalOrdinal numEnt,
1044  const Scalar vals[],
1045  const LocalOrdinal cols[],
1046  const CombineMode CM = ADD);
1047 
1048  protected:
1059  virtual LocalOrdinal
1061  const crs_graph_type& graph,
1062  const RowInfo& rowInfo,
1063  const GlobalOrdinal inds[],
1064  const impl_scalar_type newVals[],
1065  const LocalOrdinal numElts);
1066 
1067  public:
1106  const global_ordinal_type globalRow,
1107  const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1108  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1109 
1112  LocalOrdinal
1113  replaceGlobalValues(const GlobalOrdinal globalRow,
1114  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1115  const Teuchos::ArrayView<const Scalar>& vals);
1116 
1131  LocalOrdinal
1132  replaceGlobalValues(const GlobalOrdinal globalRow,
1133  const LocalOrdinal numEnt,
1134  const Scalar vals[],
1135  const GlobalOrdinal cols[]);
1136 
1137  protected:
1148  virtual LocalOrdinal
1150  const crs_graph_type& graph,
1151  const RowInfo& rowInfo,
1152  const LocalOrdinal inds[],
1153  const impl_scalar_type newVals[],
1154  const LocalOrdinal numElts);
1155 
1156  public:
1194  const local_ordinal_type localRow,
1195  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1196  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1197 
1201  LocalOrdinal
1202  replaceLocalValues(const LocalOrdinal localRow,
1203  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1204  const Teuchos::ArrayView<const Scalar>& vals);
1205 
1223  LocalOrdinal
1224  replaceLocalValues(const LocalOrdinal localRow,
1225  const LocalOrdinal numEnt,
1226  const Scalar inputVals[],
1227  const LocalOrdinal inputCols[]);
1228 
1229  private:
1234  static const bool useAtomicUpdatesByDefault =
1235 #ifdef KOKKOS_ENABLE_SERIAL
1236  !std::is_same<execution_space, Kokkos::Serial>::value;
1237 #else
1238  true;
1239 #endif // KOKKOS_ENABLE_SERIAL
1240 
1264  protected:
1265  virtual LocalOrdinal
1267  const crs_graph_type& graph,
1268  const RowInfo& rowInfo,
1269  const GlobalOrdinal inds[],
1270  const impl_scalar_type newVals[],
1271  const LocalOrdinal numElts,
1272  const bool atomic = useAtomicUpdatesByDefault);
1273 
1274  public:
1311  LocalOrdinal
1312  sumIntoGlobalValues(const GlobalOrdinal globalRow,
1313  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1314  const Teuchos::ArrayView<const Scalar>& vals,
1315  const bool atomic = useAtomicUpdatesByDefault);
1316 
1339  LocalOrdinal
1340  sumIntoGlobalValues(const GlobalOrdinal globalRow,
1341  const LocalOrdinal numEnt,
1342  const Scalar vals[],
1343  const GlobalOrdinal cols[],
1344  const bool atomic = useAtomicUpdatesByDefault);
1345 
1346  protected:
1359  virtual LocalOrdinal
1361  const crs_graph_type& graph,
1362  const RowInfo& rowInfo,
1363  const LocalOrdinal inds[],
1364  const impl_scalar_type newVals[],
1365  const LocalOrdinal numElts,
1366  const bool atomic = useAtomicUpdatesByDefault);
1367 
1368  public:
1407  const local_ordinal_type localRow,
1408  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1409  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1410  const bool atomic = useAtomicUpdatesByDefault);
1411 
1441  LocalOrdinal
1442  sumIntoLocalValues(const LocalOrdinal localRow,
1443  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1444  const Teuchos::ArrayView<const Scalar>& vals,
1445  const bool atomic = useAtomicUpdatesByDefault);
1446 
1468  LocalOrdinal
1469  sumIntoLocalValues(const LocalOrdinal localRow,
1470  const LocalOrdinal numEnt,
1471  const Scalar vals[],
1472  const LocalOrdinal cols[],
1473  const bool atomic = useAtomicUpdatesByDefault);
1474 
1475  private:
1506  LocalOrdinal
1507  transformLocalValues(impl_scalar_type rowVals[],
1508  const crs_graph_type& graph,
1509  const RowInfo& rowInfo,
1510  const LocalOrdinal inds[],
1511  const impl_scalar_type newVals[],
1512  const LocalOrdinal numElts,
1513  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1514  const bool atomic = useAtomicUpdatesByDefault);
1515 
1546  LocalOrdinal
1547  transformGlobalValues(impl_scalar_type rowVals[],
1548  const crs_graph_type& graph,
1549  const RowInfo& rowInfo,
1550  const GlobalOrdinal inds[],
1551  const impl_scalar_type newVals[],
1552  const LocalOrdinal numElts,
1553  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1554  const bool atomic = useAtomicUpdatesByDefault);
1555 
1582  LocalOrdinal
1583  transformLocalValues(const LocalOrdinal lclRow,
1584  const LocalOrdinal numInputEnt,
1585  const impl_scalar_type inputVals[],
1586  const LocalOrdinal inputCols[],
1587  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1588  const bool atomic = useAtomicUpdatesByDefault);
1589 
1616  LocalOrdinal
1617  transformGlobalValues(const GlobalOrdinal gblRow,
1618  const LocalOrdinal numInputEnt,
1619  const impl_scalar_type inputVals[],
1620  const GlobalOrdinal inputCols[],
1621  std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1622  const bool atomic = useAtomicUpdatesByDefault);
1623 
1624  public:
1668  template <class LocalIndicesViewType,
1669  class ImplScalarViewType,
1670  class BinaryFunction>
1671  LocalOrdinal
1672  transformLocalValues(const LocalOrdinal lclRow,
1673  const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1674  const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1675  BinaryFunction f,
1676  const bool atomic = useAtomicUpdatesByDefault) {
1677  // We use static_assert here to check the template parameters,
1678  // rather than std::enable_if (e.g., on the return value, to
1679  // enable compilation only if the template parameters match the
1680  // desired attributes). This turns obscure link errors into
1681  // clear compilation errors. It also makes the return value a
1682  // lot easier to see.
1683  static_assert(Kokkos::is_view<LocalIndicesViewType>::value,
1684  "First template parameter LocalIndicesViewType must be "
1685  "a Kokkos::View.");
1686  static_assert(Kokkos::is_view<ImplScalarViewType>::value,
1687  "Second template parameter ImplScalarViewType must be a "
1688  "Kokkos::View.");
1689  static_assert(static_cast<int>(LocalIndicesViewType::rank) == 1,
1690  "First template parameter LocalIndicesViewType must "
1691  "have rank 1.");
1692  static_assert(static_cast<int>(ImplScalarViewType::rank) == 1,
1693  "Second template parameter ImplScalarViewType must have "
1694  "rank 1.");
1695  static_assert(std::is_same<
1696  typename LocalIndicesViewType::non_const_value_type,
1697  local_ordinal_type>::value,
1698  "First template parameter LocalIndicesViewType must "
1699  "contain values of type local_ordinal_type.");
1700  static_assert(std::is_same<
1701  typename ImplScalarViewType::non_const_value_type,
1702  impl_scalar_type>::value,
1703  "Second template parameter ImplScalarViewType must "
1704  "contain values of type impl_scalar_type.");
1705  typedef LocalOrdinal LO;
1706  const LO numInputEnt = inputInds.extent(0);
1707  if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1708  return Teuchos::OrdinalTraits<LO>::invalid();
1709  }
1710  return this->transformLocalValues(lclRow,
1711  numInputEnt,
1712  inputVals.data(),
1713  inputInds.data(),
1714  f,
1715  atomic);
1716  }
1717 
1759  template <class BinaryFunction, class InputMemorySpace>
1760  LocalOrdinal
1761  transformGlobalValues(const GlobalOrdinal gblRow,
1762  const Kokkos::View<const GlobalOrdinal*,
1763  InputMemorySpace,
1764  Kokkos::MemoryUnmanaged>& inputInds,
1765  const Kokkos::View<const impl_scalar_type*,
1766  InputMemorySpace,
1767  Kokkos::MemoryUnmanaged>& inputVals,
1768  BinaryFunction f,
1769  const bool atomic = useAtomicUpdatesByDefault) {
1770  typedef LocalOrdinal LO;
1771  const LO numInputEnt = inputInds.extent(0);
1772  if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1773  return Teuchos::OrdinalTraits<LO>::invalid();
1774  }
1775  return this->transformGlobalValues(gblRow,
1776  numInputEnt,
1777  inputVals.data(),
1778  inputInds.data(),
1779  f,
1780  atomic);
1781  }
1782 
1784  void setAllToScalar(const Scalar& alpha);
1785 
1787  void scale(const Scalar& alpha);
1788 
1813  void
1814  setAllValues(const typename local_graph_device_type::row_map_type& ptr,
1815  const typename local_graph_device_type::entries_type::non_const_type& ind,
1816  const typename local_matrix_device_type::values_type& val);
1817 
1838  void
1839  setAllValues(const local_matrix_device_type& localMatrix);
1840 
1865  void
1866  setAllValues(const Teuchos::ArrayRCP<size_t>& ptr,
1867  const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1868  const Teuchos::ArrayRCP<Scalar>& val);
1869 
1871  row_ptrs_host_view_type getLocalRowPtrsHost() const { return getCrsGraph()->getLocalRowPtrsHost(); }
1872 
1874  row_ptrs_device_view_type getLocalRowPtrsDevice() const { return getCrsGraph()->getLocalRowPtrsDevice(); }
1875 
1877  local_inds_host_view_type getLocalIndicesHost() const { return getCrsGraph()->getLocalIndicesHost(); }
1878 
1880  local_inds_device_view_type getLocalIndicesDevice() const { return getCrsGraph()->getLocalIndicesDevice(); }
1881 
1883 
1885 
1914  void globalAssemble();
1915 
1929  void resumeFill(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1930 
1988  void
1989  fillComplete(const Teuchos::RCP<const map_type>& domainMap,
1990  const Teuchos::RCP<const map_type>& rangeMap,
1991  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1992 
2019  void
2020  fillComplete(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2021 
2048  void
2049  expertStaticFillComplete(const Teuchos::RCP<const map_type>& domainMap,
2050  const Teuchos::RCP<const map_type>& rangeMap,
2051  const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2052  const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2053  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2054 
2072  void
2073  replaceColMap(const Teuchos::RCP<const map_type>& newColMap);
2074 
2156  void
2157  reindexColumns(crs_graph_type* const graph,
2158  const Teuchos::RCP<const map_type>& newColMap,
2159  const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2160  const bool sortEachRow = true);
2161 
2171  void
2172  replaceDomainMap(const Teuchos::RCP<const map_type>& newDomainMap);
2173 
2187  void
2188  replaceDomainMapAndImporter(const Teuchos::RCP<const map_type>& newDomainMap,
2189  Teuchos::RCP<const import_type>& newImporter);
2190 
2200  void
2201  replaceRangeMap(const Teuchos::RCP<const map_type>& newRangeMap);
2202 
2216  void
2217  replaceRangeMapAndExporter(const Teuchos::RCP<const map_type>& newRangeMap,
2218  Teuchos::RCP<const export_type>& newExporter);
2219 
2233  virtual void
2234  removeEmptyProcessesInPlace(const Teuchos::RCP<const map_type>& newMap) override;
2235 
2237 
2239 
2241  Teuchos::RCP<const Teuchos::Comm<int> > getComm() const override;
2242 
2244  Teuchos::RCP<const map_type> getRowMap() const override;
2245 
2247  Teuchos::RCP<const map_type> getColMap() const override;
2248 
2250  Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2251  getGraph() const override;
2252 
2254  Teuchos::RCP<const crs_graph_type> getCrsGraph() const;
2255 
2256  private:
2267  const crs_graph_type& getCrsGraphRef() const;
2268 
2269  public:
2270 #if __armclang_major__ == 22 && __armclang_minor__ == 1
2271  // On Stria, PR 13052 caused a 25% performance regression in the
2272  // CGSolve performance test that is fixed by forcing
2273  // getLocalMatrixDevice to always be inlined. Restrict the fix
2274  // to the specific toolchain where the problem was observed
2275 #define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2276 #else
2277 #define TPETRA_DETAILS_ALWAYS_INLINE
2278 #endif
2279  TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type
2292  getLocalMatrixDevice() const;
2293  local_matrix_host_type getLocalMatrixHost() const;
2294 #undef TPETRA_DETAILS_ALWAYS_INLINE
2295 
2315  global_size_t getGlobalNumRows() const override;
2316 
2322  global_size_t getGlobalNumCols() const override;
2323 
2330  size_t getLocalNumRows() const override;
2331 
2335  size_t getLocalNumCols() const override;
2336 
2338  GlobalOrdinal getIndexBase() const override;
2339 
2341  global_size_t getGlobalNumEntries() const override;
2342 
2344  size_t getLocalNumEntries() const override;
2345 
2352  size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const override;
2353 
2360  size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const override;
2361 
2369  size_t getGlobalMaxNumRowEntries() const override;
2370 
2378  size_t getLocalMaxNumRowEntries() const override;
2379 
2381  virtual LocalOrdinal getBlockSize() const override { return 1; }
2382 
2384  bool hasColMap() const override;
2385 
2406  bool isLocallyIndexed() const override;
2407 
2428  bool isGloballyIndexed() const override;
2429 
2452  bool isFillComplete() const override;
2453 
2476  bool isFillActive() const;
2477 
2479 
2485  bool isStorageOptimized() const;
2486 
2488  bool isStaticGraph() const;
2489 
2497  mag_type getNormInf() const;
2498 
2502  //
2508  mag_type getNorm1(bool assumeSymmetric = false) const;
2509 
2517  mag_type getFrobeniusNorm() const override;
2518 
2521  virtual bool supportsRowViews() const override;
2522 
2523  protected:
2524  using values_dualv_type =
2525  Kokkos::DualView<impl_scalar_type*, device_type>;
2526  using values_wdv_type =
2528  values_wdv_type valuesUnpacked_wdv;
2529  mutable values_wdv_type valuesPacked_wdv;
2530 
2531  public:
2580  void
2581  getGlobalRowCopy(GlobalOrdinal GlobalRow,
2582  nonconst_global_inds_host_view_type& Indices,
2583  nonconst_values_host_view_type& Values,
2584  size_t& NumEntries) const override;
2600  void
2601  getLocalRowCopy(LocalOrdinal LocalRow,
2602  nonconst_local_inds_host_view_type& Indices,
2603  nonconst_values_host_view_type& Values,
2604  size_t& NumEntries) const override;
2605 
2618 
2619  void
2620  getGlobalRowView(GlobalOrdinal GlobalRow,
2621  global_inds_host_view_type& indices,
2622  values_host_view_type& values) const override;
2623 
2636  void
2637  getLocalRowView(LocalOrdinal LocalRow,
2638  local_inds_host_view_type& indices,
2639  values_host_view_type& values) const override;
2640 
2648 
2655  void
2657 
2701  void getLocalDiagOffsets(Teuchos::ArrayRCP<size_t>& offsets) const;
2702 
2724  void
2726  const Kokkos::View<const size_t*, device_type,
2727  Kokkos::MemoryUnmanaged>& offsets) const;
2728 
2751  void
2753  const Teuchos::ArrayView<const size_t>& offsets) const;
2754 
2759  void
2761 
2766  void
2768 
2770 
2772 
2834  void
2837  const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2838  const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one(),
2839  const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero()) const;
2840 
2843  template <class T>
2844  Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2845  convert() const;
2846 
2848 
2850 
2861  void
2864  Teuchos::ETransp mode = Teuchos::NO_TRANS,
2865  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2866  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const override;
2867 
2870  bool hasTransposeApply() const override;
2871 
2878  Teuchos::RCP<const map_type> getDomainMap() const override;
2879 
2886  Teuchos::RCP<const map_type> getRangeMap() const override;
2887 
2889 
2891 
2902  virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2903  add(const Scalar& alpha,
2905  const Scalar& beta,
2906  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap,
2907  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap,
2908  const Teuchos::RCP<Teuchos::ParameterList>& params) const override;
2909 
2911 
2913 
2915  std::string description() const override;
2916 
2919  void
2920  describe(Teuchos::FancyOStream& out,
2921  const Teuchos::EVerbosityLevel verbLevel =
2922  Teuchos::Describable::verbLevel_default) const override;
2923 
2925 
2927 
2932  typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2934 
2935  virtual bool
2936  checkSizes(const SrcDistObject& source) override;
2937 
2938  void
2939  applyCrsPadding(
2940  const typename crs_graph_type::padding_type& padding,
2941  const bool verbose);
2942 
2943  private:
2944  void
2945  copyAndPermuteStaticGraph(
2947  const size_t numSameIDs,
2948  const LocalOrdinal permuteToLIDs[],
2949  const LocalOrdinal permuteFromLIDs[],
2950  const size_t numPermutes);
2951 
2952  void
2953  copyAndPermuteNonStaticGraph(
2955  const size_t numSameIDs,
2956  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2957  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2958  const size_t numPermutes);
2959 
2960  protected:
2961  using dist_object_type::
2963 
2965  virtual void
2966  copyAndPermute(const SrcDistObject& source,
2967  const size_t numSameIDs,
2968  const Kokkos::DualView<
2969  const local_ordinal_type*,
2970  buffer_device_type>& permuteToLIDs,
2971  const Kokkos::DualView<
2972  const local_ordinal_type*,
2973  buffer_device_type>& permuteFromLIDs,
2974  const CombineMode CM) override;
2975 
2976  virtual void
2977  packAndPrepare(const SrcDistObject& source,
2978  const Kokkos::DualView<
2979  const local_ordinal_type*,
2980  buffer_device_type>& exportLIDs,
2981  Kokkos::DualView<char*, buffer_device_type>& exports,
2982  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2983  size_t& constantNumPackets) override;
2984 
2986 
2990  private:
2993  void
2994  unpackAndCombineImpl(
2995  const Kokkos::DualView<const local_ordinal_type*,
2996  buffer_device_type>& importLIDs,
2997  Kokkos::DualView<char*, buffer_device_type> imports,
2998  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2999  const size_t constantNumPackets,
3000  const CombineMode combineMode,
3001  const bool verbose);
3002 
3005  void
3006  unpackAndCombineImplNonStatic(
3007  const Kokkos::DualView<const local_ordinal_type*,
3008  buffer_device_type>& importLIDs,
3009  Kokkos::DualView<char*, buffer_device_type> imports,
3010  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3011  const size_t constantNumPackets,
3012  const CombineMode combineMode);
3013 
3014  public:
3024  void
3025  unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3026  Kokkos::DualView<char*, buffer_device_type> imports,
3027  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3028  const size_t constantNumPackets,
3029  const CombineMode CM) override;
3030 
3032 
3141  void
3142  packNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3143  Kokkos::DualView<char*, buffer_device_type>& exports,
3144  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3145  size_t& constantNumPackets) const;
3146 
3147  private:
3154  void
3155  packNonStaticNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3156  Kokkos::DualView<char*, buffer_device_type>& exports,
3157  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3158  size_t& constantNumPackets) const;
3159 
3189  size_t
3190  packRow(char exports[],
3191  const size_t offset,
3192  const size_t numEnt,
3193  const GlobalOrdinal gidsIn[],
3194  const impl_scalar_type valsIn[],
3195  const size_t numBytesPerValue) const;
3196 
3220  bool
3221  packRowStatic(char* const numEntOut,
3222  char* const valOut,
3223  char* const indOut,
3224  const size_t numEnt,
3225  const LocalOrdinal lclRow) const;
3226 
3252  size_t
3253  unpackRow(GlobalOrdinal gidsOut[],
3254  impl_scalar_type valsOut[],
3255  const char imports[],
3256  const size_t offset,
3257  const size_t numBytes,
3258  const size_t numEnt,
3259  const size_t numBytesPerValue);
3260 
3269  void
3270  allocatePackSpaceNew(Kokkos::DualView<char*, buffer_device_type>& exports,
3271  size_t& totalNumEntries,
3272  const Kokkos::DualView<const local_ordinal_type*,
3273  buffer_device_type>& exportLIDs) const;
3275 
3276  public:
3278  typename local_matrix_host_type::values_type::const_type
3279  getLocalValuesHost(Access::ReadOnlyStruct s) const {
3280  return valuesPacked_wdv.getHostView(s);
3281  }
3282 
3284  typename local_matrix_host_type::values_type
3285  getLocalValuesHost(Access::ReadWriteStruct s) {
3286  return valuesPacked_wdv.getHostView(s);
3287  }
3288 
3290  typename local_matrix_host_type::values_type
3291  getLocalValuesHost(Access::OverwriteAllStruct s) {
3292  return valuesPacked_wdv.getHostView(s);
3293  }
3294 
3296  typename local_matrix_device_type::values_type::const_type
3297  getLocalValuesDevice(Access::ReadOnlyStruct s) const {
3298  return valuesPacked_wdv.getDeviceView(s);
3299  }
3300 
3302  typename local_matrix_device_type::values_type
3303  getLocalValuesDevice(Access::ReadWriteStruct s) {
3304  return valuesPacked_wdv.getDeviceView(s);
3305  }
3306 
3308  typename local_matrix_device_type::values_type
3309  getLocalValuesDevice(Access::OverwriteAllStruct s) {
3310  return valuesPacked_wdv.getDeviceView(s);
3311  }
3312 
3313  private:
3314  // Friend declaration for nonmember function.
3315  template <class CrsMatrixType>
3316  friend Teuchos::RCP<CrsMatrixType>
3317  Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3318  const Import<typename CrsMatrixType::local_ordinal_type,
3319  typename CrsMatrixType::global_ordinal_type,
3320  typename CrsMatrixType::node_type>& importer,
3321  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3322  typename CrsMatrixType::global_ordinal_type,
3323  typename CrsMatrixType::node_type> >& domainMap,
3324  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3325  typename CrsMatrixType::global_ordinal_type,
3326  typename CrsMatrixType::node_type> >& rangeMap,
3327  const Teuchos::RCP<Teuchos::ParameterList>& params);
3328 
3329  // Friend declaration for nonmember function.
3330  template <class CrsMatrixType>
3331  friend Teuchos::RCP<CrsMatrixType>
3332  Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3333  const Import<typename CrsMatrixType::local_ordinal_type,
3334  typename CrsMatrixType::global_ordinal_type,
3335  typename CrsMatrixType::node_type>& rowImporter,
3336  const Import<typename CrsMatrixType::local_ordinal_type,
3337  typename CrsMatrixType::global_ordinal_type,
3338  typename CrsMatrixType::node_type>& domainImporter,
3339  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3340  typename CrsMatrixType::global_ordinal_type,
3341  typename CrsMatrixType::node_type> >& domainMap,
3342  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3343  typename CrsMatrixType::global_ordinal_type,
3344  typename CrsMatrixType::node_type> >& rangeMap,
3345  const Teuchos::RCP<Teuchos::ParameterList>& params);
3346 
3347  // Friend declaration for nonmember function.
3348  template <class CrsMatrixType>
3349  friend Teuchos::RCP<CrsMatrixType>
3350  Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3351  const Export<typename CrsMatrixType::local_ordinal_type,
3352  typename CrsMatrixType::global_ordinal_type,
3353  typename CrsMatrixType::node_type>& exporter,
3354  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3355  typename CrsMatrixType::global_ordinal_type,
3356  typename CrsMatrixType::node_type> >& domainMap,
3357  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3358  typename CrsMatrixType::global_ordinal_type,
3359  typename CrsMatrixType::node_type> >& rangeMap,
3360  const Teuchos::RCP<Teuchos::ParameterList>& params);
3361 
3362  // Friend declaration for nonmember function.
3363  template <class CrsMatrixType>
3364  friend Teuchos::RCP<CrsMatrixType>
3365  Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3366  const Export<typename CrsMatrixType::local_ordinal_type,
3367  typename CrsMatrixType::global_ordinal_type,
3368  typename CrsMatrixType::node_type>& rowExporter,
3369  const Export<typename CrsMatrixType::local_ordinal_type,
3370  typename CrsMatrixType::global_ordinal_type,
3371  typename CrsMatrixType::node_type>& domainExporter,
3372  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3373  typename CrsMatrixType::global_ordinal_type,
3374  typename CrsMatrixType::node_type> >& domainMap,
3375  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3376  typename CrsMatrixType::global_ordinal_type,
3377  typename CrsMatrixType::node_type> >& rangeMap,
3378  const Teuchos::RCP<Teuchos::ParameterList>& params);
3379 
3380  public:
3396  void
3398  const import_type& importer,
3399  const Teuchos::RCP<const map_type>& domainMap,
3400  const Teuchos::RCP<const map_type>& rangeMap,
3401  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3402 
3418  void
3420  const import_type& rowImporter,
3421  const import_type& domainImporter,
3422  const Teuchos::RCP<const map_type>& domainMap,
3423  const Teuchos::RCP<const map_type>& rangeMap,
3424  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3425 
3441  void
3443  const export_type& exporter,
3444  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3445  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3446  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3447 
3463  void
3465  const export_type& rowExporter,
3466  const export_type& domainExporter,
3467  const Teuchos::RCP<const map_type>& domainMap,
3468  const Teuchos::RCP<const map_type>& rangeMap,
3469  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3470 
3471  private:
3492  void
3493  transferAndFillComplete(Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& destMatrix,
3494  const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3495  const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> >& domainTransfer,
3496  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3497  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3498  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3499 
3511  protected:
3512  virtual void
3514  RowInfo& rowInfo,
3515  const GlobalOrdinal gblColInds[],
3516  const impl_scalar_type vals[],
3517  const size_t numInputEnt);
3518 
3519  private:
3529  void
3530  insertGlobalValuesFiltered(
3531  const GlobalOrdinal globalRow,
3532  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3533  const Teuchos::ArrayView<const Scalar>& values,
3534  const bool debug);
3535 
3538  void
3539  insertGlobalValuesFilteredChecked(
3540  const GlobalOrdinal globalRow,
3541  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3542  const Teuchos::ArrayView<const Scalar>& values,
3543  const char* const prefix,
3544  const bool debug,
3545  const bool verbose);
3546 
3558  void
3559  combineGlobalValues(
3560  const GlobalOrdinal globalRowIndex,
3561  const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3562  const Teuchos::ArrayView<const Scalar>& values,
3563  const Tpetra::CombineMode combineMode,
3564  const char* const prefix,
3565  const bool debug,
3566  const bool verbose);
3567 
3589  LocalOrdinal
3590  combineGlobalValuesRaw(const LocalOrdinal lclRow,
3591  const LocalOrdinal numEnt,
3592  const impl_scalar_type vals[],
3593  const GlobalOrdinal cols[],
3594  const Tpetra::CombineMode combineMode,
3595  const char* const prefix,
3596  const bool debug,
3597  const bool verbose);
3598 
3610  template <class BinaryFunction>
3611  LocalOrdinal
3612  transformGlobalValues(const GlobalOrdinal globalRow,
3613  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3614  const Teuchos::ArrayView<const Scalar>& values,
3615  BinaryFunction f,
3616  const bool atomic = useAtomicUpdatesByDefault) {
3617  typedef impl_scalar_type IST;
3618  typedef LocalOrdinal LO;
3619  typedef GlobalOrdinal GO;
3620 
3621  const LO numInputEnt = static_cast<LO>(indices.size());
3622  if (static_cast<LO>(values.size()) != numInputEnt) {
3623  return Teuchos::OrdinalTraits<LO>::invalid();
3624  }
3625 
3626  const GO* const inputCols = indices.getRawPtr();
3627  const IST* const inputVals =
3628  reinterpret_cast<const IST*>(values.getRawPtr());
3629  return this->transformGlobalValues(globalRow, numInputEnt, inputVals,
3630  inputCols, f, atomic);
3631  }
3632 
3639  void
3640  insertNonownedGlobalValues(const GlobalOrdinal globalRow,
3641  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3642  const Teuchos::ArrayView<const Scalar>& values);
3643 
3686  void
3687  insertIndicesAndValues(crs_graph_type& graph,
3688  RowInfo& rowInfo,
3689  const typename crs_graph_type::SLocalGlobalViews& newInds,
3690  const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3691  const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3692  const ELocalGlobal lg,
3693  const ELocalGlobal I);
3694 
3695  protected:
3696  // useful typedefs
3697  typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3698  typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3699  typedef Kokkos::ArithTraits<mag_type> STM;
3700  typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3701  typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3702  typedef crs_graph_type Graph;
3703 
3704  // Enums
3705  enum GraphAllocationStatus {
3706  GraphAlreadyAllocated,
3707  GraphNotYetAllocated
3708  };
3709 
3710  protected:
3729  void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas,
3730  const bool verbose);
3731 
3742  static size_t
3743  mergeRowIndicesAndValues(size_t rowLen, local_ordinal_type* cols, impl_scalar_type* vals);
3744 
3759  void
3760  sortAndMergeIndicesAndValues(const bool sorted,
3761  const bool merged);
3762 
3763  public:
3765  bool haveGlobalConstants() const;
3766 
3767  protected:
3780  mutable Teuchos::RCP<MV> importMV_;
3781 
3794  mutable Teuchos::RCP<MV> exportMV_;
3795 
3815  Teuchos::RCP<MV>
3816  getColumnMapMultiVector(const MV& X_domainMap,
3817  const bool force = false) const;
3818 
3840  Teuchos::RCP<MV>
3841  getRowMapMultiVector(const MV& Y_rangeMap,
3842  const bool force = false) const;
3843 
3845  void
3846  applyNonTranspose(const MV& X_in,
3847  MV& Y_in,
3848  Scalar alpha,
3849  Scalar beta) const;
3850 
3852  void
3853  applyTranspose(const MV& X_in,
3854  MV& Y_in,
3855  const Teuchos::ETransp mode,
3856  Scalar alpha,
3857  Scalar beta) const;
3858 
3859  // matrix data accessors
3860 
3863  typename values_dualv_type::t_host::const_type
3864  getValuesViewHost(const RowInfo& rowinfo) const;
3865 
3868  typename values_dualv_type::t_dev::const_type
3869  getValuesViewDevice(const RowInfo& rowinfo) const;
3870 
3873  typename values_dualv_type::t_host
3874  getValuesViewHostNonConst(const RowInfo& rowinfo);
3875 
3878  typename values_dualv_type::t_dev
3879  getValuesViewDeviceNonConst(const RowInfo& rowinfo);
3880 
3881  private:
3882  // TODO: When KokkosKernels 4.4 is released, local_matrix_device_type can be permanently modified to use the default_size_type
3883  // 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).
3884  //
3885  // At that point the ApplyHelper can be replaced with just a SPMVHandle.
3886  using local_matrix_int_rowptrs_device_type =
3887  KokkosSparse::CrsMatrix<impl_scalar_type,
3889  device_type,
3890  void,
3891  int>;
3892 
3896  local_matrix_int_rowptrs_device_type,
3898 
3899  std::shared_ptr<ApplyHelper> getApplyHelper() const {
3900  if (!applyHelper) {
3901  auto A_lcl = getLocalMatrixDevice();
3902  applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3903  }
3904  return applyHelper;
3905  }
3906 
3907  protected:
3908  // Friend the tester for CrsMatrix::swap
3909  friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3910 
3911  // Friend the matrix multiply kernels so they can access internally-cached integer
3912  // row pointers without making them part of the CrsMatrix interface
3913  template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3914  friend struct Tpetra::MMdetails::KernelWrappers;
3915  template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3916  friend struct Tpetra::MMdetails::KernelWrappers2;
3917 
3918  // friend Matrix Matrix utility function that needs to access integer-typed rowptrs
3919  friend void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3920  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3921  Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3922  CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3923  Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3924  bool userAssertsThereAreNoRemotes,
3925  const std::string& label,
3926  const Teuchos::RCP<Teuchos::ParameterList>& params);
3927 
3931  void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& matrix);
3932 
3933  protected:
3939  void fillLocalMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3940 
3946  void fillLocalGraphAndMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3947 
3949  void checkInternalState() const;
3950 
3962 
3963  Teuchos::RCP<const Graph> staticGraph_;
3964  Teuchos::RCP<Graph> myGraph_;
3966 
3967  protected:
3978  Details::STORAGE_1D_UNPACKED;
3979 
3981  bool fillComplete_ = false;
3982 
4010  std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4011  Teuchos::Array<Scalar> > >
4013 
4014  private:
4020  mutable std::shared_ptr<ApplyHelper> applyHelper;
4021 
4022  public:
4023  // FIXME (mfh 24 Feb 2014) Is it _really_ necessary to make this a
4024  // public inner class of CrsMatrix? It looks like it doesn't
4025  // depend on any implementation details of CrsMatrix at all. It
4026  // should really be declared and defined outside of CrsMatrix.
4027  template <class DestViewType, class SrcViewType,
4028  class DestOffsetViewType, class SrcOffsetViewType>
4029  struct pack_functor {
4030  typedef typename DestViewType::execution_space execution_space;
4031  SrcViewType src_;
4032  DestViewType dst_;
4033  SrcOffsetViewType src_offset_;
4034  DestOffsetViewType dst_offset_;
4035  typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4036 
4037  pack_functor(DestViewType dst,
4038  const SrcViewType src,
4039  DestOffsetViewType dst_offset,
4040  const SrcOffsetViewType src_offset)
4041  : src_(src)
4042  , dst_(dst)
4043  , src_offset_(src_offset)
4044  , dst_offset_(dst_offset) {}
4045 
4046  KOKKOS_INLINE_FUNCTION
4047  void operator()(const LocalOrdinal row) const {
4048  scalar_index_type srcPos = src_offset_(row);
4049  const scalar_index_type dstEnd = dst_offset_(row + 1);
4050  scalar_index_type dstPos = dst_offset_(row);
4051  for (; dstPos < dstEnd; ++dstPos, ++srcPos) {
4052  dst_(dstPos) = src_(srcPos);
4053  }
4054  }
4055  };
4056 }; // class CrsMatrix
4057 
4062 template <class Scalar,
4063  class LocalOrdinal,
4064  class GlobalOrdinal,
4065  class Node>
4066 Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4068  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map,
4069  const size_t maxNumEntriesPerRow = 0,
4070  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
4071  using matrix_type =
4073  return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow,
4074  params));
4075 }
4076 
4077 template <class CrsMatrixType>
4078 Teuchos::RCP<CrsMatrixType>
4079 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4080  const Import<typename CrsMatrixType::local_ordinal_type,
4081  typename CrsMatrixType::global_ordinal_type,
4082  typename CrsMatrixType::node_type>& importer,
4083  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4084  typename CrsMatrixType::global_ordinal_type,
4085  typename CrsMatrixType::node_type> >& domainMap,
4086  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4087  typename CrsMatrixType::global_ordinal_type,
4088  typename CrsMatrixType::node_type> >& rangeMap,
4089  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4090  Teuchos::RCP<CrsMatrixType> destMatrix;
4091  sourceMatrix->importAndFillComplete(destMatrix, importer, domainMap, rangeMap, params);
4092  return destMatrix;
4093 }
4094 
4095 template <class CrsMatrixType>
4096 Teuchos::RCP<CrsMatrixType>
4097 importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4098  const Import<typename CrsMatrixType::local_ordinal_type,
4099  typename CrsMatrixType::global_ordinal_type,
4100  typename CrsMatrixType::node_type>& rowImporter,
4101  const Import<typename CrsMatrixType::local_ordinal_type,
4102  typename CrsMatrixType::global_ordinal_type,
4103  typename CrsMatrixType::node_type>& domainImporter,
4104  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4105  typename CrsMatrixType::global_ordinal_type,
4106  typename CrsMatrixType::node_type> >& domainMap,
4107  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4108  typename CrsMatrixType::global_ordinal_type,
4109  typename CrsMatrixType::node_type> >& rangeMap,
4110  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4111  Teuchos::RCP<CrsMatrixType> destMatrix;
4112  sourceMatrix->importAndFillComplete(destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4113  return destMatrix;
4114 }
4115 
4116 template <class CrsMatrixType>
4117 Teuchos::RCP<CrsMatrixType>
4118 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4119  const Export<typename CrsMatrixType::local_ordinal_type,
4120  typename CrsMatrixType::global_ordinal_type,
4121  typename CrsMatrixType::node_type>& exporter,
4122  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4123  typename CrsMatrixType::global_ordinal_type,
4124  typename CrsMatrixType::node_type> >& domainMap,
4125  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4126  typename CrsMatrixType::global_ordinal_type,
4127  typename CrsMatrixType::node_type> >& rangeMap,
4128  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4129  Teuchos::RCP<CrsMatrixType> destMatrix;
4130  sourceMatrix->exportAndFillComplete(destMatrix, exporter, domainMap, rangeMap, params);
4131  return destMatrix;
4132 }
4133 
4134 template <class CrsMatrixType>
4135 Teuchos::RCP<CrsMatrixType>
4136 exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4137  const Export<typename CrsMatrixType::local_ordinal_type,
4138  typename CrsMatrixType::global_ordinal_type,
4139  typename CrsMatrixType::node_type>& rowExporter,
4140  const Export<typename CrsMatrixType::local_ordinal_type,
4141  typename CrsMatrixType::global_ordinal_type,
4142  typename CrsMatrixType::node_type>& domainExporter,
4143  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4144  typename CrsMatrixType::global_ordinal_type,
4145  typename CrsMatrixType::node_type> >& domainMap,
4146  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4147  typename CrsMatrixType::global_ordinal_type,
4148  typename CrsMatrixType::node_type> >& rangeMap,
4149  const Teuchos::RCP<Teuchos::ParameterList>& params) {
4150  Teuchos::RCP<CrsMatrixType> destMatrix;
4151  sourceMatrix->exportAndFillComplete(destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4152  return destMatrix;
4153 }
4154 
4161 template <class CrsMatrixType>
4162 void removeCrsMatrixZeros(CrsMatrixType& matrix,
4163  typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType const& threshold =
4164  Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude(Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero())) {
4165  auto localMatrix = matrix.getLocalMatrixDevice();
4166  size_t nnzBefore = localMatrix.nnz();
4167  localMatrix = KokkosSparse::removeCrsMatrixZeros(localMatrix, threshold);
4168  size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4169  // Skip the expertStaticFillComplete if no entries were removed on any process.
4170  // The fill complete can perform MPI collectives, so it can only be skipped on all processes or none.
4171  size_t globalNNZRemoved = 0;
4172  Teuchos::reduceAll<int, size_t>(*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4173  if (globalNNZRemoved != size_t(0)) {
4174  matrix.resumeFill();
4175  matrix.setAllValues(localMatrix);
4176  matrix.expertStaticFillComplete(matrix.getDomainMap(), matrix.getRangeMap());
4177  }
4178 }
4179 
4180 } // namespace Tpetra
4181 
4189 #endif // TPETRA_CRSMATRIX_DECL_HPP
CrsMatrix & operator=(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assignment.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
KokkosSparse::StaticCrsGraph< local_ordinal_type, Kokkos::LayoutLeft, device_type, void, size_t > local_graph_device_type
The type of the part of the sparse graph on each MPI process.
void checkInternalState() const
Check that this object&#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.