5 #ifndef DUNE_AMG_INDICESCOARSENER_HH 6 #define DUNE_AMG_INDICESCOARSENER_HH 8 #include <dune/common/parallel/indicessyncer.hh> 34 template<
typename T,
typename E>
41 template<
typename T,
typename E>
65 typedef typename ParallelIndexSet::LocalIndex
LocalIndex;
92 template<
typename Graph,
typename VM>
93 static typename Graph::VertexDescriptor
99 typename Graph::VertexDescriptor noAggregates,
100 bool useFixedOrder =
false);
103 template<
typename G,
typename I>
106 typedef typename G::VertexDescriptor Vertex;
108 typedef I GlobalLookupIndexSet;
110 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
112 typedef typename IndexPair::GlobalIndex
GlobalIndex;
117 globalIndex_(
std::numeric_limits<GlobalIndex>::max())
124 const IndexPair* pair= lookup_.pair(edge.target());
126 globalIndex(pair->global());
127 attribute(pair->local().attribute());
128 isPublic(pair->local().isPublic());
132 Vertex
operator()([[maybe_unused]]
const GlobalIndex& global)
134 Vertex current = this->
number_;
146 isPublic_ = isPublic_ || b;
151 globalIndex_ = std::numeric_limits<GlobalIndex>::max();
157 attribute_=attribute;
172 globalIndex_ = global;
178 const GlobalLookupIndexSet& lookup_;
182 template<
typename Graph,
typename VM,
typename I>
188 ParallelAggregateRenumberer<Graph,I>& renumberer);
190 template<
typename Graph,
typename I>
191 static void buildCoarseRemoteIndices(
const RemoteIndices& fineRemote,
195 ParallelAggregateRenumberer<Graph,I>& renumberer,
203 template<
typename G,
typename L,
typename E>
221 template<
typename Graph,
typename VM>
222 static typename Graph::VertexDescriptor
228 typename Graph::VertexDescriptor noAggregates,
229 bool useFixedOrder =
false);
233 template<
typename T,
typename E>
234 template<
typename Graph,
typename VM>
235 inline typename Graph::VertexDescriptor
241 [[maybe_unused]]
typename Graph::VertexDescriptor noAggregates,
244 ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.
globalLookup());
245 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
253 template<
typename T,
typename E>
254 template<
typename Graph,
typename VM,
typename I>
259 ParallelIndexSet& coarseIndices,
260 ParallelAggregateRenumberer<Graph,I>& renumberer)
264 typedef typename Graph::ConstVertexIterator Iterator;
265 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
267 Iterator end = fineGraph.end();
268 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
270 coarseIndices.beginResize();
275 for(Iterator index = fineGraph.begin(); index != end; ++index) {
281 if(!
get(visitedMap, *index)) {
283 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
284 const IndexPair* pair= lookup.pair(*index);
291 assert(!ExcludedAttributes::contains(pair->local().attribute()));
292 renumberer.attribute(pair->local().attribute());
293 renumberer.isPublic(pair->local().isPublic());
294 renumberer.globalIndex(pair->global());
298 aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
299 fineGraph, renumberer, visitedMap);
301 if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
304 coarseIndices.add(renumberer.globalIndex(),
305 LocalIndex(renumberer, renumberer.attribute(),
306 renumberer.isPublic()));
309 aggregates[*index] = renumberer;
314 coarseIndices.endResize();
316 assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
319 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
320 put(visitedMap, *vertex,
false);
323 template<
typename T,
typename E>
324 template<
typename Graph,
typename I>
325 void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(
const RemoteIndices& fineRemote,
326 const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
327 ParallelIndexSet& coarseIndices,
328 RemoteIndices& coarseRemote,
329 ParallelAggregateRenumberer<Graph,I>& renumberer,
332 std::vector<char> attributes(static_cast<std::size_t>(renumberer));
334 GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
336 typedef typename RemoteIndices::const_iterator Iterator;
337 Iterator end = fineRemote.end();
339 for(Iterator neighbour = fineRemote.begin();
340 neighbour != end; ++neighbour) {
341 int process = neighbour->first;
343 assert(neighbour->second.first==neighbour->second.second);
346 typedef typename std::vector<char>::iterator CIterator;
348 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
349 *iter = std::numeric_limits<char>::max();
351 auto riEnd = neighbour->second.second->end();
353 for(
auto index = neighbour->second.second->begin();
354 index != riEnd; ++index) {
355 if(!E::contains(index->localIndexPair().local().attribute()) &&
356 aggregates[index->localIndexPair().local()] !=
359 assert(aggregates[index->localIndexPair().local()]<attributes.size());
360 if (attributes[aggregates[index->localIndexPair().local()]] != 3)
361 attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
366 typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
367 typedef typename RemoteIndices::RemoteIndex RemoteIndex;
368 typedef typename ParallelIndexSet::const_iterator IndexIterator;
370 Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
372 IndexIterator iend = coarseIndices.end();
373 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
374 if(attributes[index->local()] != std::numeric_limits<char>::max()) {
376 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
382 assert(coarseRemote.neighbours()==fineRemote.neighbours());
386 IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
387 syncer.sync(renumberer, useFixedOrder);
394 template<
typename Graph,
typename VM>
395 typename Graph::VertexDescriptor
398 [[maybe_unused]] Graph& fineGraph,
399 [[maybe_unused]] VM& visitedMap,
402 [[maybe_unused]]
typename Graph::VertexDescriptor noAggregates,
403 [[maybe_unused]]
bool useFixedOrder)
void reset()
Definition: indicescoarsener.hh:149
void operator()(const typename G::ConstEdgeIterator &edge)
Definition: renumberer.hh:51
Classes providing communication interfaces for overlapping Schwarz methods.
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:173
void isPublic(bool b)
Definition: indicescoarsener.hh:144
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: indicescoarsener.hh:60
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indicescoarsener.hh:65
E ExcludedAttributes
The set of excluded attributes.
Definition: indicescoarsener.hh:48
Definition: indicescoarsener.hh:42
void operator++()
Definition: renumberer.hh:57
bool isPublic()
Definition: indicescoarsener.hh:139
ParallelInformation::ParallelIndexSet ParallelIndexSet
Definition: indicescoarsener.hh:55
ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I &lookup)
Definition: indicescoarsener.hh:115
Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
The type of the parallel index set.
Definition: owneroverlapcopy.hh:449
const GlobalLookupIndexSet & globalLookup() const
Definition: owneroverlapcopy.hh:526
void operator()(const typename G::ConstEdgeIterator &edge)
Definition: indicescoarsener.hh:121
const GlobalIndex & globalIndex() const
Definition: indicescoarsener.hh:165
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:471
void attribute(const Attribute &attribute)
Definition: indicescoarsener.hh:155
static const V ISOLATED
Identifier of isolated vertices.
Definition: aggregates.hh:577
const ParallelIndexSet & indexSet() const
Get the underlying parallel index set.
Definition: owneroverlapcopy.hh:462
Definition: indicescoarsener.hh:35
Definition: allocator.hh:11
Vertex number_
Definition: renumberer.hh:35
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
The type of the remote indices.
Definition: indicescoarsener.hh:75
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:565
Definition: renumberer.hh:15
T ParallelInformation
The type of the parallel information.
Definition: indicescoarsener.hh:53
LocalIndex::Attribute Attribute
The type of the attribute.
Definition: indicescoarsener.hh:70
static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates, bool useFixedOrder=false)
Build the coarse index set after the aggregatio.
Attribute attribute()
Definition: indicescoarsener.hh:160
Vertex operator()([[maybe_unused]] const GlobalIndex &global)
Definition: indicescoarsener.hh:132
void globalIndex(const GlobalIndex &global)
Definition: indicescoarsener.hh:170