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 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // ************************************************************************
38 // @HEADER
39 
40 // clang-format off
41 #ifndef TPETRA_CRSMATRIX_DECL_HPP
42 #define TPETRA_CRSMATRIX_DECL_HPP
43 
46 
47 #include "Tpetra_CrsMatrix_fwd.hpp"
48 #include "KokkosSparse_Utils.hpp"
49 #include "KokkosSparse_CrsMatrix.hpp"
50 #if KOKKOSKERNELS_VERSION >= 40299
51 #include "Tpetra_Details_MatrixApplyHelper.hpp"
52 #else
53 #include "Tpetra_LocalCrsMatrixOperator.hpp"
54 #endif
55 #include "Tpetra_RowMatrix_decl.hpp"
56 #include "Tpetra_Exceptions.hpp"
57 #include "Tpetra_DistObject.hpp"
58 #include "Tpetra_CrsGraph.hpp"
59 #include "Tpetra_Vector.hpp"
60 #include "Tpetra_Details_PackTraits.hpp" // unused here, could delete
61 #include "Tpetra_Details_ExecutionSpacesUser.hpp"
62 #include "Teuchos_DataAccess.hpp"
63 
64 #include <memory> // std::shared_ptr
65 
66 namespace Tpetra {
67 
68  // Forward declaration for CrsMatrix::swap() test
69  template<class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node> class crsMatrix_Swap_Tester;
70 
122  template<class CrsMatrixType>
123  Teuchos::RCP<CrsMatrixType>
124  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
125  const Import<typename CrsMatrixType::local_ordinal_type,
126  typename CrsMatrixType::global_ordinal_type,
127  typename CrsMatrixType::node_type>& importer,
128  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
129  typename CrsMatrixType::global_ordinal_type,
130  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
131  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
132  typename CrsMatrixType::global_ordinal_type,
133  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
134  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
135 
189  template<class CrsMatrixType>
190  Teuchos::RCP<CrsMatrixType>
191  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
192  const Import<typename CrsMatrixType::local_ordinal_type,
193  typename CrsMatrixType::global_ordinal_type,
194  typename CrsMatrixType::node_type>& rowImporter,
195  const Import<typename CrsMatrixType::local_ordinal_type,
196  typename CrsMatrixType::global_ordinal_type,
197  typename CrsMatrixType::node_type>& domainImporter,
198  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
199  typename CrsMatrixType::global_ordinal_type,
200  typename CrsMatrixType::node_type> >& domainMap,
201  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
202  typename CrsMatrixType::global_ordinal_type,
203  typename CrsMatrixType::node_type> >& rangeMap,
204  const Teuchos::RCP<Teuchos::ParameterList>& params);
205 
239  template<class CrsMatrixType>
240  Teuchos::RCP<CrsMatrixType>
241  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
242  const Export<typename CrsMatrixType::local_ordinal_type,
243  typename CrsMatrixType::global_ordinal_type,
244  typename CrsMatrixType::node_type>& exporter,
245  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
246  typename CrsMatrixType::global_ordinal_type,
247  typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
248  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
249  typename CrsMatrixType::global_ordinal_type,
250  typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
251  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
252 
286  template<class CrsMatrixType>
287  Teuchos::RCP<CrsMatrixType>
288  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
289  const Export<typename CrsMatrixType::local_ordinal_type,
290  typename CrsMatrixType::global_ordinal_type,
291  typename CrsMatrixType::node_type>& rowExporter,
292  const Export<typename CrsMatrixType::local_ordinal_type,
293  typename CrsMatrixType::global_ordinal_type,
294  typename CrsMatrixType::node_type>& domainExporter,
295  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
296  typename CrsMatrixType::global_ordinal_type,
297  typename CrsMatrixType::node_type> >& domainMap,
298  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
299  typename CrsMatrixType::global_ordinal_type,
300  typename CrsMatrixType::node_type> >& rangeMap,
301  const Teuchos::RCP<Teuchos::ParameterList>& params);
302 
305  namespace Details {
306  template<class SC, class LO, class GO, class NO>
307  void residual(const Operator<SC,LO,GO,NO> & A,
308  const MultiVector<SC,LO,GO,NO> & X,
309  const MultiVector<SC,LO,GO,NO> & B,
310  MultiVector<SC,LO,GO,NO> & R);
311  }
312 
426  template <class Scalar,
427  class LocalOrdinal,
428  class GlobalOrdinal,
429  class Node>
430  class CrsMatrix :
431  public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
432  public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
433  public Details::Spaces::User
434  {
435  // clang-format on
436 private:
437  using dist_object_type =
438  DistObject<char, LocalOrdinal, GlobalOrdinal,
439  Node>;
440  // clang-format off
442 
443  public:
445 
446 
448  using scalar_type = Scalar;
450  using local_ordinal_type = LocalOrdinal;
452  using global_ordinal_type = GlobalOrdinal;
454  using device_type = typename Node::device_type;
456  using execution_space = typename device_type::execution_space;
458  using memory_space = typename device_type::memory_space;
459 
464  using node_type = Node;
465 
468 
471 
474 
477 
493  using mag_type = typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
494 
497 
500  using local_graph_host_type = typename crs_graph_type::local_graph_host_type;
501 
505  KokkosSparse::CrsMatrix<impl_scalar_type,
507  device_type,
508  void,
509  typename local_graph_device_type::size_type>;
510  using local_matrix_host_type =
511  typename local_matrix_device_type::HostMirror;
512 
513 #if KOKKOSKERNELS_VERSION < 40299
514  using local_multiply_op_type =
517  scalar_type,
519 #endif
520 
521  using row_ptrs_device_view_type =
522  typename row_matrix_type::row_ptrs_device_view_type;
523  using row_ptrs_host_view_type =
524  typename row_matrix_type::row_ptrs_host_view_type;
525 
526 
527  using local_inds_device_view_type =
528  typename row_matrix_type::local_inds_device_view_type;
529  using local_inds_host_view_type =
530  typename row_matrix_type::local_inds_host_view_type;
531  using nonconst_local_inds_host_view_type =
532  typename row_matrix_type::nonconst_local_inds_host_view_type;
533 
534  using global_inds_device_view_type =
535  typename row_matrix_type::global_inds_device_view_type;
536  using global_inds_host_view_type =
537  typename row_matrix_type::global_inds_host_view_type;
538  using nonconst_global_inds_host_view_type =
539  typename row_matrix_type::nonconst_global_inds_host_view_type;
540 
541  using values_device_view_type =
542  typename row_matrix_type::values_device_view_type;
543  using values_host_view_type =
544  typename row_matrix_type::values_host_view_type;
545  using nonconst_values_host_view_type =
546  typename row_matrix_type::nonconst_values_host_view_type;
547 
549 
551 
553  CrsMatrix (const CrsMatrix<Scalar, LocalOrdinal,
554  GlobalOrdinal, Node>&) = default;
555 
557  CrsMatrix (CrsMatrix<Scalar, LocalOrdinal,
558  GlobalOrdinal, Node>&&) = default;
559 
561  CrsMatrix&
562  operator= (const CrsMatrix<Scalar, LocalOrdinal,
563  GlobalOrdinal, Node>&) = default;
564 
566  CrsMatrix&
567  operator= (CrsMatrix<Scalar, LocalOrdinal,
568  GlobalOrdinal, Node>&&) = default;
569 
583  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
584  const size_t maxNumEntriesPerRow,
585  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
586 
599  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
600  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
601  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
602 
603 
622  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
623  const Teuchos::RCP<const map_type>& colMap,
624  const size_t maxNumEntPerRow,
625  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
626 
645  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
646  const Teuchos::RCP<const map_type>& colMap,
647  const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
648  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
649 
679  const Teuchos::RCP<const crs_graph_type>& graph,
680  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
681 
706  explicit CrsMatrix (const Teuchos::RCP<const crs_graph_type>& graph,
707  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
708 
737  explicit CrsMatrix (const Teuchos::RCP<const crs_graph_type>& graph,
738  const typename local_matrix_device_type::values_type& values,
739  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
740 
767  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
768  const Teuchos::RCP<const map_type>& colMap,
769  const typename local_graph_device_type::row_map_type& rowPointers,
770  const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
771  const typename local_matrix_device_type::values_type& values,
772  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
773 
800  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
801  const Teuchos::RCP<const map_type>& colMap,
802  const Teuchos::ArrayRCP<size_t>& rowPointers,
803  const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
804  const Teuchos::ArrayRCP<Scalar>& values,
805  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
806 
828  CrsMatrix (const Teuchos::RCP<const map_type>& rowMap,
829  const Teuchos::RCP<const map_type>& colMap,
830  const local_matrix_device_type& lclMatrix,
831  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
832 
863  CrsMatrix (const local_matrix_device_type& lclMatrix,
864  const Teuchos::RCP<const map_type>& rowMap,
865  const Teuchos::RCP<const map_type>& colMap,
866  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
867  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
868  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
869 
874  CrsMatrix (const local_matrix_device_type& lclMatrix,
875  const Teuchos::RCP<const map_type>& rowMap,
876  const Teuchos::RCP<const map_type>& colMap,
877  const Teuchos::RCP<const map_type>& domainMap,
878  const Teuchos::RCP<const map_type>& rangeMap,
879  const Teuchos::RCP<const import_type>& importer,
880  const Teuchos::RCP<const export_type>& exporter,
881  const Teuchos::RCP<Teuchos::ParameterList>& params =
882  Teuchos::null);
883 
885  // This function in 'Copy' mode is only guaranteed to work correctly for matrices
886  // which are fillComplete.
888  const Teuchos::DataAccess copyOrView);
889 
899  virtual ~CrsMatrix () = default;
900 
901  // This friend declaration makes the clone() method work.
902  template <class S2, class LO2, class GO2, class N2>
903  friend class CrsMatrix;
904 
905  // This friend declaration allows for fused residual calculation
906  template <class S2, class LO2, class GO2, class N2>
907  friend void Details::residual(const Operator<S2,LO2,GO2,N2> & A,
908  const MultiVector<S2,LO2,GO2,N2> & X,
909  const MultiVector<S2,LO2,GO2,N2> & B,
911 
912  // This friend declaration allows for batching of apply calls
913  template <class MatrixArray, class MultiVectorArray>
914  friend void batchedApply(const MatrixArray &Matrices,
915  const typename std::remove_pointer<typename MultiVectorArray::value_type>::type & X,
916  MultiVectorArray &Y,
917  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
918  typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
919  Teuchos::RCP<Teuchos::ParameterList> params);
920 
921  public:
923 
925 
949  //
991  void
992  insertGlobalValues (const GlobalOrdinal globalRow,
993  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
994  const Teuchos::ArrayView<const Scalar>& vals);
995 
1010  void
1011  insertGlobalValues (const GlobalOrdinal globalRow,
1012  const LocalOrdinal numEnt,
1013  const Scalar vals[],
1014  const GlobalOrdinal inds[]);
1015 
1058  void
1059  insertLocalValues (const LocalOrdinal localRow,
1060  const Teuchos::ArrayView<const LocalOrdinal> &cols,
1061  const Teuchos::ArrayView<const Scalar> &vals,
1062  const CombineMode CM=ADD);
1063 
1083  void
1084  insertLocalValues (const LocalOrdinal localRow,
1085  const LocalOrdinal numEnt,
1086  const Scalar vals[],
1087  const LocalOrdinal cols[],
1088  const CombineMode CM=ADD);
1089 
1090  protected:
1101  virtual LocalOrdinal
1103  const crs_graph_type& graph,
1104  const RowInfo& rowInfo,
1105  const GlobalOrdinal inds[],
1106  const impl_scalar_type newVals[],
1107  const LocalOrdinal numElts);
1108 
1109  public:
1148  const global_ordinal_type globalRow,
1149  const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1150  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1151 
1154  LocalOrdinal
1155  replaceGlobalValues (const GlobalOrdinal globalRow,
1156  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1157  const Teuchos::ArrayView<const Scalar>& vals);
1158 
1173  LocalOrdinal
1174  replaceGlobalValues (const GlobalOrdinal globalRow,
1175  const LocalOrdinal numEnt,
1176  const Scalar vals[],
1177  const GlobalOrdinal cols[]);
1178 
1179  protected:
1190  virtual LocalOrdinal
1192  const crs_graph_type& graph,
1193  const RowInfo& rowInfo,
1194  const LocalOrdinal inds[],
1195  const impl_scalar_type newVals[],
1196  const LocalOrdinal numElts);
1197 
1198  public:
1236  const local_ordinal_type localRow,
1237  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1238  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1239 
1243  LocalOrdinal
1244  replaceLocalValues (const LocalOrdinal localRow,
1245  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1246  const Teuchos::ArrayView<const Scalar>& vals);
1247 
1265  LocalOrdinal
1266  replaceLocalValues (const LocalOrdinal localRow,
1267  const LocalOrdinal numEnt,
1268  const Scalar inputVals[],
1269  const LocalOrdinal inputCols[]);
1270 
1271  private:
1276  static const bool useAtomicUpdatesByDefault =
1277 #ifdef KOKKOS_ENABLE_SERIAL
1278  ! std::is_same<execution_space, Kokkos::Serial>::value;
1279 #else
1280  true;
1281 #endif // KOKKOS_ENABLE_SERIAL
1282 
1306  protected:
1307  virtual LocalOrdinal
1309  const crs_graph_type& graph,
1310  const RowInfo& rowInfo,
1311  const GlobalOrdinal inds[],
1312  const impl_scalar_type newVals[],
1313  const LocalOrdinal numElts,
1314  const bool atomic = useAtomicUpdatesByDefault);
1315 
1316  public:
1353  LocalOrdinal
1354  sumIntoGlobalValues (const GlobalOrdinal globalRow,
1355  const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1356  const Teuchos::ArrayView<const Scalar>& vals,
1357  const bool atomic = useAtomicUpdatesByDefault);
1358 
1381  LocalOrdinal
1382  sumIntoGlobalValues (const GlobalOrdinal globalRow,
1383  const LocalOrdinal numEnt,
1384  const Scalar vals[],
1385  const GlobalOrdinal cols[],
1386  const bool atomic = useAtomicUpdatesByDefault);
1387 
1388  protected:
1401  virtual LocalOrdinal
1403  const crs_graph_type& graph,
1404  const RowInfo& rowInfo,
1405  const LocalOrdinal inds[],
1406  const impl_scalar_type newVals[],
1407  const LocalOrdinal numElts,
1408  const bool atomic = useAtomicUpdatesByDefault);
1409 
1410  public:
1449  const local_ordinal_type localRow,
1450  const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1451  const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1452  const bool atomic = useAtomicUpdatesByDefault);
1453 
1483  LocalOrdinal
1484  sumIntoLocalValues (const LocalOrdinal localRow,
1485  const Teuchos::ArrayView<const LocalOrdinal>& cols,
1486  const Teuchos::ArrayView<const Scalar>& vals,
1487  const bool atomic = useAtomicUpdatesByDefault);
1488 
1510  LocalOrdinal
1511  sumIntoLocalValues (const LocalOrdinal localRow,
1512  const LocalOrdinal numEnt,
1513  const Scalar vals[],
1514  const LocalOrdinal cols[],
1515  const bool atomic = useAtomicUpdatesByDefault);
1516 
1517  private:
1548  LocalOrdinal
1549  transformLocalValues (impl_scalar_type rowVals[],
1550  const crs_graph_type& graph,
1551  const RowInfo& rowInfo,
1552  const LocalOrdinal 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 
1588  LocalOrdinal
1589  transformGlobalValues (impl_scalar_type rowVals[],
1590  const crs_graph_type& graph,
1591  const RowInfo& rowInfo,
1592  const GlobalOrdinal inds[],
1593  const impl_scalar_type newVals[],
1594  const LocalOrdinal numElts,
1595  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1596  const bool atomic = useAtomicUpdatesByDefault);
1597 
1624  LocalOrdinal
1625  transformLocalValues (const LocalOrdinal lclRow,
1626  const LocalOrdinal numInputEnt,
1627  const impl_scalar_type inputVals[],
1628  const LocalOrdinal inputCols[],
1629  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1630  const bool atomic = useAtomicUpdatesByDefault);
1631 
1658  LocalOrdinal
1659  transformGlobalValues (const GlobalOrdinal gblRow,
1660  const LocalOrdinal numInputEnt,
1661  const impl_scalar_type inputVals[],
1662  const GlobalOrdinal inputCols[],
1663  std::function<impl_scalar_type (const impl_scalar_type&, const impl_scalar_type&) > f,
1664  const bool atomic = useAtomicUpdatesByDefault);
1665 
1666  public:
1710  template<class LocalIndicesViewType,
1711  class ImplScalarViewType,
1712  class BinaryFunction>
1713  LocalOrdinal
1714  transformLocalValues (const LocalOrdinal lclRow,
1715  const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1716  const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1717  BinaryFunction f,
1718  const bool atomic = useAtomicUpdatesByDefault)
1719  {
1720  // We use static_assert here to check the template parameters,
1721  // rather than std::enable_if (e.g., on the return value, to
1722  // enable compilation only if the template parameters match the
1723  // desired attributes). This turns obscure link errors into
1724  // clear compilation errors. It also makes the return value a
1725  // lot easier to see.
1726  static_assert (Kokkos::is_view<LocalIndicesViewType>::value,
1727  "First template parameter LocalIndicesViewType must be "
1728  "a Kokkos::View.");
1729  static_assert (Kokkos::is_view<ImplScalarViewType>::value,
1730  "Second template parameter ImplScalarViewType must be a "
1731  "Kokkos::View.");
1732  static_assert (static_cast<int> (LocalIndicesViewType::rank) == 1,
1733  "First template parameter LocalIndicesViewType must "
1734  "have rank 1.");
1735  static_assert (static_cast<int> (ImplScalarViewType::rank) == 1,
1736  "Second template parameter ImplScalarViewType must have "
1737  "rank 1.");
1738  static_assert (std::is_same<
1739  typename LocalIndicesViewType::non_const_value_type,
1740  local_ordinal_type>::value,
1741  "First template parameter LocalIndicesViewType must "
1742  "contain values of type local_ordinal_type.");
1743  static_assert (std::is_same<
1744  typename ImplScalarViewType::non_const_value_type,
1745  impl_scalar_type>::value,
1746  "Second template parameter ImplScalarViewType must "
1747  "contain values of type impl_scalar_type.");
1748  typedef LocalOrdinal LO;
1749  const LO numInputEnt = inputInds.extent (0);
1750  if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1751  return Teuchos::OrdinalTraits<LO>::invalid ();
1752  }
1753  return this->transformLocalValues (lclRow,
1754  numInputEnt,
1755  inputVals.data (),
1756  inputInds.data (),
1757  f,
1758  atomic);
1759  }
1760 
1802  template<class BinaryFunction, class InputMemorySpace>
1803  LocalOrdinal
1804  transformGlobalValues (const GlobalOrdinal gblRow,
1805  const Kokkos::View<const GlobalOrdinal*,
1806  InputMemorySpace,
1807  Kokkos::MemoryUnmanaged>& inputInds,
1808  const Kokkos::View<const impl_scalar_type*,
1809  InputMemorySpace,
1810  Kokkos::MemoryUnmanaged>& inputVals,
1811  BinaryFunction f,
1812  const bool atomic = useAtomicUpdatesByDefault)
1813  {
1814  typedef LocalOrdinal LO;
1815  const LO numInputEnt = inputInds.extent (0);
1816  if (static_cast<LO> (inputVals.extent (0)) != numInputEnt) {
1817  return Teuchos::OrdinalTraits<LO>::invalid ();
1818  }
1819  return this->transformGlobalValues (gblRow,
1820  numInputEnt,
1821  inputVals.data (),
1822  inputInds.data (),
1823  f,
1824  atomic);
1825  }
1826 
1828  void setAllToScalar (const Scalar& alpha);
1829 
1831  void scale (const Scalar& alpha);
1832 
1857  void
1858  setAllValues (const typename local_graph_device_type::row_map_type& ptr,
1859  const typename local_graph_device_type::entries_type::non_const_type& ind,
1860  const typename local_matrix_device_type::values_type& val);
1861 
1882  void
1883  setAllValues (const local_matrix_device_type& localMatrix);
1884 
1909  void
1910  setAllValues (const Teuchos::ArrayRCP<size_t>& ptr,
1911  const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1912  const Teuchos::ArrayRCP<Scalar>& val);
1913 
1915  row_ptrs_host_view_type getLocalRowPtrsHost () const
1916  { return getCrsGraph()->getLocalRowPtrsHost(); }
1917 
1919  row_ptrs_device_view_type getLocalRowPtrsDevice () const
1920  { return getCrsGraph()->getLocalRowPtrsDevice(); }
1921 
1923  local_inds_host_view_type getLocalIndicesHost () const
1924  { return getCrsGraph()->getLocalIndicesHost(); }
1925 
1927  local_inds_device_view_type getLocalIndicesDevice () const
1928  { return getCrsGraph()->getLocalIndicesDevice(); }
1929 
1931 
1933 
1962  void globalAssemble();
1963 
1977  void resumeFill (const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1978 
2036  void
2037  fillComplete (const Teuchos::RCP<const map_type>& domainMap,
2038  const Teuchos::RCP<const map_type>& rangeMap,
2039  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2040 
2067  void
2068  fillComplete (const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2069 
2096  void
2097  expertStaticFillComplete (const Teuchos::RCP<const map_type>& domainMap,
2098  const Teuchos::RCP<const map_type>& rangeMap,
2099  const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2100  const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2101  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2102 
2120  void
2121  replaceColMap (const Teuchos::RCP<const map_type>& newColMap);
2122 
2204  void
2205  reindexColumns (crs_graph_type* const graph,
2206  const Teuchos::RCP<const map_type>& newColMap,
2207  const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2208  const bool sortEachRow = true);
2209 
2219  void
2220  replaceDomainMap (const Teuchos::RCP<const map_type>& newDomainMap);
2221 
2235  void
2236  replaceDomainMapAndImporter (const Teuchos::RCP<const map_type>& newDomainMap,
2237  Teuchos::RCP<const import_type>& newImporter);
2238 
2248  void
2249  replaceRangeMap (const Teuchos::RCP<const map_type>& newRangeMap);
2250 
2264  void
2265  replaceRangeMapAndExporter (const Teuchos::RCP<const map_type>& newRangeMap,
2266  Teuchos::RCP<const export_type>& newExporter);
2267 
2281  virtual void
2282  removeEmptyProcessesInPlace (const Teuchos::RCP<const map_type>& newMap) override;
2283 
2285 
2287 
2289  Teuchos::RCP<const Teuchos::Comm<int> > getComm() const override;
2290 
2291 
2293  Teuchos::RCP<const map_type> getRowMap () const override;
2294 
2296  Teuchos::RCP<const map_type> getColMap () const override;
2297 
2299  Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2300  getGraph () const override;
2301 
2303  Teuchos::RCP<const crs_graph_type> getCrsGraph () const;
2304 
2305  private:
2316  const crs_graph_type& getCrsGraphRef () const;
2317 
2318  public:
2329  local_matrix_host_type getLocalMatrixHost () const;
2330 
2331 #if KOKKOSKERNELS_VERSION < 40299
2332  std::shared_ptr<local_multiply_op_type> getLocalMultiplyOperator () const;
2338 #endif
2339 
2359  global_size_t getGlobalNumRows() const override;
2360 
2366  global_size_t getGlobalNumCols() const override;
2367 
2374  size_t getLocalNumRows() const override;
2375 
2379  size_t getLocalNumCols() const override;
2380 
2382  GlobalOrdinal getIndexBase() const override;
2383 
2385  global_size_t getGlobalNumEntries() const override;
2386 
2388  size_t getLocalNumEntries() const override;
2389 
2396  size_t getNumEntriesInGlobalRow (GlobalOrdinal globalRow) const override;
2397 
2404  size_t getNumEntriesInLocalRow (local_ordinal_type localRow) const override;
2405 
2413  size_t getGlobalMaxNumRowEntries () const override;
2414 
2422  size_t getLocalMaxNumRowEntries () const override;
2423 
2425  virtual LocalOrdinal getBlockSize () const override { return 1; }
2426 
2428  bool hasColMap () const override;
2429 
2430 
2451  bool isLocallyIndexed() const override;
2452 
2473  bool isGloballyIndexed() const override;
2474 
2497  bool isFillComplete() const override;
2498 
2521  bool isFillActive() const;
2522 
2524 
2530  bool isStorageOptimized () const;
2531 
2533  bool isStaticGraph () const;
2534 
2542  mag_type getFrobeniusNorm () const override;
2543 
2546  virtual bool supportsRowViews () const override;
2547 
2548 protected:
2549  using values_dualv_type =
2550  Kokkos::DualView<impl_scalar_type*, device_type>;
2551  using values_wdv_type =
2553  values_wdv_type valuesUnpacked_wdv;
2554  mutable values_wdv_type valuesPacked_wdv;
2555 
2556 #if KOKKOSKERNELS_VERSION < 40299
2557  using ordinal_rowptrs_type = typename local_multiply_op_type::ordinal_view_type;
2565  mutable ordinal_rowptrs_type ordinalRowptrs;
2566 #endif
2567 
2568 public:
2569 
2618  void
2619  getGlobalRowCopy (GlobalOrdinal GlobalRow,
2620  nonconst_global_inds_host_view_type &Indices,
2621  nonconst_values_host_view_type &Values,
2622  size_t& NumEntries) const override;
2638  void
2639  getLocalRowCopy (LocalOrdinal LocalRow,
2640  nonconst_local_inds_host_view_type &Indices,
2641  nonconst_values_host_view_type &Values,
2642  size_t& NumEntries) const override;
2643 
2656 
2657  void
2658  getGlobalRowView (GlobalOrdinal GlobalRow,
2659  global_inds_host_view_type &indices,
2660  values_host_view_type &values) const override;
2661 
2674  void
2675  getLocalRowView(LocalOrdinal LocalRow,
2676  local_inds_host_view_type &indices,
2677  values_host_view_type &values) const override;
2678 
2686 
2693  void
2695 
2739  void getLocalDiagOffsets (Teuchos::ArrayRCP<size_t>& offsets) const;
2740 
2762  void
2764  const Kokkos::View<const size_t*, device_type,
2765  Kokkos::MemoryUnmanaged>& offsets) const;
2766 
2789  void
2791  const Teuchos::ArrayView<const size_t>& offsets) const;
2792 
2797  void
2799 
2804  void
2806 
2808 
2810 
2872  void
2875  const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2876  const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one (),
2877  const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero ()) const;
2878 
2881  template <class T>
2882  Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2883  convert () const;
2884 
2886 
2888 
2899  void
2902  Teuchos::ETransp mode = Teuchos::NO_TRANS,
2903  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2904  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const override;
2905 
2908  bool hasTransposeApply () const override;
2909 
2916  Teuchos::RCP<const map_type> getDomainMap () const override;
2917 
2924  Teuchos::RCP<const map_type> getRangeMap () const override;
2925 
2927 
2929 
2940  virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2941  add (const Scalar& alpha,
2943  const Scalar& beta,
2944  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap,
2945  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap,
2946  const Teuchos::RCP<Teuchos::ParameterList>& params) const override;
2947 
2949 
2951 
2953  std::string description () const override;
2954 
2957  void
2958  describe (Teuchos::FancyOStream& out,
2959  const Teuchos::EVerbosityLevel verbLevel =
2960  Teuchos::Describable::verbLevel_default) const override;
2961 
2963 
2965 
2970  typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2972 
2973  virtual bool
2974  checkSizes (const SrcDistObject& source) override;
2975 
2976  void
2977  applyCrsPadding(
2978  const typename crs_graph_type::padding_type& padding,
2979  const bool verbose);
2980 
2981  private:
2982  void
2983  copyAndPermuteStaticGraph(
2985  const size_t numSameIDs,
2986  const LocalOrdinal permuteToLIDs[],
2987  const LocalOrdinal permuteFromLIDs[],
2988  const size_t numPermutes);
2989 
2990  void
2991  copyAndPermuteNonStaticGraph(
2993  const size_t numSameIDs,
2994  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2995  const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2996  const size_t numPermutes);
2997 
2998  protected:
2999 
3000  // clang-format on
3001  using dist_object_type::
3003  // clang-format off
3005 
3006  virtual void
3008  (const SrcDistObject& source,
3009  const size_t numSameIDs,
3010  const Kokkos::DualView<
3011  const local_ordinal_type*,
3012  buffer_device_type>& permuteToLIDs,
3013  const Kokkos::DualView<
3014  const local_ordinal_type*,
3015  buffer_device_type>& permuteFromLIDs,
3016  const CombineMode CM) override;
3017 
3018  virtual void
3019  packAndPrepare
3020  (const SrcDistObject& source,
3021  const Kokkos::DualView<
3022  const local_ordinal_type*,
3023  buffer_device_type>& exportLIDs,
3024  Kokkos::DualView<char*, buffer_device_type>& exports,
3025  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3026  size_t& constantNumPackets) override;
3027 
3028  // clang-format on
3030  // clang-format off
3034 
3035  private:
3038  void
3039  unpackAndCombineImpl(
3040  const Kokkos::DualView<const local_ordinal_type*,
3041  buffer_device_type>& importLIDs,
3042  Kokkos::DualView<char*, buffer_device_type> imports,
3043  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3044  const size_t constantNumPackets,
3045  const CombineMode combineMode,
3046  const bool verbose);
3047 
3050  void
3051  unpackAndCombineImplNonStatic(
3052  const Kokkos::DualView<const local_ordinal_type*,
3053  buffer_device_type>& importLIDs,
3054  Kokkos::DualView<char*, buffer_device_type> imports,
3055  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3056  const size_t constantNumPackets,
3057  const CombineMode combineMode);
3058 
3059  public:
3069  void
3071  (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3072  Kokkos::DualView<char*, buffer_device_type> imports,
3073  Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3074  const size_t constantNumPackets,
3075  const CombineMode CM) override;
3076 
3077  // clang-format on
3079  // clang-format off
3083 
3189  void
3190  packNew (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3191  Kokkos::DualView<char*, buffer_device_type>& exports,
3192  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3193  size_t& constantNumPackets) const;
3194 
3195  private:
3202  void
3203  packNonStaticNew (const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3204  Kokkos::DualView<char*, buffer_device_type>& exports,
3205  const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3206  size_t& constantNumPackets) const;
3207 
3237  size_t
3238  packRow (char exports[],
3239  const size_t offset,
3240  const size_t numEnt,
3241  const GlobalOrdinal gidsIn[],
3242  const impl_scalar_type valsIn[],
3243  const size_t numBytesPerValue) const;
3244 
3268  bool
3269  packRowStatic (char* const numEntOut,
3270  char* const valOut,
3271  char* const indOut,
3272  const size_t numEnt,
3273  const LocalOrdinal lclRow) const;
3274 
3300  size_t
3301  unpackRow (GlobalOrdinal gidsOut[],
3302  impl_scalar_type valsOut[],
3303  const char imports[],
3304  const size_t offset,
3305  const size_t numBytes,
3306  const size_t numEnt,
3307  const size_t numBytesPerValue);
3308 
3317  void
3318  allocatePackSpaceNew (Kokkos::DualView<char*, buffer_device_type>& exports,
3319  size_t& totalNumEntries,
3320  const Kokkos::DualView<const local_ordinal_type*,
3321  buffer_device_type>& exportLIDs) const;
3323 
3324  public:
3326  typename local_matrix_host_type::values_type::const_type
3327  getLocalValuesHost (Access::ReadOnlyStruct s) const
3328  {
3329  return valuesPacked_wdv.getHostView(s);
3330  }
3331 
3333  typename local_matrix_host_type::values_type
3334  getLocalValuesHost (Access::ReadWriteStruct s)
3335  {
3336  return valuesPacked_wdv.getHostView(s);
3337  }
3338 
3340  typename local_matrix_host_type::values_type
3341  getLocalValuesHost (Access::OverwriteAllStruct s)
3342  {
3343  return valuesPacked_wdv.getHostView(s);
3344  }
3345 
3347  typename local_matrix_device_type::values_type::const_type
3348  getLocalValuesDevice (Access::ReadOnlyStruct s) const
3349  {
3350  return valuesPacked_wdv.getDeviceView(s);
3351  }
3352 
3354  typename local_matrix_device_type::values_type
3355  getLocalValuesDevice (Access::ReadWriteStruct s)
3356  {
3357  return valuesPacked_wdv.getDeviceView(s);
3358  }
3359 
3361  typename local_matrix_device_type::values_type
3362  getLocalValuesDevice (Access::OverwriteAllStruct s)
3363  {
3364  return valuesPacked_wdv.getDeviceView(s);
3365  }
3366 
3367  private:
3368  // Friend declaration for nonmember function.
3369  template<class CrsMatrixType>
3370  friend Teuchos::RCP<CrsMatrixType>
3371  Tpetra::importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3372  const Import<typename CrsMatrixType::local_ordinal_type,
3373  typename CrsMatrixType::global_ordinal_type,
3374  typename CrsMatrixType::node_type>& importer,
3375  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3376  typename CrsMatrixType::global_ordinal_type,
3377  typename CrsMatrixType::node_type> >& domainMap,
3378  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3379  typename CrsMatrixType::global_ordinal_type,
3380  typename CrsMatrixType::node_type> >& rangeMap,
3381  const Teuchos::RCP<Teuchos::ParameterList>& params);
3382 
3383  // Friend declaration for nonmember function.
3384  template<class CrsMatrixType>
3385  friend Teuchos::RCP<CrsMatrixType>
3386  Tpetra::importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3387  const Import<typename CrsMatrixType::local_ordinal_type,
3388  typename CrsMatrixType::global_ordinal_type,
3389  typename CrsMatrixType::node_type>& rowImporter,
3390  const Import<typename CrsMatrixType::local_ordinal_type,
3391  typename CrsMatrixType::global_ordinal_type,
3392  typename CrsMatrixType::node_type>& domainImporter,
3393  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3394  typename CrsMatrixType::global_ordinal_type,
3395  typename CrsMatrixType::node_type> >& domainMap,
3396  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3397  typename CrsMatrixType::global_ordinal_type,
3398  typename CrsMatrixType::node_type> >& rangeMap,
3399  const Teuchos::RCP<Teuchos::ParameterList>& params);
3400 
3401 
3402  // Friend declaration for nonmember function.
3403  template<class CrsMatrixType>
3404  friend Teuchos::RCP<CrsMatrixType>
3405  Tpetra::exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3406  const Export<typename CrsMatrixType::local_ordinal_type,
3407  typename CrsMatrixType::global_ordinal_type,
3408  typename CrsMatrixType::node_type>& exporter,
3409  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3410  typename CrsMatrixType::global_ordinal_type,
3411  typename CrsMatrixType::node_type> >& domainMap,
3412  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3413  typename CrsMatrixType::global_ordinal_type,
3414  typename CrsMatrixType::node_type> >& rangeMap,
3415  const Teuchos::RCP<Teuchos::ParameterList>& params);
3416 
3417  // Friend declaration for nonmember function.
3418  template<class CrsMatrixType>
3419  friend Teuchos::RCP<CrsMatrixType>
3420  Tpetra::exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3421  const Export<typename CrsMatrixType::local_ordinal_type,
3422  typename CrsMatrixType::global_ordinal_type,
3423  typename CrsMatrixType::node_type>& rowExporter,
3424  const Export<typename CrsMatrixType::local_ordinal_type,
3425  typename CrsMatrixType::global_ordinal_type,
3426  typename CrsMatrixType::node_type>& domainExporter,
3427  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3428  typename CrsMatrixType::global_ordinal_type,
3429  typename CrsMatrixType::node_type> >& domainMap,
3430  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3431  typename CrsMatrixType::global_ordinal_type,
3432  typename CrsMatrixType::node_type> >& rangeMap,
3433  const Teuchos::RCP<Teuchos::ParameterList>& params);
3434 
3435  public:
3451  void
3453  const import_type& importer,
3454  const Teuchos::RCP<const map_type>& domainMap,
3455  const Teuchos::RCP<const map_type>& rangeMap,
3456  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3457 
3473  void
3475  const import_type& rowImporter,
3476  const import_type& domainImporter,
3477  const Teuchos::RCP<const map_type>& domainMap,
3478  const Teuchos::RCP<const map_type>& rangeMap,
3479  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3480 
3481 
3497  void
3499  const export_type& exporter,
3500  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3501  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3502  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3503 
3519  void
3521  const export_type& rowExporter,
3522  const export_type& domainExporter,
3523  const Teuchos::RCP<const map_type>& domainMap,
3524  const Teuchos::RCP<const map_type>& rangeMap,
3525  const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3526 
3527 
3528  private:
3549  void
3550  transferAndFillComplete (Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& destMatrix,
3551  const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3552  const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> > & domainTransfer,
3553  const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3554  const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3555  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3556 
3568  protected:
3569  virtual void
3571  RowInfo& rowInfo,
3572  const GlobalOrdinal gblColInds[],
3573  const impl_scalar_type vals[],
3574  const size_t numInputEnt);
3575 
3576  private:
3586  void
3587  insertGlobalValuesFiltered(
3588  const GlobalOrdinal globalRow,
3589  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3590  const Teuchos::ArrayView<const Scalar>& values,
3591  const bool debug);
3592 
3595  void
3596  insertGlobalValuesFilteredChecked(
3597  const GlobalOrdinal globalRow,
3598  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3599  const Teuchos::ArrayView<const Scalar>& values,
3600  const char* const prefix,
3601  const bool debug,
3602  const bool verbose);
3603 
3615  void
3616  combineGlobalValues(
3617  const GlobalOrdinal globalRowIndex,
3618  const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3619  const Teuchos::ArrayView<const Scalar>& values,
3620  const Tpetra::CombineMode combineMode,
3621  const char* const prefix,
3622  const bool debug,
3623  const bool verbose);
3624 
3646  LocalOrdinal
3647  combineGlobalValuesRaw(const LocalOrdinal lclRow,
3648  const LocalOrdinal numEnt,
3649  const impl_scalar_type vals[],
3650  const GlobalOrdinal cols[],
3651  const Tpetra::CombineMode combineMode,
3652  const char* const prefix,
3653  const bool debug,
3654  const bool verbose);
3655 
3667  template<class BinaryFunction>
3668  LocalOrdinal
3669  transformGlobalValues (const GlobalOrdinal globalRow,
3670  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3671  const Teuchos::ArrayView<const Scalar>& values,
3672  BinaryFunction f,
3673  const bool atomic = useAtomicUpdatesByDefault)
3674  {
3675  typedef impl_scalar_type IST;
3676  typedef LocalOrdinal LO;
3677  typedef GlobalOrdinal GO;
3678 
3679  const LO numInputEnt = static_cast<LO> (indices.size ());
3680  if (static_cast<LO> (values.size ()) != numInputEnt) {
3681  return Teuchos::OrdinalTraits<LO>::invalid ();
3682  }
3683 
3684  const GO* const inputCols = indices.getRawPtr ();
3685  const IST* const inputVals =
3686  reinterpret_cast<const IST*> (values.getRawPtr ());
3687  return this->transformGlobalValues (globalRow, numInputEnt, inputVals,
3688  inputCols, f, atomic);
3689  }
3690 
3697  void
3698  insertNonownedGlobalValues (const GlobalOrdinal globalRow,
3699  const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3700  const Teuchos::ArrayView<const Scalar>& values);
3701 
3744  void
3745  insertIndicesAndValues (crs_graph_type& graph,
3746  RowInfo& rowInfo,
3747  const typename crs_graph_type::SLocalGlobalViews& newInds,
3748  const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3749  const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3750  const ELocalGlobal lg,
3751  const ELocalGlobal I);
3752 
3753  protected:
3754  // useful typedefs
3755  typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3756  typedef Kokkos::ArithTraits<impl_scalar_type> STS;
3757  typedef Kokkos::ArithTraits<mag_type> STM;
3758  typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3759  typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3760  typedef crs_graph_type Graph;
3761 
3762  // Enums
3763  enum GraphAllocationStatus {
3764  GraphAlreadyAllocated,
3765  GraphNotYetAllocated
3766  };
3767 
3768  protected:
3787  void allocateValues (ELocalGlobal lg, GraphAllocationStatus gas,
3788  const bool verbose);
3789 
3800  static size_t
3801  mergeRowIndicesAndValues (size_t rowLen, local_ordinal_type* cols, impl_scalar_type* vals);
3802 
3817  void
3818  sortAndMergeIndicesAndValues (const bool sorted,
3819  const bool merged);
3820 
3821  public:
3822 
3824  bool haveGlobalConstants() const;
3825 
3826  protected:
3839  mutable Teuchos::RCP<MV> importMV_;
3840 
3853  mutable Teuchos::RCP<MV> exportMV_;
3854 
3874  Teuchos::RCP<MV>
3875  getColumnMapMultiVector (const MV& X_domainMap,
3876  const bool force = false) const;
3877 
3899  Teuchos::RCP<MV>
3900  getRowMapMultiVector (const MV& Y_rangeMap,
3901  const bool force = false) const;
3902 
3904  void
3905  applyNonTranspose (const MV& X_in,
3906  MV& Y_in,
3907  Scalar alpha,
3908  Scalar beta) const;
3909 
3911  void
3912  applyTranspose (const MV& X_in,
3913  MV& Y_in,
3914  const Teuchos::ETransp mode,
3915  Scalar alpha,
3916  Scalar beta) const;
3917 
3918  // matrix data accessors
3919 
3922  typename values_dualv_type::t_host::const_type
3923  getValuesViewHost (const RowInfo& rowinfo) const;
3924 
3927  typename values_dualv_type::t_dev::const_type
3928  getValuesViewDevice (const RowInfo& rowinfo) const;
3929 
3932  typename values_dualv_type::t_host
3933  getValuesViewHostNonConst (const RowInfo& rowinfo);
3934 
3937  typename values_dualv_type::t_dev
3938  getValuesViewDeviceNonConst (const RowInfo& rowinfo);
3939 
3940 
3941  protected:
3942 
3943  // Friend the tester for CrsMatrix::swap
3944  friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3945 
3950 
3951 
3952  protected:
3953 
3959  void fillLocalMatrix (const Teuchos::RCP<Teuchos::ParameterList>& params);
3960 
3966  void fillLocalGraphAndMatrix (const Teuchos::RCP<Teuchos::ParameterList>& params);
3967 
3969  void checkInternalState () const;
3970 
3982 
3983  Teuchos::RCP<const Graph> staticGraph_;
3984  Teuchos::RCP< Graph> myGraph_;
3986 
3987 protected:
3998  Details::STORAGE_1D_UNPACKED;
3999 
4001  bool fillComplete_ = false;
4002 
4030  std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
4031  Teuchos::Array<Scalar> > > nonlocals_;
4032 
4033  private:
4034 #if KOKKOSKERNELS_VERSION >= 40299
4035  // TODO: When KokkosKernels 4.4 is released, local_matrix_device_type can be permanently modified to use the default_size_type
4036  // 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).
4037  //
4038  // At that point the ApplyHelper can be replaced with just a SPMVHandle.
4039  using local_matrix_int_rowptrs_device_type =
4040  KokkosSparse::CrsMatrix<impl_scalar_type,
4042  device_type,
4043  void,
4044  int>;
4045 
4047  using ApplyHelper = Details::MatrixApplyHelper<
4049  local_matrix_int_rowptrs_device_type,
4051 
4057  mutable std::shared_ptr<ApplyHelper> applyHelper;
4058 #endif
4059 
4060  public:
4061  // FIXME (mfh 24 Feb 2014) Is it _really_ necessary to make this a
4062  // public inner class of CrsMatrix? It looks like it doesn't
4063  // depend on any implementation details of CrsMatrix at all. It
4064  // should really be declared and defined outside of CrsMatrix.
4065  template<class DestViewType, class SrcViewType,
4066  class DestOffsetViewType, class SrcOffsetViewType>
4067  struct pack_functor {
4068  typedef typename DestViewType::execution_space execution_space;
4069  SrcViewType src_;
4070  DestViewType dst_;
4071  SrcOffsetViewType src_offset_;
4072  DestOffsetViewType dst_offset_;
4073  typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4074 
4075  pack_functor (DestViewType dst,
4076  const SrcViewType src,
4077  DestOffsetViewType dst_offset,
4078  const SrcOffsetViewType src_offset) :
4079  src_ (src),
4080  dst_ (dst),
4081  src_offset_ (src_offset),
4082  dst_offset_ (dst_offset)
4083  {}
4084 
4085  KOKKOS_INLINE_FUNCTION
4086  void operator () (const LocalOrdinal row) const {
4087  scalar_index_type srcPos = src_offset_(row);
4088  const scalar_index_type dstEnd = dst_offset_(row+1);
4089  scalar_index_type dstPos = dst_offset_(row);
4090  for ( ; dstPos < dstEnd; ++dstPos, ++srcPos) {
4091  dst_(dstPos) = src_(srcPos);
4092  }
4093  }
4094  };
4095  }; // class CrsMatrix
4096 
4101  template<class Scalar,
4102  class LocalOrdinal,
4103  class GlobalOrdinal,
4104  class Node>
4105  Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4107  const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map,
4108  const size_t maxNumEntriesPerRow = 0,
4109  const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null)
4110  {
4111  using matrix_type =
4113  return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow,
4114  params));
4115  }
4116 
4117  template<class CrsMatrixType>
4118  Teuchos::RCP<CrsMatrixType>
4119  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4120  const Import<typename CrsMatrixType::local_ordinal_type,
4121  typename CrsMatrixType::global_ordinal_type,
4122  typename CrsMatrixType::node_type>& importer,
4123  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4124  typename CrsMatrixType::global_ordinal_type,
4125  typename CrsMatrixType::node_type> >& domainMap,
4126  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4127  typename CrsMatrixType::global_ordinal_type,
4128  typename CrsMatrixType::node_type> >& rangeMap,
4129  const Teuchos::RCP<Teuchos::ParameterList>& params)
4130  {
4131  Teuchos::RCP<CrsMatrixType> destMatrix;
4132  sourceMatrix->importAndFillComplete (destMatrix, importer, domainMap, rangeMap, params);
4133  return destMatrix;
4134  }
4135 
4136  template<class CrsMatrixType>
4137  Teuchos::RCP<CrsMatrixType>
4138  importAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4139  const Import<typename CrsMatrixType::local_ordinal_type,
4140  typename CrsMatrixType::global_ordinal_type,
4141  typename CrsMatrixType::node_type>& rowImporter,
4142  const Import<typename CrsMatrixType::local_ordinal_type,
4143  typename CrsMatrixType::global_ordinal_type,
4144  typename CrsMatrixType::node_type>& domainImporter,
4145  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4146  typename CrsMatrixType::global_ordinal_type,
4147  typename CrsMatrixType::node_type> >& domainMap,
4148  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4149  typename CrsMatrixType::global_ordinal_type,
4150  typename CrsMatrixType::node_type> >& rangeMap,
4151  const Teuchos::RCP<Teuchos::ParameterList>& params)
4152  {
4153  Teuchos::RCP<CrsMatrixType> destMatrix;
4154  sourceMatrix->importAndFillComplete (destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4155  return destMatrix;
4156  }
4157 
4158  template<class CrsMatrixType>
4159  Teuchos::RCP<CrsMatrixType>
4160  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4161  const Export<typename CrsMatrixType::local_ordinal_type,
4162  typename CrsMatrixType::global_ordinal_type,
4163  typename CrsMatrixType::node_type>& exporter,
4164  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4165  typename CrsMatrixType::global_ordinal_type,
4166  typename CrsMatrixType::node_type> >& domainMap,
4167  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4168  typename CrsMatrixType::global_ordinal_type,
4169  typename CrsMatrixType::node_type> >& rangeMap,
4170  const Teuchos::RCP<Teuchos::ParameterList>& params)
4171  {
4172  Teuchos::RCP<CrsMatrixType> destMatrix;
4173  sourceMatrix->exportAndFillComplete (destMatrix, exporter, domainMap, rangeMap, params);
4174  return destMatrix;
4175  }
4176 
4177  template<class CrsMatrixType>
4178  Teuchos::RCP<CrsMatrixType>
4179  exportAndFillCompleteCrsMatrix (const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4180  const Export<typename CrsMatrixType::local_ordinal_type,
4181  typename CrsMatrixType::global_ordinal_type,
4182  typename CrsMatrixType::node_type>& rowExporter,
4183  const Export<typename CrsMatrixType::local_ordinal_type,
4184  typename CrsMatrixType::global_ordinal_type,
4185  typename CrsMatrixType::node_type>& domainExporter,
4186  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4187  typename CrsMatrixType::global_ordinal_type,
4188  typename CrsMatrixType::node_type> >& domainMap,
4189  const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4190  typename CrsMatrixType::global_ordinal_type,
4191  typename CrsMatrixType::node_type> >& rangeMap,
4192  const Teuchos::RCP<Teuchos::ParameterList>& params)
4193  {
4194  Teuchos::RCP<CrsMatrixType> destMatrix;
4195  sourceMatrix->exportAndFillComplete (destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4196  return destMatrix;
4197  }
4198 
4205  template<class CrsMatrixType>
4206  void
4207  removeCrsMatrixZeros(CrsMatrixType& matrix,
4208  typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType const & threshold =
4209  Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude( Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero() ))
4210  {
4211  auto localMatrix = matrix.getLocalMatrixDevice();
4212  size_t nnzBefore = localMatrix.nnz();
4213  localMatrix = KokkosSparse::removeCrsMatrixZeros(localMatrix,threshold);
4214  size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4215  //Skip the expertStaticFillComplete if no entries were removed on any process.
4216  //The fill complete can perform MPI collectives, so it can only be skipped on all processes or none.
4217  size_t globalNNZRemoved = 0;
4218  Teuchos::reduceAll<int, size_t> (*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4219  if(globalNNZRemoved != size_t(0)) {
4220  matrix.resumeFill();
4221  matrix.setAllValues(localMatrix);
4222  matrix.expertStaticFillComplete(matrix.getDomainMap(),matrix.getRangeMap());
4223  }
4224  }
4225 
4226 } // namespace Tpetra
4227 
4235 #endif // TPETRA_CRSMATRIX_DECL_HPP
CrsMatrix & operator=(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assignment.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
void checkInternalState() const
Check that this object&#39;s state is sane; throw if it&#39;s not.
Abstract interface for local operators (e.g., matrices and preconditioners).
Sparse matrix that presents a row-oriented interface that lets users read or modify entries...
Teuchos::RCP< CrsMatrixType > exportAndFillCompleteCrsMatrix(const Teuchos::RCP< const CrsMatrixType > &sourceMatrix, const Export< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &exporter, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > &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.
ordinal_rowptrs_type ordinalRowptrs
local_ordinal typed version of local matrix&#39;s rowptrs. This allows the LocalCrsMatrixOperator to have...
void replaceDomainMapAndImporter(const Teuchos::RCP< const map_type > &newDomainMap, Teuchos::RCP< const import_type > &newImporter)
Replace the current domain Map and Import with the given objects.
static size_t mergeRowIndicesAndValues(size_t rowLen, local_ordinal_type *cols, impl_scalar_type *vals)
Merge duplicate row indices in the given row, along with their corresponding values.
void getGlobalRowCopy(GlobalOrdinal GlobalRow, nonconst_global_inds_host_view_type &Indices, nonconst_values_host_view_type &Values, size_t &NumEntries) const override
Fill given arrays with a deep copy of the locally owned entries of the matrix in a given row...
virtual void copyAndPermute(const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM)
Perform copies and permutations that are local to the calling (MPI) process.
Teuchos::RCP< const map_type > getRangeMap() const override
The range Map of this matrix.
global_size_t getGlobalNumRows() const override
Number of global elements in the row map of this matrix.
std::map< GlobalOrdinal, std::pair< Teuchos::Array< GlobalOrdinal >, Teuchos::Array< Scalar > > > nonlocals_
Nonlocal data added using insertGlobalValues().
void sortAndMergeIndicesAndValues(const bool sorted, const bool merged)
Sort and merge duplicate local column indices in all rows on the calling process, along with their co...
typename device_type::execution_space execution_space
The Kokkos execution space.
void packNew(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< char *, buffer_device_type > &exports, const Kokkos::DualView< size_t *, buffer_device_type > &numPacketsPerLID, size_t &constantNumPackets) const
Pack this object&#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.
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.
Kokkos::StaticCrsGraph< local_ordinal_type, Kokkos::LayoutLeft, device_type, void, size_t > local_graph_device_type
The type of the part of the sparse graph on each MPI process.
size_t getLocalNumCols() const override
The number of columns connected to the locally owned rows of this matrix.
void fillLocalGraphAndMatrix(const Teuchos::RCP< Teuchos::ParameterList > &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).
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.
std::shared_ptr< local_multiply_op_type > getLocalMultiplyOperator() const
The local sparse matrix operator (a wrapper of getLocalMatrixDevice() that supports local matrix-vect...
typename local_graph_device_type::HostMirror local_graph_host_type
The type of the part of the sparse graph on each MPI process.
void removeCrsMatrixZeros(CrsMatrixType &matrix, typename Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::magnitudeType const &threshold=Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::magnitude(Teuchos::ScalarTraits< typename CrsMatrixType::scalar_type >::zero()))
Remove zero entries from a matrix.
LocalOrdinal local_ordinal_type
The type of each local index in the matrix.
EStorageStatus
Status of the graph&#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.
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.