5#ifndef DUNE_GLOBALAGGREGATES_HH
6#define DUNE_GLOBALAGGREGATES_HH
20#include <dune/common/parallel/indexset.hh>
27 template<
typename T,
typename TI>
28 struct GlobalAggregatesMap
31 typedef TI ParallelIndexSet;
33 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
35 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
37 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
41 GlobalAggregatesMap(AggregatesMap<Vertex>& aggregates,
42 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
43 : aggregates_(aggregates), indexset_(indexset)
46 inline const GlobalIndex& operator[](std::size_t index)
const
48 const Vertex& aggregate = aggregates_[index];
51 return isolatedMarker;
53 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
55 return pair->global();
60 inline GlobalIndex& get(std::size_t index)
62 const Vertex& aggregate = aggregates_[index];
64 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
66 return const_cast<GlobalIndex&
>(pair->global());
72 Proxy(
const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
73 : indexset_(&indexset), aggregate_(&aggregate)
76 Proxy& operator=(
const GlobalIndex& global)
78 if(global==isolatedMarker)
82 *aggregate_ = indexset_->operator[](global).local();
87 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
91 inline Proxy operator[](std::size_t index)
93 return Proxy(indexset_, aggregates_[index]);
96 inline void put(
const GlobalIndex& global,
size_t i)
98 aggregates_[i]=indexset_[global].local();
103 AggregatesMap<Vertex>& aggregates_;
104 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
105 static const GlobalIndex isolatedMarker;
108 template<
typename T,
typename TI>
109 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
110 std::numeric_limits<typename TI::GlobalIndex>::max();
112 template<
typename T,
typename TI>
113 struct AggregatesGatherScatter
115 typedef TI ParallelIndexSet;
116 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
118 static const GlobalIndex& gather(
const GlobalAggregatesMap<T,TI>& ga,
size_t i)
123 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global,
size_t i)
129 template<
typename T,
typename O,
typename I>
130 struct AggregatesPublisher
141 template<
class T1,
class T2>
142 class OwnerOverlapCopyCommunication;
158 template<
typename T,
typename O,
typename T1,
typename T2>
162 typedef O OverlapFlags;
169 const GlobalLookupIndexSet& globalLookup)
171 typedef Dune::Amg::GlobalAggregatesMap<Vertex,IndexSet> GlobalMap;
172 GlobalMap gmap(aggregates, globalLookup);
179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
180 Lists lists = pinfo.
remoteIndices().find(pinfo.communicator().rank());
186 Vertex maxAggregate =0;
188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
189 maxAggregate = std::max(maxAggregate, *i);
192 std::map<Vertex,Vertex> newMapping;
195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
196 ::const_iterator RIter;
197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
199 if(O::contains(ri->localIndexPair().local().attribute()))
200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
206 mi->second=++maxAggregate;
209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
211 if(O::contains(ri->localIndexPair().local().attribute()))
212 aggregates[ri->localIndexPair().local()] =
213 newMapping[aggregates[ri->localIndexPair().local()]];
219 template<
typename T,
typename O>
220 struct AggregatesPublisher<T,O,SequentialInformation>
223 typedef SequentialInformation ParallelInformation;
224 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
227 [[maybe_unused]] ParallelInformation& pinfo,
228 [[maybe_unused]]
const GlobalLookupIndexSet& globalLookup)
236 template<
typename T,
typename TI>
237 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
239 typedef Amg::AggregatesMap<T> Type;
240 typedef typename Amg::GlobalAggregatesMap<T,TI>::IndexedType IndexedType;
241 typedef SizeOne IndexedTypeFlag;
242 static int getSize(
const Type&,
int)
Provides classes for the Coloring process of AMG.
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:174
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition: owneroverlapcopy.hh:328
Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
The type of the reverse lookup of indices.
Definition: owneroverlapcopy.hh:453
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition: owneroverlapcopy.hh:311
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:468
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition: owneroverlapcopy.hh:446
static const Vertex ISOLATED
Identifier of isolated vertices.
Definition: aggregates.hh:564
static const Vertex UNAGGREGATED
Identifier of not yet aggregated vertices.
Definition: aggregates.hh:559
@ nonoverlapping
Category for non-overlapping solvers.
Definition: solvercategory.hh:27
static Category category(const OP &op, decltype(op.category()) *=nullptr)
Helperfunction to extract the solver category either from an enum, or from the newly introduced virtu...
Definition: solvercategory.hh:34