MueLu Version of the Day
Loading...
Searching...
No Matches
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
16
17#include <Xpetra_Map_fwd.hpp>
18#include <Xpetra_Vector_fwd.hpp>
19#include <Xpetra_VectorFactory_fwd.hpp>
20#include <Xpetra_MultiVector_fwd.hpp>
21
22#include "MueLu_BaseClass.hpp"
23
24#include "MueLu_LWGraph_kokkos.hpp"
25
26#include "MueLu_LWGraph.hpp"
27#include "MueLu_IndexManager.hpp"
28#include "MueLu_IndexManager_kokkos.hpp"
29
30#define MUELU_UNAGGREGATED -1 /* indicates that a node is unassigned to */
31 /* any aggregate. */
32
33#define MUELU_UNASSIGNED -1 /* indicates a vertex is not yet claimed */
34 /* by a processor during aggregation. */
35 /* Note, it is possible at */
36 /* this stage that some processors may have*/
37 /* claimed their copy of a vertex for one */
38 /* of their aggregates. However, some */
39 /* arbitration still needs to occur. */
40 /* The corresponding procWinner[]'s remain */
41 /* as MUELU_UNASSIGNED until */
42 /* ArbitrateAndCommunicate() is */
43 /* invoked to arbitrate. */
44
45/*****************************************************************************
46
47****************************************************************************/
48
49namespace MueLu {
50
66template <class LocalOrdinal, class GlobalOrdinal, class Node>
67class Aggregates : public BaseClass {
68 public:
71 using execution_space = typename Node::execution_space;
72 using node_type = Node;
73 using device_type = typename Node::device_type;
74 using range_type = Kokkos::RangePolicy<local_ordinal_type, execution_space>;
75 using LO_view = Kokkos::View<local_ordinal_type*, device_type>;
76
77 using aggregates_sizes_type = Kokkos::View<LocalOrdinal*, device_type>;
78
79 private:
80#undef MUELU_AGGREGATES_SHORT
82
83 public:
84 // Defining types that require the short names included above
86 using colors_view_type = Kokkos::View<typename local_graph_type::entries_type::data_type,
87 typename local_graph_type::device_type::memory_space>;
88
96 Aggregates(const LWGraph& graph);
97
106
112 Aggregates(const RCP<const Map>& map);
113
117 virtual ~Aggregates() {}
118
120
121
125 RCP<IndexManager_kokkos>& GetIndexManagerKokkos() { return geoDataKokkos_; }
126
130 void SetIndexManagerKokkos(RCP<IndexManager_kokkos>& geoDataKokkos) { geoDataKokkos_ = geoDataKokkos; }
131
135 RCP<IndexManager>& GetIndexManager() { return geoData_; }
136
140 void SetIndexManager(RCP<IndexManager>& geoData) { geoData_ = geoData; }
141
146
150 void SetGraphColors(colors_view_type graphColors) { graphColors_ = graphColors; }
151
155
158 void SetGraphNumColors(const LO graphNumColors) { graphNumColors_ = graphNumColors; }
159
161
166 void SetNumAggregates(LO nAggregates) { numAggregates_ = nAggregates; }
167
172 void SetNumGlobalAggregates(GO nGlobalAggregates) { numGlobalAggregates_ = nGlobalAggregates; }
173
175 KOKKOS_INLINE_FUNCTION LO GetNumAggregates() const {
176 return numAggregates_;
177 }
178
180 KOKKOS_INLINE_FUNCTION void AggregatesCrossProcessors(const bool& flag) {
182 }
183
188 KOKKOS_INLINE_FUNCTION bool AggregatesCrossProcessors() const {
190 }
191
196 RCP<LOMultiVector>& GetVertex2AggIdNonConst() { return vertex2AggId_; }
197
202 RCP<LOVector>& GetProcWinnerNonConst() { return procWinner_; }
207 const RCP<LOMultiVector>& GetVertex2AggId() const { return vertex2AggId_; }
208
213 const RCP<LOVector>& GetProcWinner() const { return procWinner_; }
214
216 inline bool IsRoot(LO i) const { return isRoot_[i]; }
217
222 inline void SetIsRoot(LO i, bool value = true) { isRoot_[i] = value; }
223
224 const RCP<const Map> GetMap() const;
225
235 typename aggregates_sizes_type::const_type ComputeAggregateSizes(bool forceRecompute = false) const;
236
246 Teuchos::ArrayRCP<LocalOrdinal> ComputeAggregateSizesArrayRCP(bool forceRecompute = false) const;
247
249
254 void ComputeNodesInAggregate(LO_view& aggPtr, LO_view& aggNodes, LO_view& unaggregated) const;
255
257 // If # of global aggregates is unknown, this method does coummunication and internally record the value
259
261
262
264 std::string description() const;
265
267 // using MueLu::Describable::describe; // overloading, not hiding
268 void print(Teuchos::FancyOStream& out, const VerbLevel verbLevel = verbLevel_default) const;
269
270 private:
273
278 RCP<LOMultiVector> vertex2AggId_;
279
284 RCP<LOVector> procWinner_;
285
289 RCP<IndexManager_kokkos> geoDataKokkos_;
290
294 RCP<IndexManager> geoData_;
295
300
305
307 Teuchos::ArrayRCP<bool> isRoot_;
308
311
314
319 mutable
320 typename aggregates_sizes_type::host_mirror_type aggregateSizesHost_;
321
324};
325
326} // namespace MueLu
327
328#define MUELU_AGGREGATES_SHORT
329#endif // MUELU_AGGREGATES_DECL_HPP
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultGlobalOrdinal GlobalOrdinal
MueLu::DefaultNode Node
Container class for aggregation information.
Teuchos::ArrayRCP< bool > isRoot_
An ArrayRCP of booleans specifying if a local entry is an aggregate root.
typename LWGraph_kokkos::local_graph_type local_graph_type
KOKKOS_INLINE_FUNCTION void AggregatesCrossProcessors(const bool &flag)
Record whether aggregates include DOFs from other processes.
aggregates_sizes_type aggregateSizes_
Array of sizes of each local aggregate.
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 SetGraphNumColors(const LO graphNumColors)
Set the number of colors needed by the distance 2 coloring.
Teuchos::ArrayRCP< LocalOrdinal > ComputeAggregateSizesArrayRCP(bool forceRecompute=false) const
Compute sizes of aggregates.
void print(Teuchos::FancyOStream &out, const VerbLevel verbLevel=verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
aggregates_sizes_type::const_type ComputeAggregateSizes(bool forceRecompute=false) const
Compute sizes of aggregates.
void SetNumGlobalAggregates(GO nGlobalAggregates)
Set number of global aggregates on current processor.
RCP< LOVector > & GetProcWinnerNonConst()
Returns nonconstant vector that maps local node IDs to owning processor IDs.
RCP< IndexManager > geoData_
Kokkos::View< typename local_graph_type::entries_type::data_type, typename local_graph_type::device_type::memory_space > colors_view_type
RCP< LOMultiVector > & GetVertex2AggIdNonConst()
Returns a nonconstant vector that maps local node IDs to local aggregates IDs.
bool aggregatesIncludeGhosts_
Set to false iff aggregates do not include any DOFs belong to other processes.
KOKKOS_INLINE_FUNCTION bool AggregatesCrossProcessors() const
Return false if and only if no aggregates include DOFs from other processes.
LO numAggregates_
Number of aggregates on this processor.
typename Node::execution_space execution_space
LO GetGraphNumColors()
Get the number of colors needed by the distance 2 coloring.
aggregates_sizes_type::host_mirror_type aggregateSizesHost_
KOKKOS_INLINE_FUNCTION LO GetNumAggregates() const
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::device_type device_type
RCP< IndexManager_kokkos > & GetIndexManagerKokkos()
Get the index manager used by structured aggregation algorithms. This has to be done by the aggregati...
local_graph_type GetGraph() const
GlobalOrdinal global_ordinal_type
Kokkos::RangePolicy< local_ordinal_type, execution_space > range_type
const RCP< const Map > GetMap() const
returns (overlapping) map of aggregate/node distribution
GO GetNumGlobalAggregatesComputeIfNeeded()
Get global number of aggregates.
void SetIsRoot(LO i, bool value=true)
Set root node information.
RCP< IndexManager > & GetIndexManager()
Get the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
bool IsRoot(LO i) const
Returns true if node with given local node id is marked to be a root node.
colors_view_type graphColors_
std::string description() const
Return a simple one-line description of this object.
local_graph_type graph_
Aggregates represented as Kokkos graph type.
RCP< IndexManager_kokkos > geoDataKokkos_
Kokkos::View< LocalOrdinal *, device_type > aggregates_sizes_type
Kokkos::View< local_ordinal_type *, device_type > LO_view
const RCP< LOMultiVector > & GetVertex2AggId() const
Returns constant vector that maps local node IDs to local aggregates IDs.
GO numGlobalAggregates_
Number of global aggregates.
colors_view_type & GetGraphColors()
Get a distance 2 coloring of the underlying graph. The coloring is computed and set during Phase1 of ...
RCP< LOMultiVector > vertex2AggId_
virtual ~Aggregates()
Destructor.
const RCP< LOVector > & GetProcWinner() const
Returns constant vector that maps local node IDs to owning processor IDs.
void SetGraphColors(colors_view_type graphColors)
Set a distance 2 coloring of the underlying graph. The coloring is computed and set during Phase1 of ...
void SetIndexManager(RCP< IndexManager > &geoData)
Set the index manager used by various aggregation algorithms. This has to be done by the aggregation ...
void SetNumAggregates(LO nAggregates)
Set number of local aggregates on current processor.
Base class for MueLu classes.
typename std::conditional< OnHost, typename local_graph_device_type::HostMirror, local_graph_device_type >::type local_graph_type
Lightweight MueLu representation of a compressed row storage graph.
Lightweight MueLu representation of a compressed row storage graph.
Namespace for MueLu classes and methods.