Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_CrsMatrix_decl.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Tpetra: Templated Linear Algebra Services Package
4//
5// Copyright 2008 NTESS and the Tpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TPETRA_CRSMATRIX_DECL_HPP
11#define TPETRA_CRSMATRIX_DECL_HPP
12
15
18#include "KokkosSparse_Utils.hpp"
19#include "KokkosSparse_CrsMatrix.hpp"
20#include "Tpetra_Details_MatrixApplyHelper.hpp"
21#include "Tpetra_RowMatrix_decl.hpp"
22#include "Tpetra_Exceptions.hpp"
23#include "Tpetra_DistObject.hpp"
24#include "Tpetra_CrsGraph.hpp"
25#include "Tpetra_Vector.hpp"
26#include "Tpetra_Details_PackTraits.hpp" // unused here, could delete
27#include "Tpetra_Details_ExecutionSpacesUser.hpp"
28#include "Teuchos_DataAccess.hpp"
29
30#include <memory> // std::shared_ptr
31
32namespace Tpetra {
33
34// Forward declaration for CrsMatrix::swap() test
35template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
36class crsMatrix_Swap_Tester;
37
89template <class CrsMatrixType>
90Teuchos::RCP<CrsMatrixType>
91importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
92 const Import<typename CrsMatrixType::local_ordinal_type,
93 typename CrsMatrixType::global_ordinal_type,
94 typename CrsMatrixType::node_type>& importer,
95 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
96 typename CrsMatrixType::global_ordinal_type,
97 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
98 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
99 typename CrsMatrixType::global_ordinal_type,
100 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
101 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
102
156template <class CrsMatrixType>
157Teuchos::RCP<CrsMatrixType>
158importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
159 const Import<typename CrsMatrixType::local_ordinal_type,
160 typename CrsMatrixType::global_ordinal_type,
161 typename CrsMatrixType::node_type>& rowImporter,
162 const Import<typename CrsMatrixType::local_ordinal_type,
163 typename CrsMatrixType::global_ordinal_type,
164 typename CrsMatrixType::node_type>& domainImporter,
165 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
166 typename CrsMatrixType::global_ordinal_type,
167 typename CrsMatrixType::node_type> >& domainMap,
168 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
169 typename CrsMatrixType::global_ordinal_type,
170 typename CrsMatrixType::node_type> >& rangeMap,
171 const Teuchos::RCP<Teuchos::ParameterList>& params);
172
206template <class CrsMatrixType>
207Teuchos::RCP<CrsMatrixType>
208exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
209 const Export<typename CrsMatrixType::local_ordinal_type,
210 typename CrsMatrixType::global_ordinal_type,
211 typename CrsMatrixType::node_type>& exporter,
212 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
213 typename CrsMatrixType::global_ordinal_type,
214 typename CrsMatrixType::node_type> >& domainMap = Teuchos::null,
215 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
216 typename CrsMatrixType::global_ordinal_type,
217 typename CrsMatrixType::node_type> >& rangeMap = Teuchos::null,
218 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
219
253template <class CrsMatrixType>
254Teuchos::RCP<CrsMatrixType>
255exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
256 const Export<typename CrsMatrixType::local_ordinal_type,
257 typename CrsMatrixType::global_ordinal_type,
258 typename CrsMatrixType::node_type>& rowExporter,
259 const Export<typename CrsMatrixType::local_ordinal_type,
260 typename CrsMatrixType::global_ordinal_type,
261 typename CrsMatrixType::node_type>& domainExporter,
262 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
263 typename CrsMatrixType::global_ordinal_type,
264 typename CrsMatrixType::node_type> >& domainMap,
265 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
266 typename CrsMatrixType::global_ordinal_type,
267 typename CrsMatrixType::node_type> >& rangeMap,
268 const Teuchos::RCP<Teuchos::ParameterList>& params);
269
272namespace Details {
273template <class SC, class LO, class GO, class NO>
278}
279
393template <class Scalar,
394 class LocalOrdinal,
395 class GlobalOrdinal,
396 class Node>
397class CrsMatrix : public RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>,
398 public DistObject<char, LocalOrdinal, GlobalOrdinal, Node>,
399 public Details::Spaces::User {
400 private:
401 using dist_object_type =
403 Node>;
405
406 public:
408
409
417 using device_type = typename Node::device_type;
419 using execution_space = typename device_type::execution_space;
421 using memory_space = typename device_type::memory_space;
422
427 using node_type = Node;
428
431
434
437
440
456 using mag_type = typename KokkosKernels::ArithTraits<impl_scalar_type>::mag_type;
457
460
463 using local_graph_host_type = typename crs_graph_type::local_graph_host_type;
464
468 KokkosSparse::CrsMatrix<impl_scalar_type,
471 void,
472 typename local_graph_device_type::size_type>;
473 using local_matrix_host_type =
474 typename local_matrix_device_type::host_mirror_type;
475
476 using row_ptrs_device_view_type =
477 typename row_matrix_type::row_ptrs_device_view_type;
478 using row_ptrs_host_view_type =
479 typename row_matrix_type::row_ptrs_host_view_type;
480
481 using local_inds_device_view_type =
482 typename row_matrix_type::local_inds_device_view_type;
483 using local_inds_host_view_type =
484 typename row_matrix_type::local_inds_host_view_type;
485 using nonconst_local_inds_host_view_type =
486 typename row_matrix_type::nonconst_local_inds_host_view_type;
487
488 using global_inds_device_view_type =
489 typename row_matrix_type::global_inds_device_view_type;
490 using global_inds_host_view_type =
491 typename row_matrix_type::global_inds_host_view_type;
492 using nonconst_global_inds_host_view_type =
493 typename row_matrix_type::nonconst_global_inds_host_view_type;
494
495 using values_device_view_type =
496 typename row_matrix_type::values_device_view_type;
497 using values_host_view_type =
498 typename row_matrix_type::values_host_view_type;
499 using nonconst_values_host_view_type =
500 typename row_matrix_type::nonconst_values_host_view_type;
501
503
505
508 GlobalOrdinal, Node>&) = default;
509
512 GlobalOrdinal, Node>&&) = default;
513
515 CrsMatrix&
517 GlobalOrdinal, Node>&) = default;
518
520 CrsMatrix&
522 GlobalOrdinal, Node>&&) = default;
523
537 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
538 const size_t maxNumEntriesPerRow,
539 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
540
553 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
554 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
555 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
556
575 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
576 const Teuchos::RCP<const map_type>& colMap,
577 const size_t maxNumEntPerRow,
578 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
579
598 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
599 const Teuchos::RCP<const map_type>& colMap,
600 const Teuchos::ArrayView<const size_t>& numEntPerRowToAlloc,
601 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
602
632 const Teuchos::RCP<const crs_graph_type>& graph,
633 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
634
659 explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
660 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
661
690 explicit CrsMatrix(const Teuchos::RCP<const crs_graph_type>& graph,
691 const typename local_matrix_device_type::values_type& values,
692 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
693
720 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
721 const Teuchos::RCP<const map_type>& colMap,
722 const typename local_graph_device_type::row_map_type& rowPointers,
723 const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
724 const typename local_matrix_device_type::values_type& values,
725 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
726
753 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
754 const Teuchos::RCP<const map_type>& colMap,
755 const Teuchos::ArrayRCP<size_t>& rowPointers,
756 const Teuchos::ArrayRCP<LocalOrdinal>& columnIndices,
757 const Teuchos::ArrayRCP<Scalar>& values,
758 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
759
781 CrsMatrix(const Teuchos::RCP<const map_type>& rowMap,
782 const Teuchos::RCP<const map_type>& colMap,
784 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
785
817 const Teuchos::RCP<const map_type>& rowMap,
818 const Teuchos::RCP<const map_type>& colMap,
819 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
820 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
821 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
822
828 const Teuchos::RCP<const map_type>& rowMap,
829 const Teuchos::RCP<const map_type>& colMap,
830 const Teuchos::RCP<const map_type>& domainMap,
831 const Teuchos::RCP<const map_type>& rangeMap,
832 const Teuchos::RCP<const import_type>& importer,
833 const Teuchos::RCP<const export_type>& exporter,
834 const Teuchos::RCP<Teuchos::ParameterList>& params =
835 Teuchos::null);
836
838 // This function in 'Copy' mode is only guaranteed to work correctly for matrices
839 // which are fillComplete.
841 const Teuchos::DataAccess copyOrView);
842
852 virtual ~CrsMatrix() = default;
853
854 // This friend declaration makes the clone() method work.
855 template <class S2, class LO2, class GO2, class N2>
856 friend class CrsMatrix;
857
858 // This friend declaration allows for fused residual calculation
859 template <class S2, class LO2, class GO2, class N2>
864
865 // This friend declaration allows for batching of apply calls
866 template <class MatrixArray, class MultiVectorArray>
867 friend void batchedApply(const MatrixArray& Matrices,
868 const typename std::remove_pointer<typename MultiVectorArray::value_type>::type& X,
870 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type alpha,
871 typename std::remove_pointer<typename MatrixArray::value_type>::type::scalar_type beta,
872 Teuchos::RCP<Teuchos::ParameterList> params);
873
874 public:
876
878
902 //
944 void
946 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
947 const Teuchos::ArrayView<const Scalar>& vals);
948
963 void
965 const LocalOrdinal numEnt,
966 const Scalar vals[],
967 const GlobalOrdinal inds[]);
968
1011 void
1012 insertLocalValues(const LocalOrdinal localRow,
1013 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1014 const Teuchos::ArrayView<const Scalar>& vals,
1015 const CombineMode CM = ADD);
1016
1036 void
1037 insertLocalValues(const LocalOrdinal localRow,
1038 const LocalOrdinal numEnt,
1039 const Scalar vals[],
1040 const LocalOrdinal cols[],
1041 const CombineMode CM = ADD);
1042
1043 protected:
1055 virtual LocalOrdinal
1057 const crs_graph_type& graph,
1058 const RowInfo& rowInfo,
1059 const GlobalOrdinal inds[],
1060 const impl_scalar_type newVals[],
1061 const LocalOrdinal numElts);
1062
1063 public:
1103 const Kokkos::View<const global_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1104 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1105
1110 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1111 const Teuchos::ArrayView<const Scalar>& vals);
1112
1129 const LocalOrdinal numEnt,
1130 const Scalar vals[],
1131 const GlobalOrdinal cols[]);
1132
1133 protected:
1145 virtual LocalOrdinal
1147 const crs_graph_type& graph,
1148 const RowInfo& rowInfo,
1149 const LocalOrdinal inds[],
1150 const impl_scalar_type newVals[],
1151 const LocalOrdinal numElts);
1152
1153 public:
1191 const local_ordinal_type localRow,
1192 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1193 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals);
1194
1199 replaceLocalValues(const LocalOrdinal localRow,
1200 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1201 const Teuchos::ArrayView<const Scalar>& vals);
1202
1221 replaceLocalValues(const LocalOrdinal localRow,
1222 const LocalOrdinal numEnt,
1223 const Scalar inputVals[],
1224 const LocalOrdinal inputCols[]);
1225
1226 private:
1231 static const bool useAtomicUpdatesByDefault =
1232#ifdef KOKKOS_ENABLE_SERIAL
1233 !std::is_same<execution_space, Kokkos::Serial>::value;
1234#else
1235 true;
1236#endif // KOKKOS_ENABLE_SERIAL
1237
1261 protected:
1262 virtual LocalOrdinal
1264 const crs_graph_type& graph,
1265 const RowInfo& rowInfo,
1266 const GlobalOrdinal inds[],
1267 const impl_scalar_type newVals[],
1268 const LocalOrdinal numElts,
1269 const bool atomic = useAtomicUpdatesByDefault);
1270
1271 public:
1310 const Teuchos::ArrayView<const GlobalOrdinal>& cols,
1311 const Teuchos::ArrayView<const Scalar>& vals,
1312 const bool atomic = useAtomicUpdatesByDefault);
1313
1338 const LocalOrdinal numEnt,
1339 const Scalar vals[],
1340 const GlobalOrdinal cols[],
1341 const bool atomic = useAtomicUpdatesByDefault);
1342
1343 protected:
1357 virtual LocalOrdinal
1359 const crs_graph_type& graph,
1360 const RowInfo& rowInfo,
1361 const LocalOrdinal inds[],
1362 const impl_scalar_type newVals[],
1363 const LocalOrdinal numElts,
1364 const bool atomic = useAtomicUpdatesByDefault);
1365
1366 public:
1405 const local_ordinal_type localRow,
1406 const Kokkos::View<const local_ordinal_type*, Kokkos::AnonymousSpace>& inputInds,
1407 const Kokkos::View<const impl_scalar_type*, Kokkos::AnonymousSpace>& inputVals,
1408 const bool atomic = useAtomicUpdatesByDefault);
1409
1440 sumIntoLocalValues(const LocalOrdinal localRow,
1441 const Teuchos::ArrayView<const LocalOrdinal>& cols,
1442 const Teuchos::ArrayView<const Scalar>& vals,
1443 const bool atomic = useAtomicUpdatesByDefault);
1444
1467 sumIntoLocalValues(const LocalOrdinal localRow,
1468 const LocalOrdinal numEnt,
1469 const Scalar vals[],
1470 const LocalOrdinal cols[],
1471 const bool atomic = useAtomicUpdatesByDefault);
1472
1473 private:
1505 transformLocalValues(impl_scalar_type rowVals[],
1506 const crs_graph_type& graph,
1507 const RowInfo& rowInfo,
1508 const LocalOrdinal inds[],
1509 const impl_scalar_type newVals[],
1510 const LocalOrdinal numElts,
1511 std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1512 const bool atomic = useAtomicUpdatesByDefault);
1513
1545 transformGlobalValues(impl_scalar_type rowVals[],
1546 const crs_graph_type& graph,
1547 const RowInfo& rowInfo,
1548 const GlobalOrdinal inds[],
1549 const impl_scalar_type newVals[],
1550 const LocalOrdinal numElts,
1551 std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1552 const bool atomic = useAtomicUpdatesByDefault);
1553
1581 transformLocalValues(const LocalOrdinal lclRow,
1584 const LocalOrdinal inputCols[],
1585 std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1586 const bool atomic = useAtomicUpdatesByDefault);
1587
1615 transformGlobalValues(const GlobalOrdinal gblRow,
1618 const GlobalOrdinal inputCols[],
1619 std::function<impl_scalar_type(const impl_scalar_type&, const impl_scalar_type&)> f,
1620 const bool atomic = useAtomicUpdatesByDefault);
1621
1622 public:
1666 template <class LocalIndicesViewType,
1667 class ImplScalarViewType,
1668 class BinaryFunction>
1671 const typename UnmanagedView<LocalIndicesViewType>::type& inputInds,
1672 const typename UnmanagedView<ImplScalarViewType>::type& inputVals,
1674 const bool atomic = useAtomicUpdatesByDefault) {
1675 // We use static_assert here to check the template parameters,
1676 // rather than std::enable_if (e.g., on the return value, to
1677 // enable compilation only if the template parameters match the
1678 // desired attributes). This turns obscure link errors into
1679 // clear compilation errors. It also makes the return value a
1680 // lot easier to see.
1681 static_assert(Kokkos::is_view<LocalIndicesViewType>::value,
1682 "First template parameter LocalIndicesViewType must be "
1683 "a Kokkos::View.");
1684 static_assert(Kokkos::is_view<ImplScalarViewType>::value,
1685 "Second template parameter ImplScalarViewType must be a "
1686 "Kokkos::View.");
1687 static_assert(static_cast<int>(LocalIndicesViewType::rank) == 1,
1688 "First template parameter LocalIndicesViewType must "
1689 "have rank 1.");
1690 static_assert(static_cast<int>(ImplScalarViewType::rank) == 1,
1691 "Second template parameter ImplScalarViewType must have "
1692 "rank 1.");
1693 static_assert(std::is_same<
1694 typename LocalIndicesViewType::non_const_value_type,
1695 local_ordinal_type>::value,
1696 "First template parameter LocalIndicesViewType must "
1697 "contain values of type local_ordinal_type.");
1698 static_assert(std::is_same<
1699 typename ImplScalarViewType::non_const_value_type,
1700 impl_scalar_type>::value,
1701 "Second template parameter ImplScalarViewType must "
1702 "contain values of type impl_scalar_type.");
1703 typedef LocalOrdinal LO;
1704 const LO numInputEnt = inputInds.extent(0);
1705 if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1706 return Teuchos::OrdinalTraits<LO>::invalid();
1707 }
1708 return this->transformLocalValues(lclRow,
1710 inputVals.data(),
1711 inputInds.data(),
1712 f,
1713 atomic);
1714 }
1715
1757 template <class BinaryFunction, class InputMemorySpace>
1760 const Kokkos::View<const GlobalOrdinal*,
1762 Kokkos::MemoryUnmanaged>& inputInds,
1763 const Kokkos::View<const impl_scalar_type*,
1765 Kokkos::MemoryUnmanaged>& inputVals,
1767 const bool atomic = useAtomicUpdatesByDefault) {
1768 typedef LocalOrdinal LO;
1769 const LO numInputEnt = inputInds.extent(0);
1770 if (static_cast<LO>(inputVals.extent(0)) != numInputEnt) {
1771 return Teuchos::OrdinalTraits<LO>::invalid();
1772 }
1773 return this->transformGlobalValues(gblRow,
1775 inputVals.data(),
1776 inputInds.data(),
1777 f,
1778 atomic);
1779 }
1780
1782 void setAllToScalar(const Scalar& alpha);
1783
1785 void scale(const Scalar& alpha);
1786
1811 void
1812 setAllValues(const typename local_graph_device_type::row_map_type& ptr,
1813 const typename local_graph_device_type::entries_type::non_const_type& ind,
1814 const typename local_matrix_device_type::values_type& val);
1815
1836 void
1838
1863 void
1864 setAllValues(const Teuchos::ArrayRCP<size_t>& ptr,
1865 const Teuchos::ArrayRCP<LocalOrdinal>& ind,
1866 const Teuchos::ArrayRCP<Scalar>& val);
1867
1869 row_ptrs_host_view_type getLocalRowPtrsHost() const { return getCrsGraph()->getLocalRowPtrsHost(); }
1870
1872 row_ptrs_device_view_type getLocalRowPtrsDevice() const { return getCrsGraph()->getLocalRowPtrsDevice(); }
1873
1875 local_inds_host_view_type getLocalIndicesHost() const { return getCrsGraph()->getLocalIndicesHost(); }
1876
1878 local_inds_device_view_type getLocalIndicesDevice() const { return getCrsGraph()->getLocalIndicesDevice(); }
1879
1881
1883
1912 void globalAssemble();
1913
1927 void resumeFill(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1928
1986 void
1987 fillComplete(const Teuchos::RCP<const map_type>& domainMap,
1988 const Teuchos::RCP<const map_type>& rangeMap,
1989 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
1990
2017 void
2018 fillComplete(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2019
2046 void
2047 expertStaticFillComplete(const Teuchos::RCP<const map_type>& domainMap,
2048 const Teuchos::RCP<const map_type>& rangeMap,
2049 const Teuchos::RCP<const import_type>& importer = Teuchos::null,
2050 const Teuchos::RCP<const export_type>& exporter = Teuchos::null,
2051 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
2052
2070 void
2071 replaceColMap(const Teuchos::RCP<const map_type>& newColMap);
2072
2154 void
2156 const Teuchos::RCP<const map_type>& newColMap,
2157 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
2158 const bool sortEachRow = true);
2159
2169 void
2170 replaceDomainMap(const Teuchos::RCP<const map_type>& newDomainMap);
2171
2185 void
2186 replaceDomainMapAndImporter(const Teuchos::RCP<const map_type>& newDomainMap,
2187 Teuchos::RCP<const import_type>& newImporter);
2188
2198 void
2199 replaceRangeMap(const Teuchos::RCP<const map_type>& newRangeMap);
2200
2214 void
2215 replaceRangeMapAndExporter(const Teuchos::RCP<const map_type>& newRangeMap,
2216 Teuchos::RCP<const export_type>& newExporter);
2217
2231 virtual void
2232 removeEmptyProcessesInPlace(const Teuchos::RCP<const map_type>& newMap) override;
2233
2235
2237
2239 Teuchos::RCP<const Teuchos::Comm<int> > getComm() const override;
2240
2242 Teuchos::RCP<const map_type> getRowMap() const override;
2243
2245 Teuchos::RCP<const map_type> getColMap() const override;
2246
2248 Teuchos::RCP<const RowGraph<LocalOrdinal, GlobalOrdinal, Node> >
2249 getGraph() const override;
2250
2252 Teuchos::RCP<const crs_graph_type> getCrsGraph() const;
2253
2254 private:
2265 const crs_graph_type& getCrsGraphRef() const;
2266
2267 public:
2268#if __armclang_major__ == 22 && __armclang_minor__ == 1
2269 // On Stria, PR 13052 caused a 25% performance regression in the
2270 // CGSolve performance test that is fixed by forcing
2271 // getLocalMatrixDevice to always be inlined. Restrict the fix
2272 // to the specific toolchain where the problem was observed
2273#define TPETRA_DETAILS_ALWAYS_INLINE __attribute__((always_inline))
2274#else
2275#define TPETRA_DETAILS_ALWAYS_INLINE
2276#endif
2289 TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type
2290 getLocalMatrixDevice() const;
2291 local_matrix_host_type getLocalMatrixHost() const;
2292#undef TPETRA_DETAILS_ALWAYS_INLINE
2293
2313 global_size_t getGlobalNumRows() const override;
2314
2320 global_size_t getGlobalNumCols() const override;
2321
2328 size_t getLocalNumRows() const override;
2329
2333 size_t getLocalNumCols() const override;
2334
2336 GlobalOrdinal getIndexBase() const override;
2337
2339 global_size_t getGlobalNumEntries() const override;
2340
2342 size_t getLocalNumEntries() const override;
2343
2350 size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const override;
2351
2358 size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const override;
2359
2367 size_t getGlobalMaxNumRowEntries() const override;
2368
2376 size_t getLocalMaxNumRowEntries() const override;
2377
2379 virtual LocalOrdinal getBlockSize() const override { return 1; }
2380
2382 bool hasColMap() const override;
2383
2404 bool isLocallyIndexed() const override;
2405
2426 bool isGloballyIndexed() const override;
2427
2450 bool isFillComplete() const override;
2451
2474 bool isFillActive() const;
2475
2477
2483 bool isStorageOptimized() const;
2484
2486 bool isStaticGraph() const;
2487
2495 mag_type getNormInf() const;
2496
2500 //
2506 mag_type getNorm1(bool assumeSymmetric = false) const;
2507
2515 mag_type getFrobeniusNorm() const override;
2516
2519 virtual bool supportsRowViews() const override;
2520
2521 protected:
2522 using values_dualv_type =
2523 Kokkos::DualView<impl_scalar_type*, device_type>;
2524 using values_wdv_type =
2526 values_wdv_type valuesUnpacked_wdv;
2527 mutable values_wdv_type valuesPacked_wdv;
2528
2529 public:
2578 void
2580 nonconst_global_inds_host_view_type& Indices,
2581 nonconst_values_host_view_type& Values,
2582 size_t& NumEntries) const override;
2598 void
2600 nonconst_local_inds_host_view_type& Indices,
2601 nonconst_values_host_view_type& Values,
2602 size_t& NumEntries) const override;
2603
2616
2617 void
2619 global_inds_host_view_type& indices,
2620 values_host_view_type& values) const override;
2621
2634 void
2636 local_inds_host_view_type& indices,
2637 values_host_view_type& values) const override;
2638
2646
2653 void
2655
2699 void getLocalDiagOffsets(Teuchos::ArrayRCP<size_t>& offsets) const;
2700
2722 void
2724 const Kokkos::View<const size_t*, device_type,
2725 Kokkos::MemoryUnmanaged>& offsets) const;
2726
2749 void
2751 const Teuchos::ArrayView<const size_t>& offsets) const;
2752
2757 void
2759
2764 void
2766
2768
2770
2832 void
2835 const Teuchos::ETransp mode = Teuchos::NO_TRANS,
2836 const Scalar& alpha = Teuchos::ScalarTraits<Scalar>::one(),
2837 const Scalar& beta = Teuchos::ScalarTraits<Scalar>::zero()) const;
2838
2841 template <class T>
2842 Teuchos::RCP<CrsMatrix<T, LocalOrdinal, GlobalOrdinal, Node> >
2843 convert() const;
2844
2846
2848
2859 void
2862 Teuchos::ETransp mode = Teuchos::NO_TRANS,
2863 Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
2864 Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const override;
2865
2868 bool hasTransposeApply() const override;
2869
2876 Teuchos::RCP<const map_type> getDomainMap() const override;
2877
2884 Teuchos::RCP<const map_type> getRangeMap() const override;
2885
2887
2889
2900 virtual Teuchos::RCP<RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
2901 add(const Scalar& alpha,
2903 const Scalar& beta,
2904 const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& domainMap,
2905 const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& rangeMap,
2906 const Teuchos::RCP<Teuchos::ParameterList>& params) const override;
2907
2909
2911
2913 std::string description() const override;
2914
2917 void
2918 describe(Teuchos::FancyOStream& out,
2919 const Teuchos::EVerbosityLevel verbLevel =
2920 Teuchos::Describable::verbLevel_default) const override;
2921
2923
2925
2930 typedef typename DistObject<Scalar, LocalOrdinal, GlobalOrdinal,
2932
2933 virtual bool
2934 checkSizes(const SrcDistObject& source) override;
2935
2936 void
2937 applyCrsPadding(
2938 const typename crs_graph_type::padding_type& padding,
2939 const bool verbose);
2940
2941 private:
2942 void
2943 copyAndPermuteStaticGraph(
2945 const size_t numSameIDs,
2948 const size_t numPermutes);
2949
2950 void
2951 copyAndPermuteNonStaticGraph(
2953 const size_t numSameIDs,
2954 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs_dv,
2955 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs_dv,
2956 const size_t numPermutes);
2957
2958 protected:
2959 using dist_object_type::
2962
2963 virtual void
2965 const size_t numSameIDs,
2966 const Kokkos::DualView<
2967 const local_ordinal_type*,
2969 const Kokkos::DualView<
2970 const local_ordinal_type*,
2972 const CombineMode CM) override;
2973
2974 virtual void
2975 packAndPrepare(const SrcDistObject& source,
2976 const Kokkos::DualView<
2977 const local_ordinal_type*,
2979 Kokkos::DualView<char*, buffer_device_type>& exports,
2980 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2981 size_t& constantNumPackets) override;
2982
2987
2988 private:
2991 void
2992 unpackAndCombineImpl(
2993 const Kokkos::DualView<const local_ordinal_type*,
2995 Kokkos::DualView<char*, buffer_device_type> imports,
2996 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
2997 const size_t constantNumPackets,
2999 const bool verbose);
3000
3003 void
3004 unpackAndCombineImplNonStatic(
3005 const Kokkos::DualView<const local_ordinal_type*,
3007 Kokkos::DualView<char*, buffer_device_type> imports,
3008 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3009 const size_t constantNumPackets,
3010 const CombineMode combineMode);
3011
3012 public:
3022 void
3023 unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& importLIDs,
3024 Kokkos::DualView<char*, buffer_device_type> imports,
3025 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
3026 const size_t constantNumPackets,
3027 const CombineMode CM) override;
3028
3033
3139 void
3140 packNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3141 Kokkos::DualView<char*, buffer_device_type>& exports,
3142 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3143 size_t& constantNumPackets) const;
3144
3145 private:
3152 void
3153 packNonStaticNew(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
3154 Kokkos::DualView<char*, buffer_device_type>& exports,
3155 const Kokkos::DualView<size_t*, buffer_device_type>& numPacketsPerLID,
3156 size_t& constantNumPackets) const;
3157
3187 size_t
3188 packRow(char exports[],
3189 const size_t offset,
3190 const size_t numEnt,
3191 const GlobalOrdinal gidsIn[],
3192 const impl_scalar_type valsIn[],
3193 const size_t numBytesPerValue) const;
3194
3218 bool
3219 packRowStatic(char* const numEntOut,
3220 char* const valOut,
3221 char* const indOut,
3222 const size_t numEnt,
3223 const LocalOrdinal lclRow) const;
3224
3250 size_t
3251 unpackRow(GlobalOrdinal gidsOut[],
3253 const char imports[],
3254 const size_t offset,
3255 const size_t numBytes,
3256 const size_t numEnt,
3257 const size_t numBytesPerValue);
3258
3267 void
3268 allocatePackSpaceNew(Kokkos::DualView<char*, buffer_device_type>& exports,
3269 size_t& totalNumEntries,
3270 const Kokkos::DualView<const local_ordinal_type*,
3273
3274 public:
3276 typename local_matrix_host_type::values_type::const_type
3277 getLocalValuesHost(Access::ReadOnlyStruct s) const {
3278 return valuesPacked_wdv.getHostView(s);
3279 }
3280
3282 typename local_matrix_host_type::values_type
3283 getLocalValuesHost(Access::ReadWriteStruct s) {
3284 return valuesPacked_wdv.getHostView(s);
3285 }
3286
3288 typename local_matrix_host_type::values_type
3289 getLocalValuesHost(Access::OverwriteAllStruct s) {
3290 return valuesPacked_wdv.getHostView(s);
3291 }
3292
3294 typename local_matrix_device_type::values_type::const_type
3295 getLocalValuesDevice(Access::ReadOnlyStruct s) const {
3296 return valuesPacked_wdv.getDeviceView(s);
3297 }
3298
3300 typename local_matrix_device_type::values_type
3301 getLocalValuesDevice(Access::ReadWriteStruct s) {
3302 return valuesPacked_wdv.getDeviceView(s);
3303 }
3304
3306 typename local_matrix_device_type::values_type
3307 getLocalValuesDevice(Access::OverwriteAllStruct s) {
3308 return valuesPacked_wdv.getDeviceView(s);
3309 }
3310
3311 private:
3312 // Friend declaration for nonmember function.
3313 template <class CrsMatrixType>
3314 friend Teuchos::RCP<CrsMatrixType>
3315 Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3316 const Import<typename CrsMatrixType::local_ordinal_type,
3317 typename CrsMatrixType::global_ordinal_type,
3318 typename CrsMatrixType::node_type>& importer,
3319 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3320 typename CrsMatrixType::global_ordinal_type,
3321 typename CrsMatrixType::node_type> >& domainMap,
3322 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3323 typename CrsMatrixType::global_ordinal_type,
3324 typename CrsMatrixType::node_type> >& rangeMap,
3325 const Teuchos::RCP<Teuchos::ParameterList>& params);
3326
3327 // Friend declaration for nonmember function.
3328 template <class CrsMatrixType>
3329 friend Teuchos::RCP<CrsMatrixType>
3330 Tpetra::importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3331 const Import<typename CrsMatrixType::local_ordinal_type,
3332 typename CrsMatrixType::global_ordinal_type,
3333 typename CrsMatrixType::node_type>& rowImporter,
3334 const Import<typename CrsMatrixType::local_ordinal_type,
3335 typename CrsMatrixType::global_ordinal_type,
3336 typename CrsMatrixType::node_type>& domainImporter,
3337 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3338 typename CrsMatrixType::global_ordinal_type,
3339 typename CrsMatrixType::node_type> >& domainMap,
3340 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3341 typename CrsMatrixType::global_ordinal_type,
3342 typename CrsMatrixType::node_type> >& rangeMap,
3343 const Teuchos::RCP<Teuchos::ParameterList>& params);
3344
3345 // Friend declaration for nonmember function.
3346 template <class CrsMatrixType>
3347 friend Teuchos::RCP<CrsMatrixType>
3348 Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3349 const Export<typename CrsMatrixType::local_ordinal_type,
3350 typename CrsMatrixType::global_ordinal_type,
3351 typename CrsMatrixType::node_type>& exporter,
3352 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3353 typename CrsMatrixType::global_ordinal_type,
3354 typename CrsMatrixType::node_type> >& domainMap,
3355 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3356 typename CrsMatrixType::global_ordinal_type,
3357 typename CrsMatrixType::node_type> >& rangeMap,
3358 const Teuchos::RCP<Teuchos::ParameterList>& params);
3359
3360 // Friend declaration for nonmember function.
3361 template <class CrsMatrixType>
3362 friend Teuchos::RCP<CrsMatrixType>
3363 Tpetra::exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
3364 const Export<typename CrsMatrixType::local_ordinal_type,
3365 typename CrsMatrixType::global_ordinal_type,
3366 typename CrsMatrixType::node_type>& rowExporter,
3367 const Export<typename CrsMatrixType::local_ordinal_type,
3368 typename CrsMatrixType::global_ordinal_type,
3369 typename CrsMatrixType::node_type>& domainExporter,
3370 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3371 typename CrsMatrixType::global_ordinal_type,
3372 typename CrsMatrixType::node_type> >& domainMap,
3373 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
3374 typename CrsMatrixType::global_ordinal_type,
3375 typename CrsMatrixType::node_type> >& rangeMap,
3376 const Teuchos::RCP<Teuchos::ParameterList>& params);
3377
3378 public:
3394 void
3396 const import_type& importer,
3397 const Teuchos::RCP<const map_type>& domainMap,
3398 const Teuchos::RCP<const map_type>& rangeMap,
3399 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3400
3416 void
3418 const import_type& rowImporter,
3420 const Teuchos::RCP<const map_type>& domainMap,
3421 const Teuchos::RCP<const map_type>& rangeMap,
3422 const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3423
3439 void
3441 const export_type& exporter,
3442 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3443 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3444 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3445
3461 void
3463 const export_type& rowExporter,
3465 const Teuchos::RCP<const map_type>& domainMap,
3466 const Teuchos::RCP<const map_type>& rangeMap,
3467 const Teuchos::RCP<Teuchos::ParameterList>& params) const;
3468
3469 private:
3490 void
3491 transferAndFillComplete(Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& destMatrix,
3492 const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node>& rowTransfer,
3493 const Teuchos::RCP<const ::Tpetra::Details::Transfer<LocalOrdinal, GlobalOrdinal, Node> >& domainTransfer,
3494 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
3495 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
3496 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
3497
3509 protected:
3510 virtual void
3513 const GlobalOrdinal gblColInds[],
3514 const impl_scalar_type vals[],
3515 const size_t numInputEnt);
3516
3517 private:
3527 void
3528 insertGlobalValuesFiltered(
3530 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3531 const Teuchos::ArrayView<const Scalar>& values,
3532 const bool debug);
3533
3536 void
3537 insertGlobalValuesFilteredChecked(
3539 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3540 const Teuchos::ArrayView<const Scalar>& values,
3541 const char* const prefix,
3542 const bool debug,
3543 const bool verbose);
3544
3556 void
3557 combineGlobalValues(
3559 const Teuchos::ArrayView<const GlobalOrdinal>& columnIndices,
3560 const Teuchos::ArrayView<const Scalar>& values,
3562 const char* const prefix,
3563 const bool debug,
3564 const bool verbose);
3565
3588 combineGlobalValuesRaw(const LocalOrdinal lclRow,
3589 const LocalOrdinal numEnt,
3590 const impl_scalar_type vals[],
3591 const GlobalOrdinal cols[],
3593 const char* const prefix,
3594 const bool debug,
3595 const bool verbose);
3596
3608 template <class BinaryFunction>
3610 transformGlobalValues(const GlobalOrdinal globalRow,
3611 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3612 const Teuchos::ArrayView<const Scalar>& values,
3614 const bool atomic = useAtomicUpdatesByDefault) {
3615 typedef impl_scalar_type IST;
3616 typedef LocalOrdinal LO;
3617 typedef GlobalOrdinal GO;
3618
3619 const LO numInputEnt = static_cast<LO>(indices.size());
3620 if (static_cast<LO>(values.size()) != numInputEnt) {
3621 return Teuchos::OrdinalTraits<LO>::invalid();
3622 }
3623
3624 const GO* const inputCols = indices.getRawPtr();
3625 const IST* const inputVals =
3626 reinterpret_cast<const IST*>(values.getRawPtr());
3627 return this->transformGlobalValues(globalRow, numInputEnt, inputVals,
3628 inputCols, f, atomic);
3629 }
3630
3637 void
3638 insertNonownedGlobalValues(const GlobalOrdinal globalRow,
3639 const Teuchos::ArrayView<const GlobalOrdinal>& indices,
3640 const Teuchos::ArrayView<const Scalar>& values);
3641
3684 void
3685 insertIndicesAndValues(crs_graph_type& graph,
3686 RowInfo& rowInfo,
3687 const typename crs_graph_type::SLocalGlobalViews& newInds,
3688 const Teuchos::ArrayView<impl_scalar_type>& oldRowVals,
3689 const Teuchos::ArrayView<const impl_scalar_type>& newRowVals,
3690 const ELocalGlobal lg,
3691 const ELocalGlobal I);
3692
3693 protected:
3694 // useful typedefs
3695 typedef Teuchos::OrdinalTraits<LocalOrdinal> OTL;
3696 typedef KokkosKernels::ArithTraits<impl_scalar_type> STS;
3697 typedef KokkosKernels::ArithTraits<mag_type> STM;
3698 typedef MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV;
3699 typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> V;
3700 typedef crs_graph_type Graph;
3701
3702 // Enums
3703 enum GraphAllocationStatus {
3704 GraphAlreadyAllocated,
3705 GraphNotYetAllocated
3706 };
3707
3708 protected:
3727 void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas,
3728 const bool verbose);
3729
3744 void
3745 sortAndMergeIndicesAndValues(const bool sorted,
3746 const bool merged);
3747
3748 public:
3750 bool haveGlobalConstants() const;
3751
3752 protected:
3765 mutable Teuchos::RCP<MV> importMV_;
3766
3779 mutable Teuchos::RCP<MV> exportMV_;
3780
3800 Teuchos::RCP<MV>
3802 const bool force = false) const;
3803
3825 Teuchos::RCP<MV>
3827 const bool force = false) const;
3828
3830 void
3831 applyNonTranspose(const MV& X_in,
3832 MV& Y_in,
3833 Scalar alpha,
3834 Scalar beta) const;
3835
3837 void
3838 applyTranspose(const MV& X_in,
3839 MV& Y_in,
3840 const Teuchos::ETransp mode,
3841 Scalar alpha,
3842 Scalar beta) const;
3843
3844 // matrix data accessors
3845
3848 typename values_dualv_type::t_host::const_type
3849 getValuesViewHost(const RowInfo& rowinfo) const;
3850
3853 typename values_dualv_type::t_dev::const_type
3854 getValuesViewDevice(const RowInfo& rowinfo) const;
3855
3858 typename values_dualv_type::t_host
3860
3863 typename values_dualv_type::t_dev
3865
3866 private:
3867 // TODO: When KokkosKernels 4.4 is released, local_matrix_device_type can be permanently modified to use the default_size_type
3868 // 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).
3869 //
3870 // At that point the ApplyHelper can be replaced with just a SPMVHandle.
3871 using local_matrix_int_rowptrs_device_type =
3872 KokkosSparse::CrsMatrix<impl_scalar_type,
3875 void,
3876 int>;
3877
3881 local_matrix_int_rowptrs_device_type,
3882 typename MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::device_view_type>;
3883
3884 std::shared_ptr<ApplyHelper> getApplyHelper() const {
3885 if (!applyHelper) {
3886 auto A_lcl = getLocalMatrixDevice();
3887 applyHelper = std::make_shared<ApplyHelper>(A_lcl.nnz(), A_lcl.graph.row_map);
3888 }
3889 return applyHelper;
3890 }
3891
3892 protected:
3893 // Friend the tester for CrsMatrix::swap
3894 friend class Tpetra::crsMatrix_Swap_Tester<Scalar, LocalOrdinal, GlobalOrdinal, Node>;
3895
3896 // Friend the matrix multiply kernels so they can access internally-cached integer
3897 // row pointers without making them part of the CrsMatrix interface
3898 template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3899 friend struct Tpetra::MMdetails::KernelWrappers;
3900 template <typename S, typename LO, typename GO, typename NODE, typename LOV>
3901 friend struct Tpetra::MMdetails::KernelWrappers2;
3902
3903 // friend Matrix Matrix utility function that needs to access integer-typed rowptrs
3904 friend void Tpetra::MMdetails::import_and_extract_views<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
3905 const CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
3906 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > targetMap,
3907 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
3908 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > prototypeImporter,
3909 bool userAssertsThereAreNoRemotes,
3910 const std::string& label,
3911 const Teuchos::RCP<Teuchos::ParameterList>& params);
3912
3916 void swap(CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& matrix);
3917
3918 protected:
3924 void fillLocalMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3925
3931 void fillLocalGraphAndMatrix(const Teuchos::RCP<Teuchos::ParameterList>& params);
3932
3934 void checkInternalState() const;
3935
3947
3948 Teuchos::RCP<const Graph> staticGraph_;
3949 Teuchos::RCP<Graph> myGraph_;
3951
3952 protected:
3963 Details::STORAGE_1D_UNPACKED;
3964
3966 bool fillComplete_ = false;
3967
3995 std::map<GlobalOrdinal, std::pair<Teuchos::Array<GlobalOrdinal>,
3996 Teuchos::Array<Scalar> > >
3998
3999 private:
4005 mutable std::shared_ptr<ApplyHelper> applyHelper;
4006
4007 public:
4008 // FIXME (mfh 24 Feb 2014) Is it _really_ necessary to make this a
4009 // public inner class of CrsMatrix? It looks like it doesn't
4010 // depend on any implementation details of CrsMatrix at all. It
4011 // should really be declared and defined outside of CrsMatrix.
4012 template <class DestViewType, class SrcViewType,
4014 struct pack_functor {
4015 typedef typename DestViewType::execution_space execution_space;
4016 SrcViewType src_;
4017 DestViewType dst_;
4018 SrcOffsetViewType src_offset_;
4019 DestOffsetViewType dst_offset_;
4020 typedef typename DestOffsetViewType::non_const_value_type scalar_index_type;
4021
4022 pack_functor(DestViewType dst,
4023 const SrcViewType src,
4025 const SrcOffsetViewType src_offset)
4026 : src_(src)
4027 , dst_(dst)
4028 , src_offset_(src_offset)
4029 , dst_offset_(dst_offset) {}
4030
4032 void operator()(const LocalOrdinal row) const {
4033 scalar_index_type srcPos = src_offset_(row);
4034 const scalar_index_type dstEnd = dst_offset_(row + 1);
4035 scalar_index_type dstPos = dst_offset_(row);
4036 for (; dstPos < dstEnd; ++dstPos, ++srcPos) {
4037 dst_(dstPos) = src_(srcPos);
4038 }
4039 }
4040 };
4041}; // class CrsMatrix
4042
4047template <class Scalar,
4048 class LocalOrdinal,
4049 class GlobalOrdinal,
4050 class Node>
4051Teuchos::RCP<CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
4053 const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >& map,
4054 const size_t maxNumEntriesPerRow = 0,
4055 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
4056 using matrix_type =
4058 return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow,
4059 params));
4060}
4061
4062template <class CrsMatrixType>
4063Teuchos::RCP<CrsMatrixType>
4064importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4065 const Import<typename CrsMatrixType::local_ordinal_type,
4066 typename CrsMatrixType::global_ordinal_type,
4067 typename CrsMatrixType::node_type>& importer,
4068 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4069 typename CrsMatrixType::global_ordinal_type,
4070 typename CrsMatrixType::node_type> >& domainMap,
4071 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4072 typename CrsMatrixType::global_ordinal_type,
4073 typename CrsMatrixType::node_type> >& rangeMap,
4074 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4075 Teuchos::RCP<CrsMatrixType> destMatrix;
4076 sourceMatrix->importAndFillComplete(destMatrix, importer, domainMap, rangeMap, params);
4077 return destMatrix;
4078}
4079
4080template <class CrsMatrixType>
4081Teuchos::RCP<CrsMatrixType>
4082importAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4083 const Import<typename CrsMatrixType::local_ordinal_type,
4084 typename CrsMatrixType::global_ordinal_type,
4085 typename CrsMatrixType::node_type>& rowImporter,
4086 const Import<typename CrsMatrixType::local_ordinal_type,
4087 typename CrsMatrixType::global_ordinal_type,
4088 typename CrsMatrixType::node_type>& domainImporter,
4089 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4090 typename CrsMatrixType::global_ordinal_type,
4091 typename CrsMatrixType::node_type> >& domainMap,
4092 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4093 typename CrsMatrixType::global_ordinal_type,
4094 typename CrsMatrixType::node_type> >& rangeMap,
4095 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4096 Teuchos::RCP<CrsMatrixType> destMatrix;
4097 sourceMatrix->importAndFillComplete(destMatrix, rowImporter, domainImporter, domainMap, rangeMap, params);
4098 return destMatrix;
4099}
4100
4101template <class CrsMatrixType>
4102Teuchos::RCP<CrsMatrixType>
4103exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4104 const Export<typename CrsMatrixType::local_ordinal_type,
4105 typename CrsMatrixType::global_ordinal_type,
4106 typename CrsMatrixType::node_type>& exporter,
4107 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4108 typename CrsMatrixType::global_ordinal_type,
4109 typename CrsMatrixType::node_type> >& domainMap,
4110 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4111 typename CrsMatrixType::global_ordinal_type,
4112 typename CrsMatrixType::node_type> >& rangeMap,
4113 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4114 Teuchos::RCP<CrsMatrixType> destMatrix;
4115 sourceMatrix->exportAndFillComplete(destMatrix, exporter, domainMap, rangeMap, params);
4116 return destMatrix;
4117}
4118
4119template <class CrsMatrixType>
4120Teuchos::RCP<CrsMatrixType>
4121exportAndFillCompleteCrsMatrix(const Teuchos::RCP<const CrsMatrixType>& sourceMatrix,
4122 const Export<typename CrsMatrixType::local_ordinal_type,
4123 typename CrsMatrixType::global_ordinal_type,
4124 typename CrsMatrixType::node_type>& rowExporter,
4125 const Export<typename CrsMatrixType::local_ordinal_type,
4126 typename CrsMatrixType::global_ordinal_type,
4127 typename CrsMatrixType::node_type>& domainExporter,
4128 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4129 typename CrsMatrixType::global_ordinal_type,
4130 typename CrsMatrixType::node_type> >& domainMap,
4131 const Teuchos::RCP<const Map<typename CrsMatrixType::local_ordinal_type,
4132 typename CrsMatrixType::global_ordinal_type,
4133 typename CrsMatrixType::node_type> >& rangeMap,
4134 const Teuchos::RCP<Teuchos::ParameterList>& params) {
4135 Teuchos::RCP<CrsMatrixType> destMatrix;
4136 sourceMatrix->exportAndFillComplete(destMatrix, rowExporter, domainExporter, domainMap, rangeMap, params);
4137 return destMatrix;
4138}
4139
4146template <class CrsMatrixType>
4148 typename Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitudeType const& threshold =
4149 Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::magnitude(Teuchos::ScalarTraits<typename CrsMatrixType::scalar_type>::zero())) {
4150 auto localMatrix = matrix.getLocalMatrixDevice();
4151 size_t nnzBefore = localMatrix.nnz();
4152 localMatrix = KokkosSparse::removeCrsMatrixZeros(localMatrix, threshold);
4153 size_t localNNZRemoved = nnzBefore - localMatrix.nnz();
4154 // Skip the expertStaticFillComplete if no entries were removed on any process.
4155 // The fill complete can perform MPI collectives, so it can only be skipped on all processes or none.
4156 size_t globalNNZRemoved = 0;
4157 Teuchos::reduceAll<int, size_t>(*(matrix.getComm()), Teuchos::REDUCE_SUM, 1, &localNNZRemoved, &globalNNZRemoved);
4158 if (globalNNZRemoved != size_t(0)) {
4159 matrix.resumeFill();
4160 matrix.setAllValues(localMatrix);
4161 matrix.expertStaticFillComplete(matrix.getDomainMap(), matrix.getRangeMap());
4162 }
4163}
4164
4165} // namespace Tpetra
4166
4174#endif // TPETRA_CRSMATRIX_DECL_HPP
Forward declaration of Tpetra::CrsMatrix.
Declaration and generic definition of traits class that tells Tpetra::CrsMatrix how to pack and unpac...
Forward declaration of some Tpetra Matrix Matrix objects.
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
typename local_graph_device_type::host_mirror_type local_graph_host_type
The type of the part of the sparse graph on each MPI process.
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.
Sparse matrix that presents a row-oriented interface that lets users read or modify entries.
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.
bool isGloballyIndexed() const override
Whether the matrix is globally indexed on the calling process.
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.
std::map< GlobalOrdinal, std::pair< Teuchos::Array< GlobalOrdinal >, Teuchos::Array< Scalar > > > nonlocals_
Nonlocal data added using insertGlobalValues().
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.
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.
CrsMatrix & operator=(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assignment.
void replaceRangeMap(const Teuchos::RCP< const map_type > &newRangeMap)
Replace the current range Map with the given objects.
Details::EStorageStatus storageStatus_
Status of the matrix's storage, when not in a fill-complete state.
typename device_type::execution_space execution_space
The Kokkos execution space.
void applyNonTranspose(const MV &X_in, MV &Y_in, Scalar alpha, Scalar beta) const
Special case of apply() for mode == Teuchos::NO_TRANS.
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.
CrsGraph< LocalOrdinal, GlobalOrdinal, Node > crs_graph_type
The CrsGraph specialization suitable for this CrsMatrix specialization.
Node node_type
This class' Kokkos Node type.
local_ordinal_type replaceGlobalValues(const global_ordinal_type globalRow, const Kokkos::View< const global_ordinal_type *, Kokkos::AnonymousSpace > &inputInds, const Kokkos::View< const impl_scalar_type *, Kokkos::AnonymousSpace > &inputVals)
Replace one or more entries' values, using global indices.
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 > &rowImporter, const Import< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &domainImporter, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > &params)
Nonmember CrsMatrix constructor that fuses Import and fillComplete().
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
size_t getGlobalMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, over all processes in the matrix's communicator.
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,...
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 scale(const Scalar &alpha)
Scale the matrix's values: this := alpha*this.
GlobalOrdinal global_ordinal_type
The type of each global index in the matrix.
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...
void packNew(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< char *, buffer_device_type > &exports, const Kokkos::DualView< size_t *, buffer_device_type > &numPacketsPerLID, size_t &constantNumPackets) const
Pack this object's data for an Import or Export.
size_t getLocalNumCols() const override
The number of columns connected to the locally owned rows of this matrix.
Teuchos::RCP< const map_type > getDomainMap() const override
The domain Map of this matrix.
bool hasColMap() const override
Whether the matrix has a well-defined column Map.
row_ptrs_host_view_type getLocalRowPtrsHost() const
Get a host view of the CRS packed row pointers.
mag_type getNormInf() const
Compute and return the infinity norm of the matrix.
Teuchos::RCP< CrsMatrix< T, LocalOrdinal, GlobalOrdinal, Node > > convert() const
Return another CrsMatrix with the same entries, but converted to a different Scalar type T.
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...
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.
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...
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.
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.
CrsMatrix(CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move constructor.
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.
DistObject< Scalar, LocalOrdinal, GlobalOrdinal, Node >::buffer_device_type buffer_device_type
Kokkos::Device specialization for communication buffers.
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.
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< 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...
Teuchos::RCP< MV > exportMV_
Row Map MultiVector used in apply().
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
The communicator over which the matrix is distributed.
bool isFillActive() const
Whether the matrix is not fill complete.
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.
local_matrix_host_type::values_type getLocalValuesHost(Access::ReadWriteStruct s)
Get the Kokkos local values on host, read write.
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.
mag_type getNorm1(bool assumeSymmetric=false) const
Compute and return the 1-norm of the matrix.
virtual ~CrsMatrix()=default
Destructor (virtual for memory safety of derived classes).
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.
mag_type getFrobeniusNorm() const override
Compute and return the Frobenius norm of the matrix.
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.
global_size_t getGlobalNumCols() const override
The number of global columns in the matrix.
Teuchos::RCP< const map_type > getRangeMap() const override
The range Map of this matrix.
Teuchos::RCP< MV > importMV_
Column Map MultiVector used in apply().
void allocateValues(ELocalGlobal lg, GraphAllocationStatus gas, const bool verbose)
Allocate values (and optionally indices) using the Node.
size_t getLocalNumEntries() const override
The local number of entries in this matrix.
typename Node::device_type device_type
The Kokkos device type.
typename KokkosKernels::ArithTraits< impl_scalar_type >::mag_type mag_type
Type of a norm result.
bool fillComplete_
Whether the matrix is fill complete.
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.
void replaceDomainMap(const Teuchos::RCP< const map_type > &newDomainMap)
Replace the current domain Map with the given objects.
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.
std::string description() const override
A one-line description of this object.
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...
Teuchos::RCP< MV > getColumnMapMultiVector(const MV &X_domainMap, const bool force=false) const
Create a (or fetch a cached) column Map MultiVector.
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...
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.
size_t getLocalMaxNumRowEntries() const override
Maximum number of entries in any row of the matrix, on this process.
void replaceColMap(const Teuchos::RCP< const map_type > &newColMap)
Replace the matrix's column Map with the given Map.
global_size_t getGlobalNumRows() const override
Number of global elements in the row map of this matrix.
local_matrix_host_type::values_type::const_type getLocalValuesHost(Access::ReadOnlyStruct s) const
Get the Kokkos local values on host, read only.
void globalAssemble()
Communicate nonlocal contributions to other processes.
void checkInternalState() const
Check that this object's state is sane; throw if it's not.
bool hasTransposeApply() const override
Whether apply() allows applying the transpose or conjugate transpose.
GlobalOrdinal getIndexBase() const override
The index base for global indices for this matrix.
LocalOrdinal local_ordinal_type
The type of each local index in the matrix.
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,...
void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to alpha.
void fillLocalGraphAndMatrix(const Teuchos::RCP< Teuchos::ParameterList > &params)
Fill data into the local graph and matrix.
row_ptrs_device_view_type getLocalRowPtrsDevice() const
Get a device view of the CRS packed row pointers.
Export< LocalOrdinal, GlobalOrdinal, Node > export_type
The Export specialization suitable for this CrsMatrix specialization.
local_inds_host_view_type getLocalIndicesHost() const
Get a host view of the CRS packed column indicies.
TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type getLocalMatrixDevice() const
The local sparse matrix.
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.
Teuchos::RCP< const map_type > getColMap() const override
The Map that describes the column distribution in this matrix.
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.
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...
typename crs_graph_type::local_graph_device_type local_graph_device_type
The part of the sparse matrix's graph on each MPI process.
void 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 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.
Teuchos::RCP< const RowGraph< LocalOrdinal, GlobalOrdinal, Node > > getGraph() const override
This matrix's graph, as a RowGraph.
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
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap) override
Remove processes owning zero rows from the Maps and their communicator.
local_matrix_device_type::values_type getLocalValuesDevice(Access::ReadWriteStruct s)
Get the Kokkos local values on device, read write.
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.
void swap(CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &matrix)
Swaps the data from *this with the data and maps from crsMatrix.
bool isStaticGraph() const
Indicates that the graph is static, so that new entries cannot be added to this matrix.
global_size_t getGlobalNumEntries() const override
The global number of entries in this matrix.
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.
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().
size_t getLocalNumRows() const override
The number of matrix rows owned by the calling process.
bool isFillComplete() const override
Whether the matrix is fill complete.
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...
virtual bool checkSizes(const SrcDistObject &source) override
Compare the source and target (this) objects for compatibility.
Teuchos::RCP< const map_type > getRowMap() const override
The Map that describes the row distribution in this matrix.
typename device_type::memory_space memory_space
The Kokkos memory space.
local_matrix_device_type::values_type getLocalValuesDevice(Access::OverwriteAllStruct s)
Get the Kokkos local values on device, overwrite all.
local_ordinal_type replaceLocalValues(const local_ordinal_type localRow, const Kokkos::View< const local_ordinal_type *, Kokkos::AnonymousSpace > &inputInds, const Kokkos::View< const impl_scalar_type *, Kokkos::AnonymousSpace > &inputVals)
Replace one or more entries' values, using local row and column indices.
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.
local_matrix_host_type::values_type getLocalValuesHost(Access::OverwriteAllStruct s)
Get the Kokkos local values on host, overwrite all.
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).
CrsMatrix(const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy constructor.
bool isLocallyIndexed() const override
Whether the matrix is locally indexed on the calling process.
typename row_matrix_type::impl_scalar_type impl_scalar_type
The type used internally in place of Scalar.
Teuchos::RCP< MV > getRowMapMultiVector(const MV &Y_rangeMap, const bool force=false) const
Create a (or fetch a cached) row Map MultiVector.
local_matrix_device_type::values_type::const_type getLocalValuesDevice(Access::ReadOnlyStruct s) const
Get the Kokkos local values on device, read only.
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.
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...
void resumeFill(const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)
Resume operations that may change the values or structure of the matrix.
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &offsets) const
Get offsets of the diagonal entries in the matrix.
void fillLocalMatrix(const Teuchos::RCP< Teuchos::ParameterList > &params)
Fill data into the local matrix.
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the right with the given Vector.
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 > &rowExporter, const Export< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > &domainExporter, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &domainMap, const Teuchos::RCP< const Map< typename CrsMatrixType::local_ordinal_type, typename CrsMatrixType::global_ordinal_type, typename CrsMatrixType::node_type > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > &params)
Nonmember CrsMatrix constructor that fuses Export and fillComplete().
bool isStorageOptimized() const
Returns true if storage has been optimized.
Import< LocalOrdinal, GlobalOrdinal, Node > import_type
The Import specialization suitable for this CrsMatrix specialization.
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< 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().
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).
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x) override
Scale the matrix on the left with the given Vector.
CrsMatrix & operator=(CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move assignment.
virtual bool supportsRowViews() const override
Return true if getLocalRowView() and getGlobalRowView() are valid for this object.
local_inds_device_view_type getLocalIndicesDevice() const
Get a device_view of the CRS packed column indicies.
Teuchos::RCP< const crs_graph_type > getCrsGraph() const
This matrix's graph, as a CrsGraph.
virtual LocalOrdinal getBlockSize() const override
The number of degrees of freedom per mesh point.
Struct that holds views of the contents of a CrsMatrix.
Keep track of how much more space a CrsGraph or CrsMatrix needs, when the graph or matrix is the targ...
A class can inherit from this if it wants to use Tpetra managed spaces.
A wrapper around Kokkos::DualView to safely manage data that might be replicated between host and dev...
Base class for distributed Tpetra objects that support data redistribution.
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).
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.
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
A parallel distribution of indices over processes.
One or more distributed dense vectors.
A read-only, row-oriented interface to a sparse matrix.
typename KokkosKernels::ArithTraits< Scalar >::val_type impl_scalar_type
The type used internally in place of Scalar.
Abstract base class for objects that can be the source of an Import or Export operation.
Implementation details of Tpetra.
EStorageStatus
Status of the graph's or matrix's storage, when not in a fill-complete state.
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.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
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().
size_t global_size_t
Global size_t object.
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().
CombineMode
Rule for combining data in an Import or Export.
@ ADD
Sum new values.
Allocation information for a locally owned row in a CrsGraph or CrsMatrix.