10 #ifndef MUELU_LWGRAPHBASE_DECL_HPP
11 #define MUELU_LWGRAPHBASE_DECL_HPP
13 #include "Kokkos_Bitset.hpp"
16 #include <Kokkos_StaticCrsGraph.hpp>
17 #include <Tpetra_KokkosCompat_ClassicNodeAPI_Wrapper.hpp>
18 #include <KokkosCompat_View.hpp>
24 #include <type_traits>
35 template <
class LocalOrdinal,
class RowType>
36 class MaxNumRowEntriesFunctor {
38 MaxNumRowEntriesFunctor(RowType rowPointers)
41 KOKKOS_INLINE_FUNCTION
42 void operator()(
const LocalOrdinal i,
size_t& maxLength)
const {
45 maxLength = (d > maxLength ? d : maxLength);
48 KOKKOS_INLINE_FUNCTION
49 void join(
volatile size_t& dest,
const volatile size_t& src) {
50 dest = (dest > src ? dest : src);
53 KOKKOS_INLINE_FUNCTION
54 void init(
size_t& initValue) {
71 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node,
bool OnHost>
80 using device_type =
typename std::conditional<OnHost,
81 Kokkos::Device<Kokkos::Serial, Kokkos::HostSpace>,
82 typename Node::device_type>::type;
88 typename Node::device_type,
90 using local_graph_type =
typename std::conditional<OnHost, typename local_graph_device_type::HostMirror, local_graph_device_type>::type;
92 using row_type =
typename local_graph_type::row_map_type;
96 #undef MUELU_LWGRAPHBASE_SHORT
106 const std::string& objectLabel) {
107 using range_type = Kokkos::RangePolicy<local_ordinal_type, execution_space>;
117 MaxNumRowEntriesFunctor<LO, typename local_graph_type::row_map_type> maxNumRowEntriesFunctor(
graph_.row_map);
118 Kokkos::parallel_reduce(
"MueLu:LocalLWGraph:LWGraph:maxnonzeros", range_type(0,
graph_.numRows()), maxNumRowEntriesFunctor,
maxNumRowEntries_);
131 const std::string& objectLabel =
"") {
132 setup(graph, domainMap, importMap, objectLabel);
136 const std::string& objectLabel =
"") {
137 if constexpr (OnHost) {
140 typename crs_graph_type::local_graph_type>::value)
146 auto lclGraphDevice = graph->getLocalGraphDevice();
147 auto rows =
typename local_graph_type::row_map_type::non_const_type(
"rows", lclGraphDevice.numRows() + 1);
148 auto columns =
typename local_graph_type::entries_type::non_const_type(
"columns", lclGraphDevice.entries.extent(0));
149 Kokkos::deep_copy(
rows, lclGraphDevice.row_map);
150 Kokkos::deep_copy(columns, lclGraphDevice.entries);
164 const std::string& objectLabel =
"") {
166 setup(graph, domainMap, importMap, objectLabel);
207 auto rowView =
graph_.rowConst(i);
213 return Kokkos::Compat::getArrayView(Kokkos::subview(
graph_.entries,
214 Kokkos::make_pair(
graph_.row_map(i),
250 if (verbLevel &
Debug) {
253 int mypid = col_map->getComm()->getRank();
256 std::ostringstream ss;
257 ss <<
"[pid " << mypid <<
"] num entries=" << graph.entries.size();
258 out << ss.str() << std::endl;
261 const size_t numRows = graph.numRows();
262 auto rowPtrs = graph.row_map;
263 auto columns = graph.entries;
264 auto rowPtrs_h = Kokkos::create_mirror_view(rowPtrs);
265 auto columns_h = Kokkos::create_mirror_view(columns);
266 Kokkos::deep_copy(rowPtrs_h, rowPtrs);
267 Kokkos::deep_copy(columns_h, columns);
268 for (
size_t i = 0; i < numRows; ++i) {
269 std::ostringstream ss;
271 ss <<
" (numEntries=" << rowPtrs_h(i + 1) - rowPtrs_h(i) <<
")";
273 for (
size_t jj = rowPtrs_h(i); jj < rowPtrs_h(i + 1); jj++) {
274 ss <<
" " << col_map->getGlobalElement(columns_h(jj));
276 out << ss.str() << std::endl;
288 typename crs_graph_type::local_graph_type>::value)
291 auto rows =
typename crs_graph_type::local_graph_type::row_map_type::non_const_type(
"rows",
graph_.numRows() + 1);
292 auto columns =
typename crs_graph_type::local_graph_type::entries_type::non_const_type(
"columns",
graph_.entries.extent(0));
294 Kokkos::deep_copy(columns,
graph_.entries);
295 typename crs_graph_type::local_graph_type lclGraph(columns,
rows);
326 #define MUELU_LWGRAPHBASE_SHORT
327 #endif // MUELU_LWGRAPHBASE_DECL_HPP
typename local_graph_type::row_map_type row_type
local_graph_type & getGraph() const
void setup(const local_graph_type &graph, const RCP< const map_type > &domainMap, const RCP< const map_type > &importMap, const std::string &objectLabel)
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const =0
MueLu::DefaultLocalOrdinal LocalOrdinal
size_type maxNumRowEntries_
virtual LocalOrdinal getMinLocalIndex() const =0
KOKKOS_INLINE_FUNCTION row_type getRowPtrs() const
Return the row pointers of the local graph.
KOKKOS_INLINE_FUNCTION void SetBoundaryNodeMap(const boundary_nodes_type bndry)
Set boolean array indicating which rows correspond to Dirichlet boundaries.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=Default) const
Print the Graph with some verbosity level to an FancyOStream object.
RCP< const map_type > importMap_
GlobalOrdinal global_ordinal_type
typename std::conditional< OnHost, typename local_graph_device_type::HostMirror, local_graph_device_type >::type local_graph_type
RCP< crs_graph_type > GetCrsGraph() const
static Teuchos::RCP< CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t NumVectors, ProfileType pftype=DynamicProfile)
std::string description() const
Return a simple one-line description of the Graph.
Print additional debugging information.
KOKKOS_INLINE_FUNCTION size_type GetNodeNumVertices() const
Return number of graph vertices.
KOKKOS_INLINE_FUNCTION size_type GetNodeNumEdges() const
Return number of graph edges.
KOKKOS_INLINE_FUNCTION const boundary_nodes_type GetBoundaryNodeMap() const
Returns map with global ids of boundary nodes.
typename device_type::execution_space execution_space
KOKKOS_INLINE_FUNCTION size_type getLocalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on this node.
const std::string & getObjectLabel() const
Kokkos::GraphRowViewConst< local_graph_type > neighbor_vertices_type
Kokkos::View< bool *, memory_space > boundary_nodes_type
MueLu::DefaultGlobalOrdinal GlobalOrdinal
local_graph_type graph_
Underlying graph (with label)
LocalOrdinal local_ordinal_type
KOKKOS_INLINE_FUNCTION entries_type getEntries() const
Return the list entries in the local graph.
LWGraphBase(const row_type &rows, const entries_type &columns, const RCP< const map_type > &domainMap, const RCP< const map_type > &importMap, const std::string &objectLabel="")
KOKKOS_INLINE_FUNCTION bool isLocalNeighborVertex(LO i) const
Return true if vertex with local id 'v' is on current process.
virtual GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const =0
Kokkos::StaticCrsGraph< LocalOrdinal, Kokkos::LayoutLeft, typename Node::device_type, void, size_t > local_graph_device_type
virtual LocalOrdinal getMaxLocalIndex() const =0
KOKKOS_INLINE_FUNCTION neighbor_vertices_type getNeighborVertices(LO i) const
Return the list of vertices adjacent to the vertex 'v'.
const RCP< const Map > GetImportMap() const
Return overlapping import map (nodes).
typename local_graph_type::entries_type entries_type
boundary_nodes_type dirichletBoundaries_
Boolean array marking Dirichlet rows.
Xpetra::global_size_t GetGlobalNumEdges() const
Return global number of graph edges.
typename device_type::memory_space memory_space
const RCP< const Map > GetDomainMap() const
Teuchos::ArrayView< LO > getNeighborVertices_av(LO i) const
Return the list of vertices adjacent to the vertex 'v'.
virtual RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRowMap() const =0
LWGraphBase(const local_graph_type &graph, const RCP< const map_type > &domainMap, const RCP< const map_type > &importMap, const std::string &objectLabel="")
LWGraph constructor.
RCP< const map_type > domainMap_
Graph maps.
typename std::conditional< OnHost, Kokkos::Device< Kokkos::Serial, Kokkos::HostSpace >, typename Node::device_type >::type device_type
std::string objectLabel_
Name of this graph.
const RCP< const Teuchos::Comm< int > > GetComm() const
LO minLocalIndex_
Local index boundaries (cached from domain map)
LWGraphBase(const RCP< const crs_graph_type > &graph, const std::string &objectLabel="")
virtual RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getColMap() const =0