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 // clang-format off
11 #ifndef TPETRA_CRSMATRIX_DECL_HPP
12 #define TPETRA_CRSMATRIX_DECL_HPP
13 
16 
17 #include "Tpetra_CrsMatrix_fwd.hpp"
19 #include "KokkosSparse_Utils.hpp"
20 #include "KokkosSparse_CrsMatrix.hpp"
21 #include "Tpetra_Details_MatrixApplyHelper.hpp"
22 #include "Tpetra_RowMatrix_decl.hpp"
23 #include "Tpetra_Exceptions.hpp"
24 #include "Tpetra_DistObject.hpp"
25 #include "Tpetra_CrsGraph.hpp"
26 #include "Tpetra_Vector.hpp"
27 #include "Tpetra_Details_PackTraits.hpp" // unused here, could delete
28 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
29 #include "Teuchos_DataAccess.hpp"
30 
31 
32 #include <memory> // std::shared_ptr
33 
34 namespace Tpetra {
35 
36  // Forward declaration for CrsMatrix::swap() test
37  template<class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node> class crsMatrix_Swap_Tester;
38 
90  template<class CrsMatrixType>
91  Teuchos::RCP<CrsMatrixType>
92  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
93  const Import<typename CrsMatrixType::local_ordinal_type,
94  typename CrsMatrixType::global_ordinal_type,
95  typename CrsMatrixType::node_type>& importer,
96  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
97  typename CrsMatrixType::global_ordinal_type,
98  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
99  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
100  typename CrsMatrixType::global_ordinal_type,
101  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
102  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
103 
157  template<class CrsMatrixType>
158  Teuchos::RCP<CrsMatrixType>
159  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
160  const Import<typename CrsMatrixType::local_ordinal_type,
161  typename CrsMatrixType::global_ordinal_type,
162  typename CrsMatrixType::node_type>& rowImporter,
163  const Import<typename CrsMatrixType::local_ordinal_type,
164  typename CrsMatrixType::global_ordinal_type,
165  typename CrsMatrixType::node_type>& domainImporter,
166  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
167  typename CrsMatrixType::global_ordinal_type,
168  typename CrsMatrixType::node_type> >& domainMap,
169  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
170  typename CrsMatrixType::global_ordinal_type,
171  typename CrsMatrixType::node_type> >& rangeMap,
172  const Teuchos::RCP<Teuchos::ParameterList>& params);
173 
207  template<class CrsMatrixType>
208  Teuchos::RCP<CrsMatrixType>
209  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
210  const Export<typename CrsMatrixType::local_ordinal_type,
211  typename CrsMatrixType::global_ordinal_type,
212  typename CrsMatrixType::node_type>& exporter,
213  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
214  typename CrsMatrixType::global_ordinal_type,
215  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
216  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
217  typename CrsMatrixType::global_ordinal_type,
218  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
219  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
220 
254  template<class CrsMatrixType>
255  Teuchos::RCP<CrsMatrixType>
256  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
257  const Export<typename CrsMatrixType::local_ordinal_type,
258  typename CrsMatrixType::global_ordinal_type,
259  typename CrsMatrixType::node_type>& rowExporter,
260  const Export<typename CrsMatrixType::local_ordinal_type,
261  typename CrsMatrixType::global_ordinal_type,
262  typename CrsMatrixType::node_type>& domainExporter,
263  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
264  typename CrsMatrixType::global_ordinal_type,
265  typename CrsMatrixType::node_type> >& domainMap,
266  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
267  typename CrsMatrixType::global_ordinal_type,
268  typename CrsMatrixType::node_type> >& rangeMap,
269  const Teuchos::RCP<Teuchos::ParameterList>& params);
270 
273  namespace Details {
274  template<class SC, class LO, class GO, class NO>
275  void residual(const Operator<SC,LO,GO,NO> & A,
276  const MultiVector<SC,LO,GO,NO> & X,
277  const MultiVector<SC,LO,GO,NO> & B,
278  MultiVector<SC,LO,GO,NO> & R);
279  }
280 
394  template <class Scalar,
395  class LocalOrdinal,
396  class GlobalOrdinal,
397  class Node>
398  class CrsMatrix :
399  public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
400  public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
401  public Details::Spaces::User
402  {
403  // clang-format on
404 private:
405  using dist_object_type =
406  DistObject<char, LocalOrdinal, GlobalOrdinal,
407  Node>;
408  // clang-format off
410 
411  public:
413 
414 
416  using scalar_type = Scalar;
418  using local_ordinal_type = LocalOrdinal;
420  using global_ordinal_type = GlobalOrdinal;
422  using device_type = typename Node::device_type;
424  using execution_space = typename device_type::execution_space;
426  using memory_space = typename device_type::memory_space;
427 
432  using node_type = Node;
433 
436 
439 
442 
445 
461  using mag_type = typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
462 
465 
468  using local_graph_host_type = typename crs_graph_type::local_graph_host_type;
469 
473  KokkosSparse::CrsMatrix<impl_scalar_type,
475  device_type,
476  void,
477  typename local_graph_device_type::size_type>;
478  using local_matrix_host_type =
479  typename local_matrix_device_type::HostMirror;
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 
487  using local_inds_device_view_type =
488  typename row_matrix_type::local_inds_device_view_type;
489  using local_inds_host_view_type =
490  typename row_matrix_type::local_inds_host_view_type;
491  using nonconst_local_inds_host_view_type =
492  typename row_matrix_type::nonconst_local_inds_host_view_type;
493 
494  using global_inds_device_view_type =
495  typename row_matrix_type::global_inds_device_view_type;
496  using global_inds_host_view_type =
497  typename row_matrix_type::global_inds_host_view_type;
498  using nonconst_global_inds_host_view_type =
499  typename row_matrix_type::nonconst_global_inds_host_view_type;
500 
501  using values_device_view_type =
502  typename row_matrix_type::values_device_view_type;
503  using values_host_view_type =
504  typename row_matrix_type::values_host_view_type;
505  using nonconst_values_host_view_type =
506  typename row_matrix_type::nonconst_values_host_view_type;
507 
509 
511 
513  CrsMatrix (const CrsMatrix<Scalar, LocalOrdinal,
514  GlobalOrdinal, Node>&) = default;
515 
517  CrsMatrix (CrsMatrix<Scalar, LocalOrdinal,
518  GlobalOrdinal, Node>&&) = default;
519 
521  CrsMatrix&
522  operator= (const CrsMatrix<Scalar, LocalOrdinal,
523  GlobalOrdinal, Node>&) = default;
524 
526  CrsMatrix&
527  operator= (CrsMatrix<Scalar, LocalOrdinal,
528  GlobalOrdinal, Node>&&) = default;
529 
543  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
544  const size_t maxNumEntriesPerRow,
545  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
546 
559  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
560  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
561  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
562 
563 
582  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
583  const Teuchos::RCP<const map_type>& colMap,
584  const size_t maxNumEntPerRow,
585  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
586 
605  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
606  const Teuchos::RCP<const map_type>& colMap,
607  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
608  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
609 
639  const Teuchos::RCP<const crs_graph_type>& graph,
640  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
641 
666  explicit CrsMatrix (const Teuchos::RCP<const crs_graph_type>& graph,
667  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
668 
697  explicit CrsMatrix (const Teuchos::RCP<const crs_graph_type>& graph,
698  const typename local_matrix_device_type::values_type& values,
699  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
700 
727  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
728  const Teuchos::RCP<const map_type>& colMap,
729  const typename local_graph_device_type::row_map_type& rowPointers,
730  const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
731  const typename local_matrix_device_type::values_type& values,
732  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
733 
760  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
761  const Teuchos::RCP<const map_type>& colMap,
762  const Teuchos::ArrayRCP<size_t>& rowPointers,
763  const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
764  const Teuchos::ArrayRCP<Scalar>& values,
765  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
766 
788  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
789  const Teuchos::RCP<const map_type>& colMap,
790  const local_matrix_device_type& lclMatrix,
791  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
792 
823  CrsMatrix (const local_matrix_device_type& lclMatrix,
824  const Teuchos::RCP<const map_type>& rowMap,
825  const Teuchos::RCP<const map_type>& colMap,
826  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
827  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
828  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
829 
834  CrsMatrix (const local_matrix_device_type& lclMatrix,
835  const Teuchos::RCP<const map_type>& rowMap,
836  const Teuchos::RCP<const map_type>& colMap,
837  const Teuchos::RCP<const map_type>& domainMap,
838  const Teuchos::RCP<const map_type>& rangeMap,
839  const Teuchos::RCP<const import_type>& importer,
840  const Teuchos::RCP<const export_type>& exporter,
841  const Teuchos::RCP<Teuchos::ParameterList>& params =
842  Teuchos::null);
843 
845  // This function in 'Copy' mode is only guaranteed to work correctly for matrices
846  // which are fillComplete.
848  const Teuchos::DataAccess copyOrView);
849 
859  virtual ~CrsMatrix () = default;
860 
861  // This friend declaration makes the clone() method work.
862  template <class S2, class LO2, class GO2, class N2>
863  friend class CrsMatrix;
864 
865  // This friend declaration allows for fused residual calculation
866  template <class S2, class LO2, class GO2, class N2>
867  friend void Details::residual(const Operator<S2,LO2,GO2,N2> & A,
868  const MultiVector<S2,LO2,GO2,N2> & X,
869  const MultiVector<S2,LO2,GO2,N2> & B,
871 
872  // This friend declaration allows for batching of apply calls
873  template <class MatrixArray, class MultiVectorArray>
874  friend void batchedApply(const MatrixArray &Matrices,
875  const typename std::remove_pointer<typename MultiVectorArray::value_type>::type & X,
876  MultiVectorArray &Y,
877  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
878  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
879  Teuchos::RCP<Teuchos::ParameterList> params);
880 
881  public:
883 
885 
909  //
951  void
952  insertGlobalValues (const GlobalOrdinal globalRow,
953  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
954  const Teuchos::ArrayView<const Scalar>& vals);
955 
970  void
971  insertGlobalValues (const GlobalOrdinal globalRow,
972  const LocalOrdinal numEnt,
973  const Scalar vals[],
974  const GlobalOrdinal inds[]);
975 
1018  void
1019  insertLocalValues (const LocalOrdinal localRow,
1020  const Teuchos::ArrayView<const LocalOrdinal> &cols,
1021  const Teuchos::ArrayView<const Scalar> &vals,
1022  const CombineMode CM=ADD);
1023 
1043  void
1044  insertLocalValues (const LocalOrdinal localRow,
1045  const LocalOrdinal numEnt,
1046  const Scalar vals[],
1047  const LocalOrdinal cols[],
1048  const CombineMode CM=ADD);
1049 
1050  protected:
1061  virtual LocalOrdinal
1063  const crs_graph_type& graph,
1064  const RowInfo& rowInfo,
1065  const GlobalOrdinal inds[],
1066  const impl_scalar_type newVals[],
1067  const LocalOrdinal numElts);
1068 
1069  public:
1108  const global_ordinal_type globalRow,
1109  const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1110  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1111 
1114  LocalOrdinal
1115  replaceGlobalValues (const GlobalOrdinal globalRow,
1116  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1117  const Teuchos::ArrayView<const Scalar>& vals);
1118 
1133  LocalOrdinal
1134  replaceGlobalValues (const GlobalOrdinal globalRow,
1135  const LocalOrdinal numEnt,
1136  const Scalar vals[],
1137  const GlobalOrdinal cols[]);
1138 
1139  protected:
1150  virtual LocalOrdinal
1152  const crs_graph_type& graph,
1153  const RowInfo& rowInfo,
1154  const LocalOrdinal inds[],
1155  const impl_scalar_type newVals[],
1156  const LocalOrdinal numElts);
1157 
1158  public:
1196  const local_ordinal_type localRow,
1197  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1198  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1199 
1203  LocalOrdinal
1204  replaceLocalValues (const LocalOrdinal localRow,
1205  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1206  const Teuchos::ArrayView<const Scalar>& vals);
1207 
1225  LocalOrdinal
1226  replaceLocalValues (const LocalOrdinal localRow,
1227  const LocalOrdinal numEnt,
1228  const Scalar inputVals[],
1229  const LocalOrdinal inputCols[]);
1230 
1231  private:
1236  static const bool useAtomicUpdatesByDefault =
1237 #ifdef KOKKOS_ENABLE_SERIAL
1238  ! std::is_same<execution_space, Kokkos::Serial>::value;
1239 #else
1240  true;
1241 #endif // KOKKOS_ENABLE_SERIAL
1242 
1266  protected:
1267  virtual LocalOrdinal
1269  const crs_graph_type& graph,
1270  const RowInfo& rowInfo,
1271  const GlobalOrdinal inds[],
1272  const impl_scalar_type newVals[],
1273  const LocalOrdinal numElts,
1274  const bool atomic = useAtomicUpdatesByDefault);
1275 
1276  public:
1313  LocalOrdinal
1314  sumIntoGlobalValues (const GlobalOrdinal globalRow,
1315  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1316  const Teuchos::ArrayView<const Scalar>& vals,
1317  const bool atomic = useAtomicUpdatesByDefault);
1318 
1341  LocalOrdinal
1342  sumIntoGlobalValues (const GlobalOrdinal globalRow,
1343  const LocalOrdinal numEnt,
1344  const Scalar vals[],
1345  const GlobalOrdinal cols[],
1346  const bool atomic = useAtomicUpdatesByDefault);
1347 
1348  protected:
1361  virtual LocalOrdinal
1363  const crs_graph_type& graph,
1364  const RowInfo& rowInfo,
1365  const LocalOrdinal inds[],
1366  const impl_scalar_type newVals[],
1367  const LocalOrdinal numElts,
1368  const bool atomic = useAtomicUpdatesByDefault);
1369 
1370  public:
1409  const local_ordinal_type localRow,
1410  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1411  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1412  const bool atomic = useAtomicUpdatesByDefault);
1413 
1443  LocalOrdinal
1444  sumIntoLocalValues (const LocalOrdinal localRow,
1445  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1446  const Teuchos::ArrayView<const Scalar>& vals,
1447  const bool atomic = useAtomicUpdatesByDefault);
1448 
1470  LocalOrdinal
1471  sumIntoLocalValues (const LocalOrdinal localRow,
1472  const LocalOrdinal numEnt,
1473  const Scalar vals[],
1474  const LocalOrdinal cols[],
1475  const bool atomic = useAtomicUpdatesByDefault);
1476 
1477  private:
1508  LocalOrdinal
1509  transformLocalValues (impl_scalar_type rowVals[],
1510  const crs_graph_type& graph,
1511  const RowInfo& rowInfo,
1512  const LocalOrdinal inds[],
1513  const impl_scalar_type newVals[],
1514  const LocalOrdinal numElts,
1515  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1516  const bool atomic = useAtomicUpdatesByDefault);
1517 
1548  LocalOrdinal
1549  transformGlobalValues (impl_scalar_type rowVals[],
1550  const crs_graph_type& graph,
1551  const RowInfo& rowInfo,
1552  const GlobalOrdinal inds[],
1553  const impl_scalar_type newVals[],
1554  const LocalOrdinal numElts,
1555  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1556  const bool atomic = useAtomicUpdatesByDefault);
1557 
1584  LocalOrdinal
1585  transformLocalValues (const LocalOrdinal lclRow,
1586  const LocalOrdinal numInputEnt,
1587  const impl_scalar_type inputVals[],
1588  const LocalOrdinal inputCols[],
1589  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1590  const bool atomic = useAtomicUpdatesByDefault);
1591 
1618  LocalOrdinal
1619  transformGlobalValues (const GlobalOrdinal gblRow,
1620  const LocalOrdinal numInputEnt,
1621  const impl_scalar_type inputVals[],
1622  const GlobalOrdinal inputCols[],
1623  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1624  const bool atomic = useAtomicUpdatesByDefault);
1625 
1626  public:
1670  template<class LocalIndicesViewType,
1671  class ImplScalarViewType,
1672  class BinaryFunction>
1673  LocalOrdinal
1674  transformLocalValues (const LocalOrdinal lclRow,
1675  const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1676  const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1677  BinaryFunction f,
1678  const bool atomic = useAtomicUpdatesByDefault)
1679  {
1680  // We use static_assert here to check the template parameters,
1681  // rather than std::enable_if (e.g., on the return value, to
1682  // enable compilation only if the template parameters match the
1683  // desired attributes). This turns obscure link errors into
1684  // clear compilation errors. It also makes the return value a
1685  // lot easier to see.
1686  static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1687  "First template parameter LocalIndicesViewType must be "
1688  "a Kokkos::View.");
1689  static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1690  "Second template parameter ImplScalarViewType must be a "
1691  "Kokkos::View.");
1692  static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1693  "First template parameter LocalIndicesViewType must "
1694  "have rank 1.");
1695  static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1696  "Second template parameter ImplScalarViewType must have "
1697  "rank 1.");
1698  static_assert (std::is_same<
1699  typename LocalIndicesViewType::non_const_value_type,
1700  local_ordinal_type>::value,
1701  "First template parameter LocalIndicesViewType must "
1702  "contain values of type local_ordinal_type.");
1703  static_assert (std::is_same<
1704  typename ImplScalarViewType::non_const_value_type,
1705  impl_scalar_type>::value,
1706  "Second template parameter ImplScalarViewType must "
1707  "contain values of type impl_scalar_type.");
1708  typedef LocalOrdinal LO;
1709  const LO numInputEnt = inputInds.extent (0);
1710  if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1711  return Teuchos::OrdinalTraits<LO>::invalid ();
1712  }
1713  return this->transformLocalValues (lclRow,
1714  numInputEnt,
1715  inputVals.data (),
1716  inputInds.data (),
1717  f,
1718  atomic);
1719  }
1720 
1762  template<class BinaryFunction, class InputMemorySpace>
1763  LocalOrdinal
1764  transformGlobalValues (const GlobalOrdinal gblRow,
1765  const Kokkos::View<const GlobalOrdinal*,
1766  InputMemorySpace,
1767  Kokkos::MemoryUnmanaged>& inputInds,
1768  const Kokkos::View<const impl_scalar_type*,
1769  InputMemorySpace,
1770  Kokkos::MemoryUnmanaged>& inputVals,
1771  BinaryFunction f,
1772  const bool atomic = useAtomicUpdatesByDefault)
1773  {
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
1876  { return getCrsGraph()->getLocalRowPtrsHost(); }
1877 
1879  row_ptrs_device_view_type getLocalRowPtrsDevice () const
1880  { return getCrsGraph()->getLocalRowPtrsDevice(); }
1881 
1883  local_inds_host_view_type getLocalIndicesHost () const
1884  { return getCrsGraph()->getLocalIndicesHost(); }
1885 
1887  local_inds_device_view_type getLocalIndicesDevice () const
1888  { return getCrsGraph()->getLocalIndicesDevice(); }
1889 
1891 
1893 
1922  void globalAssemble();
1923 
1937  void resumeFill (const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1938 
1996  void
1997  fillComplete (const Teuchos::RCP<const map_type>& domainMap,
1998  const Teuchos::RCP<const map_type>& rangeMap,
1999  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2000 
2027  void
2028  fillComplete (const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2029 
2056  void
2057  expertStaticFillComplete (const Teuchos::RCP<const map_type>& domainMap,
2058  const Teuchos::RCP<const map_type>& rangeMap,
2059  const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2060  const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2061  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2062 
2080  void
2081  replaceColMap (const Teuchos::RCP<const map_type>& newColMap);
2082 
2164  void
2165  reindexColumns (crs_graph_type* const graph,
2166  const Teuchos::RCP<const map_type>& newColMap,
2167  const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2168  const bool sortEachRow = true);
2169 
2179  void
2180  replaceDomainMap (const Teuchos::RCP<const map_type>& newDomainMap);
2181 
2195  void
2196  replaceDomainMapAndImporter (const Teuchos::RCP<const map_type>& newDomainMap,
2197  Teuchos::RCP<const import_type>& newImporter);
2198 
2208  void
2209  replaceRangeMap (const Teuchos::RCP<const map_type>& newRangeMap);
2210 
2224  void
2225  replaceRangeMapAndExporter (const Teuchos::RCP<const map_type>& newRangeMap,
2226  Teuchos::RCP<const export_type>& newExporter);
2227 
2241  virtual void
2242  removeEmptyProcessesInPlace (const Teuchos::RCP<const map_type>& newMap) override;
2243 
2245 
2247 
2249  Teuchos::RCP<const Teuchos::Comm<int> > getComm() const override;
2250 
2251 
2253  Teuchos::RCP<const map_type> getRowMap () const override;
2254 
2256  Teuchos::RCP<const map_type> getColMap () const override;
2257 
2259  Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2260  getGraph () const override;
2261 
2263  Teuchos::RCP<const crs_graph_type> getCrsGraph () const;
2264 
2265  private:
2276  const crs_graph_type& getCrsGraphRef () const;
2277 
2278  public:
2279 #if __armclang_major__ == 22 && __armclang_minor__ == 1
2280  // On Stria, PR 13052 caused a 25% performance regression in the
2281  // CGSolve performance test that is fixed by forcing
2282  // getLocalMatrixDevice to always be inlined. Restrict the fix
2283  // to the specific toolchain where the problem was observed
2284 #define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2285 #else
2286 #define TPETRA_DETAILS_ALWAYS_INLINE
2287 #endif
2288  TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type
2301  getLocalMatrixDevice () const;
2302  local_matrix_host_type getLocalMatrixHost () const;
2303 #undef TPETRA_DETAILS_ALWAYS_INLINE
2304 
2324  global_size_t getGlobalNumRows() const override;
2325 
2331  global_size_t getGlobalNumCols() const override;
2332 
2339  size_t getLocalNumRows() const override;
2340 
2344  size_t getLocalNumCols() const override;
2345 
2347  GlobalOrdinal getIndexBase() const override;
2348 
2350  global_size_t getGlobalNumEntries() const override;
2351 
2353  size_t getLocalNumEntries() const override;
2354 
2361  size_t getNumEntriesInGlobalRow (GlobalOrdinal globalRow) const override;
2362 
2369  size_t getNumEntriesInLocalRow (local_ordinal_type localRow) const override;
2370 
2378  size_t getGlobalMaxNumRowEntries () const override;
2379 
2387  size_t getLocalMaxNumRowEntries () const override;
2388 
2390  virtual LocalOrdinal getBlockSize () const override { return 1; }
2391 
2393  bool hasColMap () const override;
2394 
2395 
2416  bool isLocallyIndexed() const override;
2417 
2438  bool isGloballyIndexed() const override;
2439 
2462  bool isFillComplete() const override;
2463 
2486  bool isFillActive() const;
2487 
2489 
2495  bool isStorageOptimized () const;
2496 
2498  bool isStaticGraph () const;
2499 
2507  mag_type getNormInf () const;
2508 
2512  //
2518  mag_type getNorm1 (bool assumeSymmetric = false) const;
2519 
2527  mag_type getFrobeniusNorm () const override;
2528 
2531  virtual bool supportsRowViews () const override;
2532 
2533 protected:
2534  using values_dualv_type =
2535  Kokkos::DualView<impl_scalar_type*, device_type>;
2536  using values_wdv_type =
2538  values_wdv_type valuesUnpacked_wdv;
2539  mutable values_wdv_type valuesPacked_wdv;
2540 
2541 public:
2542 
2591  void
2592  getGlobalRowCopy (GlobalOrdinal GlobalRow,
2593  nonconst_global_inds_host_view_type &Indices,
2594  nonconst_values_host_view_type &Values,
2595  size_t& NumEntries) const override;
2611  void
2612  getLocalRowCopy (LocalOrdinal LocalRow,
2613  nonconst_local_inds_host_view_type &Indices,
2614  nonconst_values_host_view_type &Values,
2615  size_t& NumEntries) const override;
2616 
2629 
2630  void
2631  getGlobalRowView (GlobalOrdinal GlobalRow,
2632  global_inds_host_view_type &indices,
2633  values_host_view_type &values) const override;
2634 
2647  void
2648  getLocalRowView(LocalOrdinal LocalRow,
2649  local_inds_host_view_type &indices,
2650  values_host_view_type &values) const override;
2651 
2659 
2666  void
2668 
2712  void getLocalDiagOffsets (Teuchos::ArrayRCP<size_t>& offsets) const;
2713 
2735  void
2737  const Kokkos::View<const size_t*, device_type,
2738  Kokkos::MemoryUnmanaged>& offsets) const;
2739 
2762  void
2764  const Teuchos::ArrayView<const size_t>& offsets) const;
2765 
2770  void
2772 
2777  void
2779 
2781 
2783 
2845  void
2848  const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2849  const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one (),
2850  const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero ()) const;
2851 
2854  template <class T>
2855  Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2856  convert () const;
2857 
2859 
2861 
2872  void
2875  Teuchos::ETransp mode = Teuchos::NO_TRANS,
2876  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2877  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const override;
2878 
2881  bool hasTransposeApply () const override;
2882 
2889  Teuchos::RCP<const map_type> getDomainMap () const override;
2890 
2897  Teuchos::RCP<const map_type> getRangeMap () const override;
2898 
2900 
2902 
2913  virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2914  add (const Scalar& alpha,
2916  const Scalar& beta,
2917  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap,
2918  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap,
2919  const Teuchos::RCP<Teuchos::ParameterList>& params) const override;
2920 
2922 
2924 
2926  std::string description () const override;
2927 
2930  void
2931  describe (Teuchos::FancyOStream& out,
2932  const Teuchos::EVerbosityLevel verbLevel =
2933  Teuchos::Describable::verbLevel_default) const override;
2934 
2936 
2938 
2943  typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2945 
2946  virtual bool
2947  checkSizes (const SrcDistObject& source) override;
2948 
2949  void
2950  applyCrsPadding(
2951  const typename crs_graph_type::padding_type& padding,
2952  const bool verbose);
2953 
2954  private:
2955  void
2956  copyAndPermuteStaticGraph(
2958  const size_t numSameIDs,
2959  const LocalOrdinal permuteToLIDs[],
2960  const LocalOrdinal permuteFromLIDs[],
2961  const size_t numPermutes);
2962 
2963  void
2964  copyAndPermuteNonStaticGraph(
2966  const size_t numSameIDs,
2967  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2968  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2969  const size_t numPermutes);
2970 
2971  protected:
2972 
2973  // clang-format on
2974  using dist_object_type::
2976  // clang-format off
2978 
2979  virtual void
2981  (const SrcDistObject& source,
2982  const size_t numSameIDs,
2983  const Kokkos::DualView<
2984  const local_ordinal_type*,
2985  buffer_device_type>& permuteToLIDs,
2986  const Kokkos::DualView<
2987  const local_ordinal_type*,
2988  buffer_device_type>& permuteFromLIDs,
2989  const CombineMode CM) override;
2990 
2991  virtual void
2992  packAndPrepare
2993  (const SrcDistObject& source,
2994  const Kokkos::DualView<
2995  const local_ordinal_type*,
2996  buffer_device_type>& exportLIDs,
2997  Kokkos::DualView<char*, buffer_device_type>& exports,
2998  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2999  size_t& constantNumPackets) override;
3000 
3001  // clang-format on
3003  // clang-format off
3007 
3008  private:
3011  void
3012  unpackAndCombineImpl(
3013  const Kokkos::DualView<const local_ordinal_type*,
3014  buffer_device_type>& importLIDs,
3015  Kokkos::DualView<char*, buffer_device_type> imports,
3016  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3017  const size_t constantNumPackets,
3018  const CombineMode combineMode,
3019  const bool verbose);
3020 
3023  void
3024  unpackAndCombineImplNonStatic(
3025  const Kokkos::DualView<const local_ordinal_type*,
3026  buffer_device_type>& importLIDs,
3027  Kokkos::DualView<char*, buffer_device_type> imports,
3028  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3029  const size_t constantNumPackets,
3030  const CombineMode combineMode);
3031 
3032  public:
3042  void
3044  (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3045  Kokkos::DualView<char*, buffer_device_type> imports,
3046  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3047  const size_t constantNumPackets,
3048  const CombineMode CM) override;
3049 
3050  // clang-format on
3052  // clang-format off
3056 
3162  void
3163  packNew (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3164  Kokkos::DualView<char*, buffer_device_type>& exports,
3165  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3166  size_t& constantNumPackets) const;
3167 
3168  private:
3175  void
3176  packNonStaticNew (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3177  Kokkos::DualView<char*, buffer_device_type>& exports,
3178  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3179  size_t& constantNumPackets) const;
3180 
3210  size_t
3211  packRow (char exports[],
3212  const size_t offset,
3213  const size_t numEnt,
3214  const GlobalOrdinal gidsIn[],
3215  const impl_scalar_type valsIn[],
3216  const size_t numBytesPerValue) const;
3217 
3241  bool
3242  packRowStatic (char* const numEntOut,
3243  char* const valOut,
3244  char* const indOut,
3245  const size_t numEnt,
3246  const LocalOrdinal lclRow) const;
3247 
3273  size_t
3274  unpackRow (GlobalOrdinal gidsOut[],
3275  impl_scalar_type valsOut[],
3276  const char imports[],
3277  const size_t offset,
3278  const size_t numBytes,
3279  const size_t numEnt,
3280  const size_t numBytesPerValue);
3281 
3290  void
3291  allocatePackSpaceNew (Kokkos::DualView<char*, buffer_device_type>& exports,
3292  size_t& totalNumEntries,
3293  const Kokkos::DualView<const local_ordinal_type*,
3294  buffer_device_type>& exportLIDs) const;
3296 
3297  public:
3299  typename local_matrix_host_type::values_type::const_type
3300  getLocalValuesHost (Access::ReadOnlyStruct s) const
3301  {
3302  return valuesPacked_wdv.getHostView(s);
3303  }
3304 
3306  typename local_matrix_host_type::values_type
3307  getLocalValuesHost (Access::ReadWriteStruct s)
3308  {
3309  return valuesPacked_wdv.getHostView(s);
3310  }
3311 
3313  typename local_matrix_host_type::values_type
3314  getLocalValuesHost (Access::OverwriteAllStruct s)
3315  {
3316  return valuesPacked_wdv.getHostView(s);
3317  }
3318 
3320  typename local_matrix_device_type::values_type::const_type
3321  getLocalValuesDevice (Access::ReadOnlyStruct s) const
3322  {
3323  return valuesPacked_wdv.getDeviceView(s);
3324  }
3325 
3327  typename local_matrix_device_type::values_type
3328  getLocalValuesDevice (Access::ReadWriteStruct s)
3329  {
3330  return valuesPacked_wdv.getDeviceView(s);
3331  }
3332 
3334  typename local_matrix_device_type::values_type
3335  getLocalValuesDevice (Access::OverwriteAllStruct s)
3336  {
3337  return valuesPacked_wdv.getDeviceView(s);
3338  }
3339 
3340  private:
3341  // Friend declaration for nonmember function.
3342  template<class CrsMatrixType>
3343  friend Teuchos::RCP<CrsMatrixType>
3344  Tpetra::importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3345  const Import<typename CrsMatrixType::local_ordinal_type,
3346  typename CrsMatrixType::global_ordinal_type,
3347  typename CrsMatrixType::node_type>& importer,
3348  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3349  typename CrsMatrixType::global_ordinal_type,
3350  typename CrsMatrixType::node_type> >& domainMap,
3351  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3352  typename CrsMatrixType::global_ordinal_type,
3353  typename CrsMatrixType::node_type> >& rangeMap,
3354  const Teuchos::RCP<Teuchos::ParameterList>& params);
3355 
3356  // Friend declaration for nonmember function.
3357  template<class CrsMatrixType>
3358  friend Teuchos::RCP<CrsMatrixType>
3359  Tpetra::importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3360  const Import<typename CrsMatrixType::local_ordinal_type,
3361  typename CrsMatrixType::global_ordinal_type,
3362  typename CrsMatrixType::node_type>& rowImporter,
3363  const Import<typename CrsMatrixType::local_ordinal_type,
3364  typename CrsMatrixType::global_ordinal_type,
3365  typename CrsMatrixType::node_type>& domainImporter,
3366  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3367  typename CrsMatrixType::global_ordinal_type,
3368  typename CrsMatrixType::node_type> >& domainMap,
3369  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3370  typename CrsMatrixType::global_ordinal_type,
3371  typename CrsMatrixType::node_type> >& rangeMap,
3372  const Teuchos::RCP<Teuchos::ParameterList>& params);
3373 
3374 
3375  // Friend declaration for nonmember function.
3376  template<class CrsMatrixType>
3377  friend Teuchos::RCP<CrsMatrixType>
3378  Tpetra::exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3379  const Export<typename CrsMatrixType::local_ordinal_type,
3380  typename CrsMatrixType::global_ordinal_type,
3381  typename CrsMatrixType::node_type>& exporter,
3382  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3383  typename CrsMatrixType::global_ordinal_type,
3384  typename CrsMatrixType::node_type> >& domainMap,
3385  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3386  typename CrsMatrixType::global_ordinal_type,
3387  typename CrsMatrixType::node_type> >& rangeMap,
3388  const Teuchos::RCP<Teuchos::ParameterList>& params);
3389 
3390  // Friend declaration for nonmember function.
3391  template<class CrsMatrixType>
3392  friend Teuchos::RCP<CrsMatrixType>
3393  Tpetra::exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3394  const Export<typename CrsMatrixType::local_ordinal_type,
3395  typename CrsMatrixType::global_ordinal_type,
3396  typename CrsMatrixType::node_type>& rowExporter,
3397  const Export<typename CrsMatrixType::local_ordinal_type,
3398  typename CrsMatrixType::global_ordinal_type,
3399  typename CrsMatrixType::node_type>& domainExporter,
3400  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3401  typename CrsMatrixType::global_ordinal_type,
3402  typename CrsMatrixType::node_type> >& domainMap,
3403  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3404  typename CrsMatrixType::global_ordinal_type,
3405  typename CrsMatrixType::node_type> >& rangeMap,
3406  const Teuchos::RCP<Teuchos::ParameterList>& params);
3407 
3408  public:
3424  void
3426  const import_type& importer,
3427  const Teuchos::RCP<const map_type>& domainMap,
3428  const Teuchos::RCP<const map_type>& rangeMap,
3429  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3430 
3446  void
3448  const import_type& rowImporter,
3449  const import_type& domainImporter,
3450  const Teuchos::RCP<const map_type>& domainMap,
3451  const Teuchos::RCP<const map_type>& rangeMap,
3452  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3453 
3454 
3470  void
3472  const export_type& exporter,
3473  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3474  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3475  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3476 
3492  void
3494  const export_type& rowExporter,
3495  const export_type& domainExporter,
3496  const Teuchos::RCP<const map_type>& domainMap,
3497  const Teuchos::RCP<const map_type>& rangeMap,
3498  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3499 
3500 
3501  private:
3522  void
3523  transferAndFillComplete (Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& destMatrix,
3524  const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3525  const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> > & domainTransfer,
3526  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3527  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3528  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3529 
3541  protected:
3542  virtual void
3544  RowInfo& rowInfo,
3545  const GlobalOrdinal gblColInds[],
3546  const impl_scalar_type vals[],
3547  const size_t numInputEnt);
3548 
3549  private:
3559  void
3560  insertGlobalValuesFiltered(
3561  const GlobalOrdinal globalRow,
3562  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3563  const Teuchos::ArrayView<const Scalar>& values,
3564  const bool debug);
3565 
3568  void
3569  insertGlobalValuesFilteredChecked(
3570  const GlobalOrdinal globalRow,
3571  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3572  const Teuchos::ArrayView<const Scalar>& values,
3573  const char* const prefix,
3574  const bool debug,
3575  const bool verbose);
3576 
3588  void
3589  combineGlobalValues(
3590  const GlobalOrdinal globalRowIndex,
3591  const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3592  const Teuchos::ArrayView<const Scalar>& values,
3593  const Tpetra::CombineMode combineMode,
3594  const char* const prefix,
3595  const bool debug,
3596  const bool verbose);
3597 
3619  LocalOrdinal
3620  combineGlobalValuesRaw(const LocalOrdinal lclRow,
3621  const LocalOrdinal numEnt,
3622  const impl_scalar_type vals[],
3623  const GlobalOrdinal cols[],
3624  const Tpetra::CombineMode combineMode,
3625  const char* const prefix,
3626  const bool debug,
3627  const bool verbose);
3628 
3640  template<class BinaryFunction>
3641  LocalOrdinal
3642  transformGlobalValues (const GlobalOrdinal globalRow,
3643  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3644  const Teuchos::ArrayView<const Scalar>& values,
3645  BinaryFunction f,
3646  const bool atomic = useAtomicUpdatesByDefault)
3647  {
3648  typedef impl_scalar_type IST;
3649  typedef LocalOrdinal LO;
3650  typedef GlobalOrdinal GO;
3651 
3652  const LO numInputEnt = static_cast<LO> (indices.size ());
3653  if (static_cast<LO> (values.size ()) != numInputEnt) {
3654  return Teuchos::OrdinalTraits<LO>::invalid ();
3655  }
3656 
3657  const GO* const inputCols = indices.getRawPtr ();
3658  const IST* const inputVals =
3659  reinterpret_cast<const IST*> (values.getRawPtr ());
3660  return this->transformGlobalValues (globalRow, numInputEnt, inputVals,
3661  inputCols, f, atomic);
3662  }
3663 
3670  void
3671  insertNonownedGlobalValues (const GlobalOrdinal globalRow,
3672  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3673  const Teuchos::ArrayView<const Scalar>& values);
3674 
3717  void
3718  insertIndicesAndValues (crs_graph_type& graph,
3719  RowInfo& rowInfo,
3720  const typename crs_graph_type::SLocalGlobalViews& newInds,
3721  const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3722  const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3723  const ELocalGlobal lg,
3724  const ELocalGlobal I);
3725 
3726  protected:
3727  // useful typedefs
3728  typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3729  typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3730  typedef Kokkos::ArithTraits<mag_type> STM;
3731  typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3732  typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3733  typedef crs_graph_type Graph;
3734 
3735  // Enums
3736  enum GraphAllocationStatus {
3737  GraphAlreadyAllocated,
3738  GraphNotYetAllocated
3739  };
3740 
3741  protected:
3760  void allocateValues (ELocalGlobal lg, GraphAllocationStatus gas,
3761  const bool verbose);
3762 
3773  static size_t
3774  mergeRowIndicesAndValues (size_t rowLen, local_ordinal_type* cols, impl_scalar_type* vals);
3775 
3790  void
3791  sortAndMergeIndicesAndValues (const bool sorted,
3792  const bool merged);
3793 
3794  public:
3795 
3797  bool haveGlobalConstants() const;
3798 
3799  protected:
3812  mutable Teuchos::RCP<MV> importMV_;
3813 
3826  mutable Teuchos::RCP<MV> exportMV_;
3827 
3847  Teuchos::RCP<MV>
3848  getColumnMapMultiVector (const MV& X_domainMap,
3849  const bool force = false) const;
3850 
3872  Teuchos::RCP<MV>
3873  getRowMapMultiVector (const MV& Y_rangeMap,
3874  const bool force = false) const;
3875 
3877  void
3878  applyNonTranspose (const MV& X_in,
3879  MV& Y_in,
3880  Scalar alpha,
3881  Scalar beta) const;
3882 
3884  void
3885  applyTranspose (const MV& X_in,
3886  MV& Y_in,
3887  const Teuchos::ETransp mode,
3888  Scalar alpha,
3889  Scalar beta) const;
3890 
3891  // matrix data accessors
3892 
3895  typename values_dualv_type::t_host::const_type
3896  getValuesViewHost (const RowInfo& rowinfo) const;
3897 
3900  typename values_dualv_type::t_dev::const_type
3901  getValuesViewDevice (const RowInfo& rowinfo) const;
3902 
3905  typename values_dualv_type::t_host
3906  getValuesViewHostNonConst (const RowInfo& rowinfo);
3907 
3910  typename values_dualv_type::t_dev
3911  getValuesViewDeviceNonConst (const RowInfo& rowinfo);
3912 
3913 private:
3914  // TODO: When KokkosKernels 4.4 is released, local_matrix_device_type can be permanently modified to use the default_size_type
3915  // 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).
3916  //
3917  // At that point the ApplyHelper can be replaced with just a SPMVHandle.
3918  using local_matrix_int_rowptrs_device_type =
3919  KokkosSparse::CrsMatrix<impl_scalar_type,
3921  device_type,
3922  void,
3923  int>;
3924 
3928  local_matrix_int_rowptrs_device_type,
3930 
3931 
3932  std::shared_ptr<ApplyHelper> getApplyHelper() const {
3933  if (!applyHelper) {
3934  auto A_lcl = getLocalMatrixDevice();
3935  applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3936  }
3937  return applyHelper;
3938  }
3939 
3940  protected:
3941 
3942  // Friend the tester for CrsMatrix::swap
3943  friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3944 
3945  // Friend the matrix multiply kernels so they can access internally-cached integer
3946  // row pointers without making them part of the CrsMatrix interface
3947  template<typename S, typename LO, typename GO, typename NODE, typename LOV> friend struct Tpetra::MMdetails::KernelWrappers;
3948  template<typename S, typename LO, typename GO, typename NODE, typename LOV> friend struct Tpetra::MMdetails::KernelWrappers2;
3949 
3950 
3951  // friend Matrix Matrix utility function that needs to access integer-typed rowptrs
3952  friend
3953  void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3954  const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3955  Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3956  CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3957  Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3958  bool userAssertsThereAreNoRemotes,
3959  const std::string& label,
3960  const Teuchos::RCP<Teuchos::ParameterList>& params);
3961 
3965  void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> & matrix);
3966 
3967 
3968  protected:
3969 
3975  void fillLocalMatrix (const Teuchos::RCP<Teuchos::ParameterList>& params);
3976 
3982  void fillLocalGraphAndMatrix (const Teuchos::RCP<Teuchos::ParameterList>& params);
3983 
3985  void checkInternalState () const;
3986 
3998 
3999  Teuchos::RCP<const Graph> staticGraph_;
4000  Teuchos::RCP< Graph> myGraph_;
4002 
4003 protected:
4014  Details::STORAGE_1D_UNPACKED;
4015 
4017  bool fillComplete_ = false;
4018 
4046  std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4047  Teuchos::Array<Scalar> > > nonlocals_;
4048 
4049  private:
4055  mutable std::shared_ptr<ApplyHelper> applyHelper;
4056 
4057  public:
4058  // FIXME (mfh 24 Feb 2014) Is it _really_ necessary to make this a
4059  // public inner class of CrsMatrix? It looks like it doesn't
4060  // depend on any implementation details of CrsMatrix at all. It
4061  // should really be declared and defined outside of CrsMatrix.
4062  template<class DestViewType, class SrcViewType,
4063  class DestOffsetViewType, class SrcOffsetViewType>
4064  struct pack_functor {
4065  typedef typename DestViewType::execution_space execution_space;
4066  SrcViewType src_;
4067  DestViewType dst_;
4068  SrcOffsetViewType src_offset_;
4069  DestOffsetViewType dst_offset_;
4070  typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4071 
4072  pack_functor (DestViewType dst,
4073  const SrcViewType src,
4074  DestOffsetViewType dst_offset,
4075  const SrcOffsetViewType src_offset) :
4076  src_ (src),
4077  dst_ (dst),
4078  src_offset_ (src_offset),
4079  dst_offset_ (dst_offset)
4080  {}
4081 
4082  KOKKOS_INLINE_FUNCTION
4083  void operator () (const LocalOrdinal row) const {
4084  scalar_index_type srcPos = src_offset_(row);
4085  const scalar_index_type dstEnd = dst_offset_(row+1);
4086  scalar_index_type dstPos = dst_offset_(row);
4087  for ( ; dstPos < dstEnd; ++dstPos, ++srcPos) {
4088  dst_(dstPos) = src_(srcPos);
4089  }
4090  }
4091  };
4092  }; // class CrsMatrix
4093 
4098  template<class Scalar,
4099  class LocalOrdinal,
4100  class GlobalOrdinal,
4101  class Node>
4102  Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4104  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map,
4105  const size_t maxNumEntriesPerRow = 0,
4106  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
4107  {
4108  using matrix_type =
4110  return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow,
4111  params));
4112  }
4113 
4114  template<class CrsMatrixType>
4115  Teuchos::RCP<CrsMatrixType>
4116  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4117  const Import<typename CrsMatrixType::local_ordinal_type,
4118  typename CrsMatrixType::global_ordinal_type,
4119  typename CrsMatrixType::node_type>& importer,
4120  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4121  typename CrsMatrixType::global_ordinal_type,
4122  typename CrsMatrixType::node_type> >& domainMap,
4123  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4124  typename CrsMatrixType::global_ordinal_type,
4125  typename CrsMatrixType::node_type> >& rangeMap,
4126  const Teuchos::RCP<Teuchos::ParameterList>& params)
4127  {
4128  Teuchos::RCP<CrsMatrixType> destMatrix;
4129  sourceMatrix->importAndFillComplete (destMatrix, importer, domainMap, rangeMap, params);
4130  return destMatrix;
4131  }
4132 
4133  template<class CrsMatrixType>
4134  Teuchos::RCP<CrsMatrixType>
4135  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4136  const Import<typename CrsMatrixType::local_ordinal_type,
4137  typename CrsMatrixType::global_ordinal_type,
4138  typename CrsMatrixType::node_type>& rowImporter,
4139  const Import<typename CrsMatrixType::local_ordinal_type,
4140  typename CrsMatrixType::global_ordinal_type,
4141  typename CrsMatrixType::node_type>& domainImporter,
4142  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4143  typename CrsMatrixType::global_ordinal_type,
4144  typename CrsMatrixType::node_type> >& domainMap,
4145  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4146  typename CrsMatrixType::global_ordinal_type,
4147  typename CrsMatrixType::node_type> >& rangeMap,
4148  const Teuchos::RCP<Teuchos::ParameterList>& params)
4149  {
4150  Teuchos::RCP<CrsMatrixType> destMatrix;
4151  sourceMatrix->importAndFillComplete (destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4152  return destMatrix;
4153  }
4154 
4155  template<class CrsMatrixType>
4156  Teuchos::RCP<CrsMatrixType>
4157  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4158  const Export<typename CrsMatrixType::local_ordinal_type,
4159  typename CrsMatrixType::global_ordinal_type,
4160  typename CrsMatrixType::node_type>& exporter,
4161  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4162  typename CrsMatrixType::global_ordinal_type,
4163  typename CrsMatrixType::node_type> >& domainMap,
4164  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4165  typename CrsMatrixType::global_ordinal_type,
4166  typename CrsMatrixType::node_type> >& rangeMap,
4167  const Teuchos::RCP<Teuchos::ParameterList>& params)
4168  {
4169  Teuchos::RCP<CrsMatrixType> destMatrix;
4170  sourceMatrix->exportAndFillComplete (destMatrix, exporter, domainMap, rangeMap, params);
4171  return destMatrix;
4172  }
4173 
4174  template<class CrsMatrixType>
4175  Teuchos::RCP<CrsMatrixType>
4176  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4177  const Export<typename CrsMatrixType::local_ordinal_type,
4178  typename CrsMatrixType::global_ordinal_type,
4179  typename CrsMatrixType::node_type>& rowExporter,
4180  const Export<typename CrsMatrixType::local_ordinal_type,
4181  typename CrsMatrixType::global_ordinal_type,
4182  typename CrsMatrixType::node_type>& domainExporter,
4183  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4184  typename CrsMatrixType::global_ordinal_type,
4185  typename CrsMatrixType::node_type> >& domainMap,
4186  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4187  typename CrsMatrixType::global_ordinal_type,
4188  typename CrsMatrixType::node_type> >& rangeMap,
4189  const Teuchos::RCP<Teuchos::ParameterList>& params)
4190  {
4191  Teuchos::RCP<CrsMatrixType> destMatrix;
4192  sourceMatrix->exportAndFillComplete (destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4193  return destMatrix;
4194  }
4195 
4202  template<class CrsMatrixType>
4203  void
4204  removeCrsMatrixZeros(CrsMatrixType& matrix,
4205  typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType const & threshold =
4206  Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude( Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero() ))
4207  {
4208  auto localMatrix = matrix.getLocalMatrixDevice();
4209  size_t nnzBefore = localMatrix.nnz();
4210  localMatrix = KokkosSparse::removeCrsMatrixZeros(localMatrix,threshold);
4211  size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4212  //Skip the expertStaticFillComplete if no entries were removed on any process.
4213  //The fill complete can perform MPI collectives, so it can only be skipped on all processes or none.
4214  size_t globalNNZRemoved = 0;
4215  Teuchos::reduceAll<int, size_t> (*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4216  if(globalNNZRemoved != size_t(0)) {
4217  matrix.resumeFill();
4218  matrix.setAllValues(localMatrix);
4219  matrix.expertStaticFillComplete(matrix.getDomainMap(),matrix.getRangeMap());
4220  }
4221  }
4222 
4223 } // namespace Tpetra
4224 
4232 #endif // TPETRA_CRSMATRIX_DECL_HPP
CrsMatrix & operator=(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assignment.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
KokkosSparse::StaticCrsGraph< local_ordinal_type, Kokkos::LayoutLeft, device_type, void, size_t > local_graph_device_type
The type of the part of the sparse graph on each MPI process.
void checkInternalState() const
Check that this object&#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.