Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_CrsGraph_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_CRSGRAPH_DECL_HPP
11#define TPETRA_CRSGRAPH_DECL_HPP
12
15
19#include "Tpetra_DistObject.hpp"
20#include "Tpetra_Exceptions.hpp"
21#include "Tpetra_RowGraph.hpp"
22#include "Tpetra_Util.hpp" // need this here for sort2
23#include "Tpetra_Details_WrappedDualView.hpp"
24
25#include "KokkosSparse_findRelOffset.hpp"
26#include "Kokkos_DualView.hpp"
27
28#include "Teuchos_CommHelpers.hpp"
29#include "Teuchos_Describable.hpp"
30#include "Teuchos_OrdinalTraits.hpp"
31#include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
32
33#include "KokkosSparse_StaticCrsGraph.hpp"
34
35#include <functional> // std::function
36#include <memory>
37
38namespace Tpetra {
39
40// Forward declaration for CrsGraph::swap() test
41template <class LocalOrdinal, class GlobalOrdinal, class Node>
42class crsGraph_Swap_Tester;
43
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
45namespace Details {
46template <class LocalOrdinal,
47 class GlobalOrdinal>
48class CrsPadding;
49} // namespace Details
50
51namespace { // (anonymous)
52
53template <class ViewType>
54struct UnmanagedView {
55 static_assert(Kokkos::is_view<ViewType>::value,
56 "ViewType must be a Kokkos::View specialization.");
57 // FIXME (mfh 02 Dec 2015) Right now, this strips away other
58 // memory traits. Christian will add an "AllTraits" enum which is
59 // the enum value of MemoryTraits<T>, that will help us fix this.
60 typedef Kokkos::View<typename ViewType::data_type,
61 typename ViewType::array_layout,
62 typename ViewType::device_type,
63 Kokkos::MemoryUnmanaged>
64 type;
65};
66
67} // namespace
68#endif // DOXYGEN_SHOULD_SKIP_THIS
69
78struct RowInfo {
79 size_t localRow;
80 size_t allocSize;
81 size_t numEntries;
82 size_t offset1D;
83};
84
85enum ELocalGlobal {
86 LocalIndices,
87 GlobalIndices
88};
89
90namespace Details {
122 STORAGE_1D_UNPACKED, //<! 1-D "unpacked" storage
123 STORAGE_1D_PACKED, //<! 1-D "packed" storage
124 STORAGE_UB //<! Invalid value; upper bound on enum values
125};
126
127} // namespace Details
128
187template <class LocalOrdinal,
188 class GlobalOrdinal,
189 class Node>
190class CrsGraph : public RowGraph<LocalOrdinal, GlobalOrdinal, Node>,
191 public DistObject<GlobalOrdinal,
192 LocalOrdinal,
193 GlobalOrdinal,
194 Node>,
195 public Teuchos::ParameterListAcceptorDefaultBase {
196 template <class S, class LO, class GO, class N>
197 friend class CrsMatrix;
198 template <class LO2, class GO2, class N2>
199 friend class CrsGraph;
200 template <class LO, class GO, class N>
201 friend class FECrsGraph;
202
205
206 public:
212 using device_type = typename Node::device_type;
214 using execution_space = typename device_type::execution_space;
215
220 using node_type = Node;
221
224 KokkosSparse::StaticCrsGraph<local_ordinal_type, Kokkos::LayoutLeft,
225 device_type, void, size_t>;
226
228#if KOKKOS_VERSION >= 40799
229 using local_graph_host_type = typename local_graph_device_type::host_mirror_type;
230#else
231 using local_graph_host_type = typename local_graph_device_type::HostMirror;
232#endif
233
240
241 public:
242 // Types used for CrsGraph's storage of local column indices
243 using local_inds_dualv_type =
244 Kokkos::DualView<local_ordinal_type*, device_type>;
245 using local_inds_wdv_type =
247
248 // Types used for CrsGraph's storage of global column indices
249 using global_inds_dualv_type =
250 Kokkos::DualView<global_ordinal_type*, device_type>;
253
254 public:
256 using row_ptrs_device_view_type =
257 typename row_graph_type::row_ptrs_device_view_type;
258 using row_ptrs_host_view_type =
259 typename row_graph_type::row_ptrs_host_view_type;
260
263 typename row_graph_type::local_inds_device_view_type;
264 using local_inds_host_view_type =
265 typename row_graph_type::local_inds_host_view_type;
266 using nonconst_local_inds_host_view_type =
267 typename row_graph_type::nonconst_local_inds_host_view_type;
268
271 typename row_graph_type::global_inds_device_view_type;
272 using global_inds_host_view_type =
273 typename row_graph_type::global_inds_host_view_type;
274 using nonconst_global_inds_host_view_type =
275 typename row_graph_type::nonconst_global_inds_host_view_type;
276
277 using offset_device_view_type =
278 typename row_ptrs_device_view_type::non_const_type;
279
281
282
295 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
296 const size_t maxNumEntriesPerRow,
297 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
298
311 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
312 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
313 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
314
328 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
329 const Teuchos::ArrayView<const size_t>& numEntPerRow,
330 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
331
344
348 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
349 const Teuchos::RCP<const map_type>& colMap,
350 const size_t maxNumEntriesPerRow,
351 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
352
367 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
368 const Teuchos::RCP<const map_type>& colMap,
369 const Kokkos::DualView<const size_t*, device_type>& numEntPerRow,
370 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
371
387 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
388 const Teuchos::RCP<const map_type>& colMap,
389 const Teuchos::ArrayView<const size_t>& numEntPerRow,
390 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
391
404 const Teuchos::RCP<const map_type>& rowMap,
405 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
406
429 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
430 const Teuchos::RCP<const map_type>& colMap,
431 const typename local_graph_device_type::row_map_type& rowPointers,
432 const typename local_graph_device_type::entries_type::non_const_type& columnIndices,
433 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
434
457 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
458 const Teuchos::RCP<const map_type>& colMap,
459 const Teuchos::ArrayRCP<size_t>& rowPointers,
460 const Teuchos::ArrayRCP<local_ordinal_type>& columnIndices,
461 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
462
484 CrsGraph(const Teuchos::RCP<const map_type>& rowMap,
485 const Teuchos::RCP<const map_type>& colMap,
487 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
488
516 const Teuchos::RCP<const map_type>& rowMap,
517 const Teuchos::RCP<const map_type>& colMap,
518 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
519 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
520 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
521
527 const Teuchos::RCP<const map_type>& rowMap,
528 const Teuchos::RCP<const map_type>& colMap,
529 const Teuchos::RCP<const map_type>& domainMap,
530 const Teuchos::RCP<const map_type>& rangeMap,
531 const Teuchos::RCP<const import_type>& importer,
532 const Teuchos::RCP<const export_type>& exporter,
533 const Teuchos::RCP<Teuchos::ParameterList>& params =
534 Teuchos::null);
535
577 CrsGraph(const row_ptrs_device_view_type& rowPointers,
579 const Teuchos::RCP<const map_type>& rowMap,
580 const Teuchos::RCP<const map_type>& colMap,
581 const Teuchos::RCP<const map_type>& domainMap,
582 const Teuchos::RCP<const map_type>& rangeMap,
583 const Teuchos::RCP<const import_type>& importer,
584 const Teuchos::RCP<const export_type>& exporter,
585 const Teuchos::RCP<Teuchos::ParameterList>& params =
586 Teuchos::null);
587
590
593
596
599
609 virtual ~CrsGraph() = default;
610
638
656
658
660
662 void
663 setParameterList(const Teuchos::RCP<Teuchos::ParameterList>& params) override;
664
666 Teuchos::RCP<const Teuchos::ParameterList>
667 getValidParameters() const override;
668
670
672
694 void
696 const Teuchos::ArrayView<const global_ordinal_type>& indices);
697
704 void
707 const global_ordinal_type inds[]);
708
710
724 void
726 const Teuchos::ArrayView<const local_ordinal_type>& indices);
727
734 void
737 const local_ordinal_type inds[]);
738
740
750
752
754
762 void globalAssemble();
763
782 void
783 resumeFill(const Teuchos::RCP<Teuchos::ParameterList>& params =
784 Teuchos::null);
785
823 void
824 fillComplete(const Teuchos::RCP<const map_type>& domainMap,
825 const Teuchos::RCP<const map_type>& rangeMap,
826 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
827
855 void
856 fillComplete(const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
857
886 void
887 expertStaticFillComplete(const Teuchos::RCP<const map_type>& domainMap,
888 const Teuchos::RCP<const map_type>& rangeMap,
889 const Teuchos::RCP<const import_type>& importer =
890 Teuchos::null,
891 const Teuchos::RCP<const export_type>& exporter =
892 Teuchos::null,
893 const Teuchos::RCP<Teuchos::ParameterList>& params =
894 Teuchos::null);
896
898
900 Teuchos::RCP<const Teuchos::Comm<int>> getComm() const override;
901
903 Teuchos::RCP<const map_type> getRowMap() const override;
904
906 Teuchos::RCP<const map_type> getColMap() const override;
907
909 Teuchos::RCP<const map_type> getDomainMap() const override;
910
912 Teuchos::RCP<const map_type> getRangeMap() const override;
913
915 Teuchos::RCP<const import_type> getImporter() const override;
916
918 Teuchos::RCP<const export_type> getExporter() const override;
919
921
923 global_size_t getGlobalNumRows() const override;
924
926
929 global_size_t getGlobalNumCols() const override;
930
932 size_t getLocalNumRows() const override;
933
935
937 size_t getLocalNumCols() const override;
938
940 global_ordinal_type getIndexBase() const override;
941
943
945 global_size_t getGlobalNumEntries() const override;
946
956 size_t getLocalNumEntries() const override;
957
959
960 size_t
962
969 size_t
970 getNumEntriesInLocalRow(local_ordinal_type localRow) const override;
971
991 size_t getLocalAllocationSize() const;
992
1001
1010
1024 size_t getGlobalMaxNumRowEntries() const override;
1025
1030 size_t getLocalMaxNumRowEntries() const override;
1031
1047 bool hasColMap() const override;
1048
1056 bool isLocallyIndexed() const override;
1057
1065 bool isGloballyIndexed() const override;
1066
1068 bool isFillComplete() const override;
1069
1071 bool isFillActive() const;
1072
1080 bool isSorted() const;
1081
1083
1089 bool isStorageOptimized() const;
1090
1096 void
1098 nonconst_global_inds_host_view_type& gblColInds,
1099 size_t& numColInds) const override;
1100
1108 void
1110 nonconst_local_inds_host_view_type& gblColInds,
1111 size_t& numColInds) const override;
1112
1123 void
1126 global_inds_host_view_type& gblColInds) const override;
1127
1130 bool supportsRowViews() const override;
1131
1142 void
1144 const LocalOrdinal lclRow,
1145 local_inds_host_view_type& lclColInds) const override;
1146
1148
1150
1152 std::string description() const override;
1153
1156 void
1157 describe(Teuchos::FancyOStream& out,
1158 const Teuchos::EVerbosityLevel verbLevel =
1159 Teuchos::Describable::verbLevel_default) const override;
1160
1162
1164
1172
1173 virtual bool
1174 checkSizes(const SrcDistObject& source) override;
1175
1176 using dist_object_type::
1179
1180 virtual void
1182 const size_t numSameIDs,
1183 const Kokkos::DualView<const local_ordinal_type*,
1185 const Kokkos::DualView<const local_ordinal_type*,
1187 const CombineMode CM) override;
1188
1189 void copyAndPermuteNew(
1190 const row_graph_type& source,
1192 const size_t numSameIDs,
1193 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs,
1194 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs,
1195 const CombineMode CM);
1196
1197 void insertGlobalIndicesDevice(
1200 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs,
1201 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs,
1203
1206
1207 void
1208 applyCrsPadding(const padding_type& padding,
1209 const bool verbose);
1210
1211 std::unique_ptr<padding_type>
1212 computeCrsPadding(
1214 node_type>& source,
1215 const size_t numSameIDs,
1216 const Kokkos::DualView<const local_ordinal_type*,
1218 const Kokkos::DualView<const local_ordinal_type*,
1220 const bool verbose) const;
1221
1222 // This actually modifies imports by sorting it.
1223 std::unique_ptr<padding_type>
1224 computeCrsPaddingForImports(
1225 const Kokkos::DualView<const local_ordinal_type*,
1227 Kokkos::DualView<packet_type*, buffer_device_type> imports,
1228 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
1229 const bool verbose) const;
1230
1231 std::unique_ptr<padding_type>
1232 computePaddingForCrsMatrixUnpack(
1233 const Kokkos::DualView<const local_ordinal_type*,
1235 Kokkos::DualView<char*, buffer_device_type> imports,
1236 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
1237 const bool verbose) const;
1238
1239 void
1240 computeCrsPaddingForSameIDs(
1243 node_type>& source,
1244 const local_ordinal_type numSameIDs) const;
1245
1246 void
1247 computeCrsPaddingForPermutedIDs(
1250 node_type>& source,
1251 const Kokkos::DualView<const local_ordinal_type*,
1253 const Kokkos::DualView<const local_ordinal_type*,
1255
1256 virtual void
1257 packAndPrepare(
1258 const SrcDistObject& source,
1259 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
1260 Kokkos::DualView<packet_type*, buffer_device_type>& exports,
1261 Kokkos::DualView<size_t*, buffer_device_type> numPacketsPerLID,
1262 size_t& constantNumPackets) override;
1263
1268
1269 virtual void
1270 pack(const Teuchos::ArrayView<const local_ordinal_type>& exportLIDs,
1271 Teuchos::Array<global_ordinal_type>& exports,
1272 const Teuchos::ArrayView<size_t>& numPacketsPerLID,
1273 size_t& constantNumPackets) const override;
1274
1275 void
1276 packFillActive(const Teuchos::ArrayView<const local_ordinal_type>& exportLIDs,
1277 Teuchos::Array<global_ordinal_type>& exports,
1278 const Teuchos::ArrayView<size_t>& numPacketsPerLID,
1279 size_t& constantNumPackets) const;
1280
1281 void
1282 packFillActiveNew(const Kokkos::DualView<const local_ordinal_type*,
1284 Kokkos::DualView<packet_type*,
1285 buffer_device_type>& exports,
1286 Kokkos::DualView<size_t*,
1289 size_t& constantNumPackets) const;
1290
1295
1296 virtual void
1297 unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*,
1299 Kokkos::DualView<packet_type*,
1301 imports,
1302 Kokkos::DualView<size_t*,
1305 const size_t constantNumPackets,
1306 const CombineMode combineMode) override;
1307
1309
1311
1354 void
1355 getLocalDiagOffsets(const Kokkos::View<size_t*, device_type, Kokkos::MemoryUnmanaged>& offsets) const;
1356
1358 void
1359 getLocalOffRankOffsets(offset_device_view_type& offsets) const;
1360
1370 void
1371 getLocalDiagOffsets(Teuchos::ArrayRCP<size_t>& offsets) const;
1372
1382 void
1383 setAllIndices(const typename local_graph_device_type::row_map_type& rowPointers,
1384 const typename local_graph_device_type::entries_type::non_const_type& columnIndices);
1385
1395 void
1396 setAllIndices(const Teuchos::ArrayRCP<size_t>& rowPointers,
1397 const Teuchos::ArrayRCP<local_ordinal_type>& columnIndices);
1398
1401 row_ptrs_host_view_type getLocalRowPtrsHost() const;
1402
1405 row_ptrs_device_view_type getLocalRowPtrsDevice() const;
1406
1408 local_inds_host_view_type getLocalIndicesHost() const;
1409
1412
1431 void replaceColMap(const Teuchos::RCP<const map_type>& newColMap);
1432
1452 void
1453 reindexColumns(const Teuchos::RCP<const map_type>& newColMap,
1454 const Teuchos::RCP<const import_type>& newImport = Teuchos::null,
1455 const bool sortIndicesInEachRow = true);
1456
1463 void
1464 replaceDomainMap(const Teuchos::RCP<const map_type>& newDomainMap);
1465
1479 void
1480 replaceDomainMapAndImporter(const Teuchos::RCP<const map_type>& newDomainMap,
1481 const Teuchos::RCP<const import_type>& newImporter);
1482
1489 void
1490 replaceRangeMap(const Teuchos::RCP<const map_type>& newRangeMap);
1491
1505 void
1506 replaceRangeMapAndExporter(const Teuchos::RCP<const map_type>& newRangeMap,
1507 const Teuchos::RCP<const export_type>& newExporter);
1508
1537 virtual void
1538 removeEmptyProcessesInPlace(const Teuchos::RCP<const map_type>& newMap) override;
1540
1541 template <class DestViewType, class SrcViewType,
1543 struct pack_functor {
1544 typedef typename DestViewType::execution_space execution_space;
1545 SrcViewType src;
1546 DestViewType dest;
1547 SrcOffsetViewType src_offset;
1548 DestOffsetViewType dest_offset;
1549 typedef typename DestOffsetViewType::non_const_value_type ScalarIndx;
1550
1551 pack_functor(DestViewType dest_,
1552 const SrcViewType src_,
1554 const SrcOffsetViewType src_offset_)
1555 : src(src_)
1556 , dest(dest_)
1557 , src_offset(src_offset_)
1558 , dest_offset(dest_offset_){};
1559
1561 void operator()(size_t row) const {
1562 ScalarIndx i = src_offset(row);
1563 ScalarIndx j = dest_offset(row);
1564 const ScalarIndx k = dest_offset(row + 1);
1565 for (; j < k; j++, i++) {
1566 dest(j) = src(i);
1567 }
1568 }
1569 };
1570
1571 private:
1572 // Friend declaration for nonmember function.
1573 template <class CrsGraphType>
1574 friend Teuchos::RCP<CrsGraphType>
1575 importAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
1576 const Import<typename CrsGraphType::local_ordinal_type,
1577 typename CrsGraphType::global_ordinal_type,
1578 typename CrsGraphType::node_type>& importer,
1579 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1580 typename CrsGraphType::global_ordinal_type,
1581 typename CrsGraphType::node_type>>& domainMap,
1582 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1583 typename CrsGraphType::global_ordinal_type,
1584 typename CrsGraphType::node_type>>& rangeMap,
1585 const Teuchos::RCP<Teuchos::ParameterList>& params);
1586
1587 // Friend declaration for nonmember function.
1588 template <class CrsGraphType>
1589 friend Teuchos::RCP<CrsGraphType>
1590 importAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
1591 const Import<typename CrsGraphType::local_ordinal_type,
1592 typename CrsGraphType::global_ordinal_type,
1593 typename CrsGraphType::node_type>& rowImporter,
1594 const Import<typename CrsGraphType::local_ordinal_type,
1595 typename CrsGraphType::global_ordinal_type,
1596 typename CrsGraphType::node_type>& domainImporter,
1597 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1598 typename CrsGraphType::global_ordinal_type,
1599 typename CrsGraphType::node_type>>& domainMap,
1600 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1601 typename CrsGraphType::global_ordinal_type,
1602 typename CrsGraphType::node_type>>& rangeMap,
1603 const Teuchos::RCP<Teuchos::ParameterList>& params);
1604
1605 // Friend declaration for nonmember function.
1606 template <class CrsGraphType>
1607 friend Teuchos::RCP<CrsGraphType>
1608 exportAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
1609 const Export<typename CrsGraphType::local_ordinal_type,
1610 typename CrsGraphType::global_ordinal_type,
1611 typename CrsGraphType::node_type>& exporter,
1612 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1613 typename CrsGraphType::global_ordinal_type,
1614 typename CrsGraphType::node_type>>& domainMap,
1615 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1616 typename CrsGraphType::global_ordinal_type,
1617 typename CrsGraphType::node_type>>& rangeMap,
1618 const Teuchos::RCP<Teuchos::ParameterList>& params);
1619
1620 // Friend declaration for nonmember function.
1621 template <class CrsGraphType>
1622 friend Teuchos::RCP<CrsGraphType>
1623 exportAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
1624 const Export<typename CrsGraphType::local_ordinal_type,
1625 typename CrsGraphType::global_ordinal_type,
1626 typename CrsGraphType::node_type>& rowExporter,
1627 const Export<typename CrsGraphType::local_ordinal_type,
1628 typename CrsGraphType::global_ordinal_type,
1629 typename CrsGraphType::node_type>& domainExporter,
1630 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1631 typename CrsGraphType::global_ordinal_type,
1632 typename CrsGraphType::node_type>>& domainMap,
1633 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
1634 typename CrsGraphType::global_ordinal_type,
1635 typename CrsGraphType::node_type>>& rangeMap,
1636 const Teuchos::RCP<Teuchos::ParameterList>& params);
1637
1638 public:
1654 void
1655 importAndFillComplete(Teuchos::RCP<CrsGraph<local_ordinal_type, global_ordinal_type, Node>>& destGraph,
1656 const import_type& importer,
1657 const Teuchos::RCP<const map_type>& domainMap,
1658 const Teuchos::RCP<const map_type>& rangeMap,
1659 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
1660
1676 void
1677 importAndFillComplete(Teuchos::RCP<CrsGraph<local_ordinal_type, global_ordinal_type, Node>>& destGraph,
1678 const import_type& rowImporter,
1679 const import_type& domainImporter,
1680 const Teuchos::RCP<const map_type>& domainMap,
1681 const Teuchos::RCP<const map_type>& rangeMap,
1682 const Teuchos::RCP<Teuchos::ParameterList>& params) const;
1683
1699 void
1700 exportAndFillComplete(Teuchos::RCP<CrsGraph<local_ordinal_type, global_ordinal_type, Node>>& destGraph,
1701 const export_type& exporter,
1702 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
1703 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
1704 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
1705
1721 void
1722 exportAndFillComplete(Teuchos::RCP<CrsGraph<local_ordinal_type, global_ordinal_type, Node>>& destGraph,
1723 const export_type& rowExporter,
1724 const export_type& domainExporter,
1725 const Teuchos::RCP<const map_type>& domainMap,
1726 const Teuchos::RCP<const map_type>& rangeMap,
1727 const Teuchos::RCP<Teuchos::ParameterList>& params) const;
1728
1729 private:
1750 void
1751 transferAndFillComplete(Teuchos::RCP<CrsGraph<local_ordinal_type, global_ordinal_type, Node>>& destGraph,
1752 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, Node>& rowTransfer,
1753 const Teuchos::RCP<const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, Node>>& domainTransfer,
1754 const Teuchos::RCP<const map_type>& domainMap = Teuchos::null,
1755 const Teuchos::RCP<const map_type>& rangeMap = Teuchos::null,
1756 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) const;
1757
1758 protected:
1759 // these structs are conveniences, to cut down on the number of
1760 // arguments to some of the methods below.
1761 struct SLocalGlobalViews {
1762 Teuchos::ArrayView<const global_ordinal_type> ginds;
1763 Teuchos::ArrayView<const local_ordinal_type> linds;
1764 };
1765 struct SLocalGlobalNCViews {
1766 Teuchos::ArrayView<global_ordinal_type> ginds;
1767 Teuchos::ArrayView<local_ordinal_type> linds;
1768 };
1769
1770 bool indicesAreAllocated() const;
1771
1772 void
1773 allocateIndices(const ELocalGlobal lg, const bool verbose = false);
1774
1776
1777
1787 void makeColMap(Teuchos::Array<int>& remotePIDs);
1788
1809 std::pair<size_t, std::string>
1810 makeIndicesLocal(const bool verbose = false);
1811
1820 void
1821 makeImportExport(Teuchos::Array<int>& remotePIDs,
1822 const bool useRemotePIDs);
1823
1825
1827
1862 size_t
1863 insertIndices(RowInfo& rowInfo,
1864 const SLocalGlobalViews& newInds,
1865 const ELocalGlobal lg,
1866 const ELocalGlobal I);
1867
1877 size_t
1879 const global_ordinal_type inputGblColInds[],
1880 const size_t numInputInds);
1881
1891 size_t
1892 insertGlobalIndicesImpl(const RowInfo& rowInfo,
1893 const global_ordinal_type inputGblColInds[],
1894 const size_t numInputInds,
1895 std::function<void(const size_t, const size_t, const size_t)> fun =
1896 std::function<void(const size_t, const size_t, const size_t)>());
1897
1898 void
1899 insertLocalIndicesImpl(const local_ordinal_type lclRow,
1900 const Teuchos::ArrayView<const local_ordinal_type>& gblColInds,
1901 std::function<void(const size_t, const size_t, const size_t)> fun =
1902 std::function<void(const size_t, const size_t, const size_t)>());
1903
1919 size_t
1920 findGlobalIndices(const RowInfo& rowInfo,
1921 const Teuchos::ArrayView<const global_ordinal_type>& indices,
1922 std::function<void(const size_t, const size_t, const size_t)> fun) const;
1923
1935 void
1937 const global_ordinal_type gblColInds[],
1938 const local_ordinal_type numGblColInds);
1939
1951 void
1953 const global_ordinal_type gblColInds[],
1954 const local_ordinal_type numGblColInds);
1955
1960 static const bool useAtomicUpdatesByDefault =
1961#ifdef KOKKOS_ENABLE_SERIAL
1962 !std::is_same<execution_space, Kokkos::Serial>::value;
1963#else
1964 true;
1965#endif // KOKKOS_ENABLE_SERIAL
1966
1968
1970
1972 bool isMerged() const;
1973
1979 void setLocallyModified();
1980
1981 private:
1986 void
1987 sortAndMergeAllIndices(const bool sorted, const bool merged);
1988
1989 // mfh 08 May 2017: I only restore "protected" here for backwards
1990 // compatibility.
1991 protected:
2001 const bool sorted,
2002 const bool merged);
2004
2014 void
2015 setDomainRangeMaps(const Teuchos::RCP<const map_type>& domainMap,
2016 const Teuchos::RCP<const map_type>& rangeMap);
2017
2018 void staticAssertions() const;
2019 void clearGlobalConstants();
2020
2021 public:
2024
2043
2044 bool haveLocalOffRankOffsets() const { return haveLocalOffRankOffsets_; }
2045
2046 protected:
2066 void computeLocalConstants();
2067
2070 RowInfo getRowInfo(const local_ordinal_type myRow) const;
2071
2084 RowInfo getRowInfoFromGlobalRowIndex(const global_ordinal_type gblRow) const;
2085
2086 public:
2095 local_graph_host_type getLocalGraphHost() const;
2096
2097 protected:
2098 void fillLocalGraph(const Teuchos::RCP<Teuchos::ParameterList>& params);
2099
2101 void checkInternalState() const;
2102
2106 void swap(CrsGraph<local_ordinal_type, global_ordinal_type, Node>& graph);
2107
2108 // Friend the tester for CrsGraph::swap
2109 friend class Tpetra::crsGraph_Swap_Tester<local_ordinal_type, global_ordinal_type, Node>;
2110
2112 Teuchos::RCP<const map_type> rowMap_;
2114 Teuchos::RCP<const map_type> colMap_;
2116 Teuchos::RCP<const map_type> rangeMap_;
2118 Teuchos::RCP<const map_type> domainMap_;
2119
2126 Teuchos::RCP<const import_type> importer_;
2127
2133 Teuchos::RCP<const export_type> exporter_;
2134
2140 Teuchos::OrdinalTraits<size_t>::invalid();
2141
2146 Teuchos::OrdinalTraits<global_size_t>::invalid();
2147
2153 Teuchos::OrdinalTraits<global_size_t>::invalid();
2154
2155 private:
2156 // Replacement for device view k_rowPtrs_
2157 // Device view rowPtrsUnpacked_dev_ takes place of k_rowPtrs_
2158 // Host view rowPtrsUnpacked_host_ takes place of copies and use of getEntryOnHost
2159 // Wish this could be a WrappedDualView, but deep_copies in DualView
2160 // don't work with const data views (e.g., StaticCrsGraph::row_map)
2161 // k_rowPtrs_ is offsets wrt the ALLOCATED indices array, not necessarily
2162 // the ACTUAL compressed indices array.
2163 // When !OptimizedStorage, k_rowPtrs_ may differ from ACTUAL compressed
2164 // indices array. (Karen is skeptical that !OptimizedStorage works)
2165 // When OptimizedStorage, rowPtrsUnpacked_ = k_rowPtrsPacked_
2166
2167 row_ptrs_device_view_type rowPtrsUnpacked_dev_;
2168 mutable row_ptrs_host_view_type rowPtrsUnpacked_host_;
2169
2170 // Row offsets into the actual graph local indices
2171 // Device view rowPtrsUnpacked_dev_ takes place of lclGraph_.row_map
2172
2173 row_ptrs_device_view_type rowPtrsPacked_dev_;
2174 mutable row_ptrs_host_view_type rowPtrsPacked_host_;
2175
2177 bool packedUnpackedRowPtrsMatch_ = false;
2178
2179 protected:
2180 void setRowPtrsUnpacked(const row_ptrs_device_view_type& dview) {
2181 packedUnpackedRowPtrsMatch_ = false;
2182 rowPtrsUnpacked_dev_ = dview;
2183 // Make sure stale host rowptrs are not kept
2184 rowPtrsUnpacked_host_ = row_ptrs_host_view_type();
2185 }
2186
2188 const row_ptrs_device_view_type& getRowPtrsUnpackedDevice() const {
2189 return rowPtrsUnpacked_dev_;
2190 }
2191
2193 const row_ptrs_host_view_type& getRowPtrsUnpackedHost() const {
2194 if (rowPtrsUnpacked_host_.extent(0) != rowPtrsUnpacked_dev_.extent(0)) {
2195 // NOTE: not just using create_mirror_view here, because
2196 // we do want host/device to be in different memory, even if we're using a SharedSpace.
2197 // This is so that reads will never trigger a host-device transfer.
2198 // The exception is when 'device' views are HostSpace, then don't make another copy.
2199 if constexpr (std::is_same_v<typename Node::memory_space, Kokkos::HostSpace>) {
2200 rowPtrsUnpacked_host_ = rowPtrsUnpacked_dev_;
2201 } else {
2202 // Have to make this temporary because rowptrs are const-valued
2203 typename row_ptrs_host_view_type::non_const_type rowPtrsTemp(
2204 Kokkos::view_alloc(Kokkos::WithoutInitializing, "rowPtrsUnpacked_host_"), rowPtrsUnpacked_dev_.extent(0));
2205 Kokkos::deep_copy(rowPtrsTemp, rowPtrsUnpacked_dev_);
2206 rowPtrsUnpacked_host_ = rowPtrsTemp;
2207 }
2208 // Also keep packed/unpacked views in sync, if they are known to have the same contents
2209 if (packedUnpackedRowPtrsMatch_) {
2210 rowPtrsPacked_host_ = rowPtrsUnpacked_host_;
2211 }
2212 }
2213 return rowPtrsUnpacked_host_;
2214 }
2215
2216 void setRowPtrsPacked(const row_ptrs_device_view_type& dview) {
2217 packedUnpackedRowPtrsMatch_ = false;
2218 rowPtrsPacked_dev_ = dview;
2219 // Make sure stale host rowptrs are not kept
2220 rowPtrsPacked_host_ = row_ptrs_host_view_type();
2221 }
2222
2224 const row_ptrs_device_view_type& getRowPtrsPackedDevice() const {
2225 return rowPtrsPacked_dev_;
2226 }
2227
2229 const row_ptrs_host_view_type& getRowPtrsPackedHost() const {
2230 if (rowPtrsPacked_host_.extent(0) != rowPtrsPacked_dev_.extent(0)) {
2231 // NOTE: not just using create_mirror_view here, because
2232 // we do want host/device to be in different memory, even if we're using a SharedSpace.
2233 // This is so that reads will never trigger a host-device transfer.
2234 // The exception is when 'device' views are HostSpace, then don't make another copy.
2235 if constexpr (std::is_same_v<typename Node::memory_space, Kokkos::HostSpace>) {
2236 rowPtrsPacked_host_ = rowPtrsPacked_dev_;
2237 } else {
2238 // Have to make this temporary because rowptrs are const-valued
2239 typename row_ptrs_host_view_type::non_const_type rowPtrsTemp(
2240 Kokkos::view_alloc(Kokkos::WithoutInitializing, "rowPtrsPacked_host_"), rowPtrsPacked_dev_.extent(0));
2241 Kokkos::deep_copy(rowPtrsTemp, rowPtrsPacked_dev_);
2242 rowPtrsPacked_host_ = rowPtrsTemp;
2243 }
2244 // Also keep packed/unpacked views in sync, if they are known to have the same contents
2245 if (packedUnpackedRowPtrsMatch_) {
2246 rowPtrsUnpacked_host_ = rowPtrsPacked_host_;
2247 }
2248 }
2249 return rowPtrsPacked_host_;
2250 }
2251
2252 // There are common cases where both packed and unpacked views are set to the same array.
2253 // Doing this in a single call can reduce dataspace on host, and reduce runtime by
2254 // removing a deep_copy from device to host.
2255
2256 void setRowPtrs(const row_ptrs_device_view_type& dview) {
2257 packedUnpackedRowPtrsMatch_ = true;
2258 rowPtrsUnpacked_dev_ = dview;
2259 rowPtrsPacked_dev_ = dview;
2260 // Make sure stale host rowptrs are not kept
2261 rowPtrsUnpacked_host_ = row_ptrs_host_view_type();
2262 rowPtrsPacked_host_ = row_ptrs_host_view_type();
2263 }
2264
2265 // TODO: Make private -- matrix shouldn't access directly the guts of graph
2266
2281
2296
2297 // TODO: Make private -- matrix shouldn't access directly the guts of graph
2298
2308
2309 // TODO: Make private -- matrix shouldn't access directly
2311
2315 typename local_inds_dualv_type::t_host::const_type
2316 getLocalIndsViewHost(const RowInfo& rowinfo) const;
2317
2321 typename local_inds_dualv_type::t_dev::const_type
2323
2327 typename global_inds_dualv_type::t_host::const_type
2329
2333 typename global_inds_dualv_type::t_dev::const_type
2335
2339 typename local_inds_dualv_type::t_host
2341
2342 // FOR NOW...
2343 // KEEP k_numRowEntries_ (though switch from host_mirror_type to Host)
2344 // KEEP k_numAllocPerRow_ (though perhaps switch from host_mirror_type to Host)
2345
2371 typename Kokkos::View<const size_t*, device_type>::host_mirror_type
2373
2384
2386
2387
2409
2417 typedef typename Kokkos::View<size_t*, Kokkos::LayoutLeft, device_type>::host_mirror_type num_row_entries_type;
2418
2419 // typedef Kokkos::View<
2420 // size_t*,
2421 // Kokkos::LayoutLeft,
2422 // Kokkos::Device<
2423 // typename Kokkos::View<
2424 // size_t*,
2425 // Kokkos::LayoutLeft,
2426 // device_type>::host_mirror_type::execution_space,
2427 // Kokkos::HostSpace> > num_row_entries_type;
2428
2436
2442 mutable offset_device_view_type k_offRankOffsets_;
2443
2445
2456 Details::STORAGE_1D_UNPACKED;
2457
2458 bool indicesAreAllocated_ = false;
2459 bool indicesAreLocal_ = false;
2460 bool indicesAreGlobal_ = false;
2461 bool fillComplete_ = false;
2462
2467 bool noRedundancies_ = true;
2473 mutable bool haveLocalOffRankOffsets_ = false;
2474
2475 typedef typename std::map<global_ordinal_type, std::vector<global_ordinal_type>> nonlocals_type;
2476
2478 nonlocals_type nonlocals_;
2479
2495
2496 private:
2498 static bool getDebug();
2499
2502 bool debug_ = getDebug();
2503
2505 static bool getVerbose();
2506
2510 bool verbose_ = getVerbose();
2511
2512 private:
2514 mutable bool need_sync_host_uvm_access = false;
2515
2517 void set_need_sync_host_uvm_access() {
2518 need_sync_host_uvm_access = true;
2519 }
2520
2522 void execute_sync_host_uvm_access() const {
2523 if (need_sync_host_uvm_access) {
2524 Kokkos::fence("CrsGraph::execute_sync_host_uvm_access");
2525 need_sync_host_uvm_access = false;
2526 }
2527 }
2528}; // class CrsGraph
2529
2537template <class LocalOrdinal, class GlobalOrdinal, class Node>
2538Teuchos::RCP<CrsGraph<LocalOrdinal, GlobalOrdinal, Node>>
2540 const Teuchos::RCP<
2542 size_t maxNumEntriesPerRow = 0,
2543 const Teuchos::RCP<Teuchos::ParameterList>& params =
2544 Teuchos::null) {
2545 using Teuchos::rcp;
2548 params));
2549}
2550
2600template <class CrsGraphType>
2601Teuchos::RCP<CrsGraphType>
2602importAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
2603 const Import<typename CrsGraphType::local_ordinal_type,
2604 typename CrsGraphType::global_ordinal_type,
2605 typename CrsGraphType::node_type>& importer,
2606 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2607 typename CrsGraphType::global_ordinal_type,
2608 typename CrsGraphType::node_type>>& domainMap = Teuchos::null,
2609 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2610 typename CrsGraphType::global_ordinal_type,
2611 typename CrsGraphType::node_type>>& rangeMap = Teuchos::null,
2612 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
2613 Teuchos::RCP<CrsGraphType> destGraph;
2614 sourceGraph->importAndFillComplete(destGraph, importer, domainMap, rangeMap, params);
2615 return destGraph;
2616}
2617
2668template <class CrsGraphType>
2669Teuchos::RCP<CrsGraphType>
2670importAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
2671 const Import<typename CrsGraphType::local_ordinal_type,
2672 typename CrsGraphType::global_ordinal_type,
2673 typename CrsGraphType::node_type>& rowImporter,
2674 const Import<typename CrsGraphType::local_ordinal_type,
2675 typename CrsGraphType::global_ordinal_type,
2676 typename CrsGraphType::node_type>& domainImporter,
2677 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2678 typename CrsGraphType::global_ordinal_type,
2679 typename CrsGraphType::node_type>>& domainMap,
2680 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2681 typename CrsGraphType::global_ordinal_type,
2682 typename CrsGraphType::node_type>>& rangeMap,
2683 const Teuchos::RCP<Teuchos::ParameterList>& params) {
2684 Teuchos::RCP<CrsGraphType> destGraph;
2685 sourceGraph->importAndFillComplete(destGraph, rowImporter, domainImporter, domainMap, rangeMap, params);
2686 return destGraph;
2687}
2688
2722template <class CrsGraphType>
2723Teuchos::RCP<CrsGraphType>
2724exportAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
2725 const Export<typename CrsGraphType::local_ordinal_type,
2726 typename CrsGraphType::global_ordinal_type,
2727 typename CrsGraphType::node_type>& exporter,
2728 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2729 typename CrsGraphType::global_ordinal_type,
2730 typename CrsGraphType::node_type>>& domainMap = Teuchos::null,
2731 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2732 typename CrsGraphType::global_ordinal_type,
2733 typename CrsGraphType::node_type>>& rangeMap = Teuchos::null,
2734 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
2735 Teuchos::RCP<CrsGraphType> destGraph;
2736 sourceGraph->exportAndFillComplete(destGraph, exporter, domainMap, rangeMap, params);
2737 return destGraph;
2738}
2739
2773template <class CrsGraphType>
2774Teuchos::RCP<CrsGraphType>
2775exportAndFillCompleteCrsGraph(const Teuchos::RCP<const CrsGraphType>& sourceGraph,
2776 const Export<typename CrsGraphType::local_ordinal_type,
2777 typename CrsGraphType::global_ordinal_type,
2778 typename CrsGraphType::node_type>& rowExporter,
2779 const Export<typename CrsGraphType::local_ordinal_type,
2780 typename CrsGraphType::global_ordinal_type,
2781 typename CrsGraphType::node_type>& domainExporter,
2782 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2783 typename CrsGraphType::global_ordinal_type,
2784 typename CrsGraphType::node_type>>& domainMap,
2785 const Teuchos::RCP<const Map<typename CrsGraphType::local_ordinal_type,
2786 typename CrsGraphType::global_ordinal_type,
2787 typename CrsGraphType::node_type>>& rangeMap,
2788 const Teuchos::RCP<Teuchos::ParameterList>& params) {
2789 Teuchos::RCP<CrsGraphType> destGraph;
2790 sourceGraph->exportAndFillComplete(destGraph, rowExporter, domainExporter, domainMap, rangeMap, params);
2791 return destGraph;
2792}
2793
2794} // namespace Tpetra
2795
2796#endif // TPETRA_CRSGRAPH_DECL_HPP
Forward declaration of Tpetra::BlockCrsMatrix.
Forward declaration of Tpetra::CrsGraph.
Forward declaration of Tpetra::CrsMatrix.
Stand-alone utility functions and macros.
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
bool isMerged() const
Whether duplicate column indices in each row have been merged.
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) override
local_inds_dualv_type::t_dev::const_type getLocalIndsViewDevice(const RowInfo &rowinfo) const
Get a const, locally indexed view of the locally owned row myRow, such that rowinfo = getRowInfo(myRo...
global_size_t globalMaxNumRowEntries_
Global maximum of the number of entries in each row.
void reindexColumns(const Teuchos::RCP< const map_type > &newColMap, const Teuchos::RCP< const import_type > &newImport=Teuchos::null, const bool sortIndicesInEachRow=true)
Reindex the column indices in place, and replace the column Map. Optionally, replace the Import objec...
Kokkos::View< size_t *, Kokkos::LayoutLeft, device_type >::host_mirror_type num_row_entries_type
Row offsets for "1-D" storage.
global_inds_dualv_type::t_host::const_type getGlobalIndsViewHost(const RowInfo &rowinfo) const
Get a const, globally indexed view of the locally owned row myRow, such that rowinfo = getRowInfo(myR...
size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const override
Get the number of entries in the given row (local index).
Teuchos::RCP< CrsGraphType > importAndFillCompleteCrsGraph(const Teuchos::RCP< const CrsGraphType > &sourceGraph, const Import< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &rowImporter, const Import< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &domainImporter, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &domainMap, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > &params)
Nonmember CrsGraph constructor that fuses Import and fillComplete().
Teuchos::RCP< const map_type > getColMap() const override
Returns the Map that describes the column distribution in this graph.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Default parameter list suitable for validation.
Details::EStorageStatus storageStatus_
Status of the graph's storage, when not in a fill-complete state.
::Tpetra::Import< LocalOrdinal, GlobalOrdinal, Node > import_type
The Import specialization used by this class.
global_ordinal_type packet_type
Type of each entry of the DistObject communication buffer.
GlobalOrdinal global_ordinal_type
The type of the graph's global indices.
void insertGlobalIndicesIntoNonownedRows(const global_ordinal_type gblRow, const global_ordinal_type gblColInds[], const local_ordinal_type numGblColInds)
Implementation of insertGlobalIndices for nonowned rows.
Teuchos::RCP< const map_type > rangeMap_
The Map describing the range of the (matrix corresponding to the) graph.
std::pair< size_t, std::string > makeIndicesLocal(const bool verbose=false)
Convert column indices from global to local.
local_inds_device_view_type getLocalIndicesDevice() const
Get a device view of the packed column indicies.
global_size_t getGlobalNumEntries() const override
Returns the global number of entries in the graph.
bool isIdenticalTo(const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > &graph) const
Create a cloned CrsGraph for a different Node type.
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
Returns the communicator.
local_inds_wdv_type lclIndsUnpacked_wdv
Local ordinals of column indices for all rows Valid when isLocallyIndexed is true If OptimizedStorage...
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
void globalAssemble()
Communicate nonlocal contributions to other processes.
RowInfo getRowInfoFromGlobalRowIndex(const global_ordinal_type gblRow) const
Get information about the locally owned row with global index gblRow.
void getLocalDiagOffsets(const Kokkos::View< size_t *, device_type, Kokkos::MemoryUnmanaged > &offsets) const
Get offsets of the diagonal entries in the graph.
size_t findGlobalIndices(const RowInfo &rowInfo, const Teuchos::ArrayView< const global_ordinal_type > &indices, std::function< void(const size_t, const size_t, const size_t)> fun) const
Finds indices in the given row.
CrsGraph(const CrsGraph< local_ordinal_type, global_ordinal_type, node_type > &)=default
Copy constructor (default).
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 graph that you are done changing its structure.
global_inds_wdv_type gblInds_wdv
Global ordinals of column indices for all rows.
size_t nodeMaxNumRowEntries_
Local maximum of the number of entries in each row.
size_t sortAndMergeRowIndices(const RowInfo &rowInfo, const bool sorted, const bool merged)
Sort and merge duplicate column indices in the given row.
Teuchos::RCP< const import_type > importer_
The Import from the domain Map to the column Map.
Teuchos::RCP< CrsGraphType > exportAndFillCompleteCrsGraph(const Teuchos::RCP< const CrsGraphType > &sourceGraph, const Export< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &exporter, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)
Nonmember CrsGraph constructor that fuses Export and fillComplete().
num_row_entries_type k_numRowEntries_
The number of local entries in each locally owned row.
CrsGraph(CrsGraph< local_ordinal_type, global_ordinal_type, node_type > &&)=default
Move constructor (default).
const row_ptrs_device_view_type & getRowPtrsUnpackedDevice() const
Get the unpacked row pointers on device.
size_t numAllocForAllRows_
The maximum number of entries to allow in each locally owned row.
bool hasColMap() const override
Whether the graph has a column Map.
LocalOrdinal local_ordinal_type
The type of the graph's local indices.
std::string description() const override
Return a one-line human-readable description of this object.
bool isStorageOptimized() const
Returns true if storage has been optimized.
void getGlobalRowCopy(global_ordinal_type gblRow, nonconst_global_inds_host_view_type &gblColInds, size_t &numColInds) const override
Get a copy of the given row, using global indices.
void removeLocalIndices(local_ordinal_type localRow)
Remove all graph indices from the specified local row.
void importAndFillComplete(Teuchos::RCP< CrsGraph< local_ordinal_type, global_ordinal_type, Node > > &destGraph, 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 graph, and make the result fill complete.
global_size_t getGlobalNumRows() const override
Returns the number of global rows in the graph.
Teuchos::RCP< const map_type > getDomainMap() const override
Returns the Map associated with the domain of this graph.
void replaceRangeMapAndExporter(const Teuchos::RCP< const map_type > &newRangeMap, const Teuchos::RCP< const export_type > &newExporter)
Replace the current Range Map and Export with the given parameters.
void computeLocalConstants()
Compute local constants, if they have not yet been computed.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const override
Print this object to the given output stream with the given verbosity level.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &params) override
Set the given list of parameters (must be nonnull).
static const bool useAtomicUpdatesByDefault
Whether transformLocalValues should use atomic updates by default.
void resumeFill(const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)
Resume fill operations.
size_t insertIndices(RowInfo &rowInfo, const SLocalGlobalViews &newInds, const ELocalGlobal lg, const ELocalGlobal I)
Insert indices into the given row.
typename Node::device_type device_type
This class' Kokkos device type.
Teuchos::RCP< CrsGraphType > importAndFillCompleteCrsGraph(const Teuchos::RCP< const CrsGraphType > &sourceGraph, const Import< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &importer, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)
Nonmember CrsGraph constructor that fuses Import and fillComplete().
void insertGlobalIndicesFiltered(const local_ordinal_type lclRow, const global_ordinal_type gblColInds[], const local_ordinal_type numGblColInds)
Like insertGlobalIndices(), but with column Map filtering.
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
RowInfo getRowInfo(const local_ordinal_type myRow) const
Get information about the locally owned row with local index myRow.
global_inds_dualv_type::t_dev::const_type getGlobalIndsViewDevice(const RowInfo &rowinfo) const
Get a const, globally indexed view of the locally owned row myRow, such that rowinfo = getRowInfo(myR...
typename local_graph_device_type::HostMirror 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.
Teuchos::RCP< const map_type > colMap_
The Map describing the distribution of columns of the graph.
bool noRedundancies_
Whether the graph's indices are non-redundant (merged) in each row, on this process.
row_ptrs_host_view_type getLocalRowPtrsHost() const
Get a host view of the packed row offsets.
bool isSorted() const
Whether graph indices in all rows are known to be sorted.
Teuchos::RCP< CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > createCrsGraph(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t maxNumEntriesPerRow=0, const Teuchos::RCP< Teuchos::ParameterList > &params=Teuchos::null)
Nonmember function to create an empty CrsGraph given a row Map and the max number of entries allowed ...
void setAllIndices(const typename local_graph_device_type::row_map_type &rowPointers, const typename local_graph_device_type::entries_type::non_const_type &columnIndices)
Set the graph's data directly, using 1-D storage.
void insertLocalIndices(const local_ordinal_type localRow, const Teuchos::ArrayView< const local_ordinal_type > &indices)
Insert local indices into the graph.
local_inds_host_view_type getLocalIndicesHost() const
Get a host view of the packed column indicies.
bool supportsRowViews() const override
Whether this class implements getLocalRowView() and getGlobalRowView() (it does).
size_t getNumEntriesInGlobalRow(global_ordinal_type globalRow) const override
Returns the current number of entries on this node in the specified global row.
bool isFillComplete() const override
Whether fillComplete() has been called and the graph is in compute mode.
void setDomainRangeMaps(const Teuchos::RCP< const map_type > &domainMap, const Teuchos::RCP< const map_type > &rangeMap)
void swap(CrsGraph< local_ordinal_type, global_ordinal_type, Node > &graph)
Swaps the data from *this with the data and maps from graph.
CrsGraph & operator=(const CrsGraph< local_ordinal_type, global_ordinal_type, node_type > &)=default
Assignment operator (default).
void getGlobalRowView(const global_ordinal_type gblRow, global_inds_host_view_type &gblColInds) const override
Get a const view of the given global row's global column indices.
const row_ptrs_host_view_type & getRowPtrsUnpackedHost() const
Get the unpacked row pointers on host. Lazily make a copy from device.
void exportAndFillComplete(Teuchos::RCP< CrsGraph< local_ordinal_type, global_ordinal_type, Node > > &destGraph, 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 graph, and make the result fill complete.
void makeColMap(Teuchos::Array< int > &remotePIDs)
Make and set the graph's column Map.
bool haveGlobalConstants_
Whether all processes have computed global constants.
size_t getGlobalMaxNumRowEntries() const override
Maximum number of entries in any row of the graph, over all processes in the graph's communicator.
void checkInternalState() const
Throw an exception if the internal state is not consistent.
typename dist_object_type::buffer_device_type buffer_device_type
Kokkos::Device specialization for communication buffers.
Teuchos::RCP< const map_type > getRangeMap() const override
Returns the Map associated with the domain of this graph.
typename row_graph_type::global_inds_device_view_type global_inds_device_view_type
The Kokkos::View type for views of global ordinals on device and host.
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 graph that already has data, via setAllIndices().
bool sortGhostsAssociatedWithEachProcessor_
Whether to require makeColMap() (and therefore fillComplete()) to order column Map GIDs associated wi...
size_t getNumAllocatedEntriesInGlobalRow(global_ordinal_type globalRow) const
Current number of allocated entries in the given row on the calling (MPI) process,...
Teuchos::RCP< const export_type > getExporter() const override
Returns the exporter associated with this graph.
typename device_type::execution_space execution_space
This class' Kokkos execution space.
void makeImportExport(Teuchos::Array< int > &remotePIDs, const bool useRemotePIDs)
Make the Import and Export objects, if needed.
global_ordinal_type getIndexBase() const override
Returns the index base for global indices for this graph.
row_ptrs_device_view_type getLocalRowPtrsDevice() const
Get a device view of the packed row offsets.
void getLocalRowCopy(local_ordinal_type gblRow, nonconst_local_inds_host_view_type &gblColInds, size_t &numColInds) const override
Get a copy of the given row, using local indices.
local_inds_dualv_type::t_host::const_type getLocalIndsViewHost(const RowInfo &rowinfo) const
Get a const, locally indexed view of the locally owned row myRow, such that rowinfo = getRowInfo(myRo...
bool isFillActive() const
Whether resumeFill() has been called and the graph is in edit mode.
Teuchos::RCP< const map_type > getRowMap() const override
Returns the Map that describes the row distribution in this graph.
global_size_t globalNumEntries_
Global number of entries in the graph.
size_t insertGlobalIndicesImpl(const local_ordinal_type lclRow, const global_ordinal_type inputGblColInds[], const size_t numInputInds)
Insert global indices, using an input local row index.
::Tpetra::Export< LocalOrdinal, GlobalOrdinal, Node > export_type
The Export specialization used by this class.
size_t getLocalNumEntries() const override
The local number of entries in the graph.
Teuchos::RCP< const import_type > getImporter() const override
Returns the importer associated with this graph.
local_inds_wdv_type lclIndsPacked_wdv
Local ordinals of column indices for all rows Valid when isLocallyIndexed is true Built during fillCo...
Teuchos::RCP< const map_type > domainMap_
The Map describing the domain of the (matrix corresponding to the) graph.
const row_ptrs_host_view_type & getRowPtrsPackedHost() const
Get the packed row pointers on host. Lazily make a copy from device.
size_t getLocalNumCols() const override
Returns the number of columns connected to the locally owned rows of this graph.
nonlocals_type nonlocals_
Nonlocal data given to insertGlobalIndices.
virtual void pack(const Teuchos::ArrayView< const local_ordinal_type > &exportLIDs, Teuchos::Array< global_ordinal_type > &exports, const Teuchos::ArrayView< size_t > &numPacketsPerLID, size_t &constantNumPackets) const override
void getLocalOffRankOffsets(offset_device_view_type &offsets) const
Get offsets of the off-rank entries in the graph.
global_size_t getGlobalNumCols() const override
Returns the number of global columns in the graph.
typename row_graph_type::local_inds_device_view_type local_inds_device_view_type
The Kokkos::View type for views of local ordinals on device and host.
Kokkos::View< constsize_t *, device_type >::host_mirror_type k_numAllocPerRow_
The maximum number of entries to allow in each locally owned row, per row.
bool indicesAreSorted_
Whether the graph's indices are sorted in each row, on this process.
Node node_type
This class' Kokkos Node type.
Teuchos::RCP< const export_type > exporter_
The Export from the row Map to the range Map.
void insertGlobalIndices(const global_ordinal_type globalRow, const Teuchos::ArrayView< const global_ordinal_type > &indices)
Insert global indices into the graph.
local_inds_dualv_type::t_host getLocalIndsViewHostNonConst(const RowInfo &rowinfo)
Get a ReadWrite locally indexed view of the locally owned row myRow, such that rowinfo = getRowInfo(m...
void replaceDomainMap(const Teuchos::RCP< const map_type > &newDomainMap)
Replace the current domain Map with the given objects.
CrsGraph & operator=(CrsGraph< local_ordinal_type, global_ordinal_type, node_type > &&)=default
Move assignment (default).
void computeGlobalConstants()
Compute global constants, if they have not yet been computed.
size_t getNumAllocatedEntriesInLocalRow(local_ordinal_type localRow) const
Current number of allocated entries in the given row on the calling (MPI) process,...
virtual ~CrsGraph()=default
Destructor (virtual for memory safety of derived classes).
offset_device_view_type k_offRankOffsets_
The offsets for off-rank entries.
void replaceDomainMapAndImporter(const Teuchos::RCP< const map_type > &newDomainMap, const Teuchos::RCP< const import_type > &newImporter)
Replace the current domain Map and Import with the given parameters.
void setLocallyModified()
Report that we made a local modification to its structure.
size_t getLocalAllocationSize() const
The local number of indices allocated for the graph, over all rows on the calling (MPI) process.
void replaceRangeMap(const Teuchos::RCP< const map_type > &newRangeMap)
Replace the current Range Map with the given objects.
Teuchos::RCP< const map_type > rowMap_
The Map describing the distribution of rows of the graph.
Teuchos::RCP< CrsGraphType > exportAndFillCompleteCrsGraph(const Teuchos::RCP< const CrsGraphType > &sourceGraph, const Export< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &rowExporter, const Export< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > &domainExporter, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &domainMap, const Teuchos::RCP< const Map< typename CrsGraphType::local_ordinal_type, typename CrsGraphType::global_ordinal_type, typename CrsGraphType::node_type > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > &params)
Nonmember CrsGraph constructor that fuses Export and fillComplete().
const row_ptrs_device_view_type & getRowPtrsPackedDevice() const
Get the packed row pointers on device.
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap) override
Remove processes owning zero rows from the Maps and their communicator.
void getLocalRowView(const LocalOrdinal lclRow, local_inds_host_view_type &lclColInds) const override
Get a const view of the given local row's local column indices.
bool isGloballyIndexed() const override
Whether the graph's column indices are stored as global indices.
bool isLocallyIndexed() const override
Whether the graph's column indices are stored as local indices.
size_t getLocalMaxNumRowEntries() const override
Maximum number of entries in any row of the graph, on this process.
virtual bool checkSizes(const SrcDistObject &source) override
Compare the source and target (this) objects for compatibility.
local_graph_device_type getLocalGraphDevice() const
Get the local graph.
size_t getLocalNumRows() const override
Returns the number of graph rows owned on the calling node.
void replaceColMap(const Teuchos::RCP< const map_type > &newColMap)
Replace the graph's current column Map with the given Map.
bool haveLocalConstants_
Whether this process has computed local constants.
Struct that holds views of the contents of a CrsMatrix.
Sparse matrix that presents a row-oriented interface that lets users read or modify entries.
Keep track of how much more space a CrsGraph or CrsMatrix needs, when the graph or matrix is the targ...
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).
Kokkos::Device< typename device_type::execution_space, buffer_memory_space > buffer_device_type
Kokkos::Device specialization for communication buffers.
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...
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
A parallel distribution of indices over processes.
An abstract interface for graphs accessed by rows.
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.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
CombineMode
Rule for combining data in an Import or Export.
Allocation information for a locally owned row in a CrsGraph or CrsMatrix.