MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_Aggregates_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // MueLu: A package for multigrid based preconditioning
4 //
5 // Copyright 2012 NTESS and the MueLu contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef MUELU_AGGREGATES_DECL_HPP
11 #define MUELU_AGGREGATES_DECL_HPP
12 
13 #include "MueLu_ConfigDefs.hpp"
14 
15 #include <Kokkos_StaticCrsGraph.hpp>
16 
17 #include "MueLu_Aggregates_fwd.hpp"
18 
19 #include <Xpetra_Map_fwd.hpp>
20 #include <Xpetra_Vector_fwd.hpp>
23 
24 #include "MueLu_BaseClass.hpp"
25 
26 #include "MueLu_LWGraph_kokkos.hpp"
27 
28 #include "MueLu_LWGraph.hpp"
29 #include "MueLu_IndexManager.hpp"
30 #include "MueLu_IndexManager_kokkos.hpp"
31 
32 #define MUELU_UNAGGREGATED -1 /* indicates that a node is unassigned to */
33  /* any aggregate. */
34 
35 #define MUELU_UNASSIGNED -1 /* indicates a vertex is not yet claimed */
36  /* by a processor during aggregation. */
37  /* Note, it is possible at */
38  /* this stage that some processors may have*/
39  /* claimed their copy of a vertex for one */
40  /* of their aggregates. However, some */
41  /* arbitration still needs to occur. */
42  /* The corresponding procWinner[]'s remain */
43  /* as MUELU_UNASSIGNED until */
44  /* ArbitrateAndCommunicate() is */
45  /* invoked to arbitrate. */
46 
47 /*****************************************************************************
48 
49 ****************************************************************************/
50 
51 namespace MueLu {
52 
68 template <class LocalOrdinal, class GlobalOrdinal, class Node>
69 class Aggregates : public BaseClass {
70  public:
73  using execution_space = typename Node::execution_space;
74  using node_type = Node;
75  using device_type = typename Node::device_type;
76  using range_type = Kokkos::RangePolicy<local_ordinal_type, execution_space>;
77  using LO_view = Kokkos::View<local_ordinal_type*, device_type>;
78 
79  using aggregates_sizes_type = Kokkos::View<LocalOrdinal*, device_type>;
80 
81  private:
82 #undef MUELU_AGGREGATES_SHORT
84 
85  public:
86  // Defining types that require the short names included above
88  using colors_view_type = Kokkos::View<typename local_graph_type::entries_type::data_type,
89  typename local_graph_type::device_type::memory_space>;
90 
98  Aggregates(const LWGraph& graph);
99 
107  Aggregates(LWGraph_kokkos graph);
108 
114  Aggregates(const RCP<const Map>& map);
115 
119  virtual ~Aggregates() {}
120 
122 
123 
128 
132  void SetIndexManagerKokkos(RCP<IndexManager_kokkos>& geoDataKokkos) { geoDataKokkos_ = geoDataKokkos; }
133 
138 
142  void SetIndexManager(RCP<IndexManager>& geoData) { geoData_ = geoData; }
143 
148 
152  void SetGraphColors(colors_view_type graphColors) { graphColors_ = graphColors; }
153 
157 
160  void SetGraphNumColors(const LO graphNumColors) { graphNumColors_ = graphNumColors; }
161 
163 
168  void SetNumAggregates(LO nAggregates) { numAggregates_ = nAggregates; }
169 
174  void SetNumGlobalAggregates(GO nGlobalAggregates) { numGlobalAggregates_ = nGlobalAggregates; }
175 
177  KOKKOS_INLINE_FUNCTION LO GetNumAggregates() const {
178  return numAggregates_;
179  }
180 
182  KOKKOS_INLINE_FUNCTION void AggregatesCrossProcessors(const bool& flag) {
184  }
185 
190  KOKKOS_INLINE_FUNCTION bool AggregatesCrossProcessors() const {
192  }
193 
199 
210 
215  const RCP<LOVector>& GetProcWinner() const { return procWinner_; }
216 
218  inline bool IsRoot(LO i) const { return isRoot_[i]; }
219 
224  inline void SetIsRoot(LO i, bool value = true) { isRoot_[i] = value; }
225 
226  const RCP<const Map> GetMap() const;
227 
237  typename aggregates_sizes_type::const_type ComputeAggregateSizes(bool forceRecompute = false) const;
238 
248  Teuchos::ArrayRCP<LocalOrdinal> ComputeAggregateSizesArrayRCP(bool forceRecompute = false) const;
249 
250  local_graph_type GetGraph() const;
251 
256  void ComputeNodesInAggregate(LO_view& aggPtr, LO_view& aggNodes, LO_view& unaggregated) const;
257 
259  // If # of global aggregates is unknown, this method does coummunication and internally record the value
261 
263 
264 
266  std::string description() const;
267 
269  // using MueLu::Describable::describe; // overloading, not hiding
270  void print(Teuchos::FancyOStream& out, const Teuchos::EVerbosityLevel verbLevel = verbLevel_default) const;
271 
272  private:
275 
281 
287 
292 
297 
302 
307 
310 
313 
316 
321  mutable
322  typename aggregates_sizes_type::HostMirror aggregateSizesHost_;
323 
326 };
327 
328 } // namespace MueLu
329 
330 #define MUELU_AGGREGATES_SHORT
331 #endif // MUELU_AGGREGATES_DECL_HPP
Kokkos::View< LocalOrdinal *, device_type > aggregates_sizes_type
virtual ~Aggregates()
Destructor.
MueLu::DefaultLocalOrdinal LocalOrdinal
void SetIndexManagerKokkos(RCP< IndexManager_kokkos > &geoDataKokkos)
Set the index manager used by structured aggregation algorithms. This has to be done by the aggregati...
typename Node::execution_space execution_space
typename Node::device_type device_type
Lightweight MueLu representation of a compressed row storage graph.
const RCP< LOVector > & GetProcWinner() const
Returns constant vector that maps local node IDs to owning processor IDs.
RCP< IndexManager > geoData_
void SetGraphNumColors(const LO graphNumColors)
Set the number of colors needed by the distance 2 coloring.
Container class for aggregation information.
RCP< IndexManager > & GetIndexManager()
Get the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
bool aggregatesIncludeGhosts_
Set to false iff aggregates do not include any DOFs belong to other processes.
KOKKOS_INLINE_FUNCTION LO GetNumAggregates() const
typename std::conditional< OnHost, typename local_graph_device_type::HostMirror, local_graph_device_type >::type local_graph_type
GlobalOrdinal GO
const RCP< const Map > GetMap() const
returns (overlapping) map of aggregate/node distribution
LocalOrdinal LO
colors_view_type graphColors_
void SetIndexManager(RCP< IndexManager > &geoData)
Set the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
MueLu::DefaultNode Node
void SetIsRoot(LO i, bool value=true)
Set root node information.
GlobalOrdinal global_ordinal_type
RCP< LOMultiVector > & GetVertex2AggIdNonConst()
Returns a nonconstant vector that maps local node IDs to local aggregates IDs.
LO GetGraphNumColors()
Get the number of colors needed by the distance 2 coloring.
MueLu::DefaultGlobalOrdinal GlobalOrdinal
LO numAggregates_
Number of aggregates on this processor.
colors_view_type & GetGraphColors()
Get a distance 2 coloring of the underlying graph. The coloring is computed and set during Phase1 of ...
aggregates_sizes_type::HostMirror aggregateSizesHost_
RCP< IndexManager_kokkos > geoDataKokkos_
typename LWGraph_kokkos::local_graph_type local_graph_type
RCP< LOVector > & GetProcWinnerNonConst()
Returns nonconstant vector that maps local node IDs to owning processor IDs.
void ComputeNodesInAggregate(LO_view &aggPtr, LO_view &aggNodes, LO_view &unaggregated) const
Generates a compressed list of nodes in each aggregate, where the entries in aggNodes[aggPtr[i]] up t...
void SetGraphColors(colors_view_type graphColors)
Set a distance 2 coloring of the underlying graph. The coloring is computed and set during Phase1 of ...
GO GetNumGlobalAggregatesComputeIfNeeded()
Get global number of aggregates.
Teuchos::ArrayRCP< LocalOrdinal > ComputeAggregateSizesArrayRCP(bool forceRecompute=false) const
Compute sizes of aggregates.
Teuchos::ArrayRCP< bool > isRoot_
An ArrayRCP of booleans specifying if a local entry is an aggregate root.
const RCP< LOMultiVector > & GetVertex2AggId() const
Returns constant vector that maps local node IDs to local aggregates IDs.
aggregates_sizes_type aggregateSizes_
Array of sizes of each local aggregate.
Kokkos::RangePolicy< local_ordinal_type, execution_space > range_type
Kokkos::View< typename local_graph_type::entries_type::data_type, typename local_graph_type::device_type::memory_space > colors_view_type
void SetNumGlobalAggregates(GO nGlobalAggregates)
Set number of global aggregates on current processor.
static const EVerbosityLevel verbLevel_default
Base class for MueLu classes.
RCP< LOMultiVector > vertex2AggId_
Kokkos::View< local_ordinal_type *, device_type > LO_view
GO numGlobalAggregates_
Number of global aggregates.
Lightweight MueLu representation of a compressed row storage graph.
bool IsRoot(LO i) const
Returns true if node with given local node id is marked to be a root node.
Aggregates(const LWGraph &graph)
Standard constructor for Aggregates structure.
KOKKOS_INLINE_FUNCTION void AggregatesCrossProcessors(const bool &flag)
Record whether aggregates include DOFs from other processes.
void print(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
std::string description() const
Return a simple one-line description of this object.
local_graph_type GetGraph() const
KOKKOS_INLINE_FUNCTION bool AggregatesCrossProcessors() const
Return false if and only if no aggregates include DOFs from other processes.
aggregates_sizes_type::const_type ComputeAggregateSizes(bool forceRecompute=false) const
Compute sizes of aggregates.
local_graph_type graph_
Aggregates represented as Kokkos graph type.
void SetNumAggregates(LO nAggregates)
Set number of local aggregates on current processor.
RCP< IndexManager_kokkos > & GetIndexManagerKokkos()
Get the index manager used by structured aggregation algorithms. This has to be done by the aggregati...