Dune Core Modules (2.3.1)

indicescoarsener.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // $Id$
4 #ifndef DUNE_AMG_INDICESCOARSENER_HH
5 #define DUNE_AMG_INDICESCOARSENER_HH
6 
8 #include <dune/common/unused.hh>
9 #include <vector>
10 #include "renumberer.hh"
11 
12 #if HAVE_MPI
14 #endif
15 
16 #include "pinfo.hh"
17 
18 namespace Dune
19 {
20  namespace Amg
21  {
22 
34  template<typename T, typename E>
35  class IndicesCoarsener
36  {};
37 
38 
39 #if HAVE_MPI
40 
41  template<typename T, typename E>
42  class ParallelIndicesCoarsener
43  {
44  public:
48  typedef E ExcludedAttributes;
49 
54 
55  typedef typename ParallelInformation::ParallelIndexSet ParallelIndexSet;
56 
61 
66 
70  typedef typename LocalIndex::Attribute Attribute;
71 
76 
88  template<typename Graph, typename VM>
89  static typename Graph::VertexDescriptor
90  coarsen(ParallelInformation& fineInfo,
91  Graph& fineGraph,
92  VM& visitedMap,
94  ParallelInformation& coarseInfo,
95  typename Graph::VertexDescriptor noAggregates);
96 
97  private:
98  template<typename G, typename I>
99  class ParallelAggregateRenumberer : public AggregateRenumberer<G>
100  {
101  typedef typename G::VertexDescriptor Vertex;
102 
103  typedef I GlobalLookupIndexSet;
104 
106 
107  typedef typename IndexPair::GlobalIndex GlobalIndex;
108 
109  public:
110  ParallelAggregateRenumberer(AggregatesMap<Vertex>& aggregates, const I& lookup)
111  : AggregateRenumberer<G>(aggregates), isPublic_(false), lookup_(lookup),
112  globalIndex_(std::numeric_limits<GlobalIndex>::max())
113  {}
114 
115 
116  void operator()(const typename G::ConstEdgeIterator& edge)
117  {
118  AggregateRenumberer<G>::operator()(edge);
119  const IndexPair* pair= lookup_.pair(edge.target());
120  if(pair!=0) {
121  globalIndex(pair->global());
122  attribute(pair->local().attribute());
123  isPublic(pair->local().isPublic());
124  }
125  }
126 
127  Vertex operator()(const GlobalIndex& global)
128  {
129  DUNE_UNUSED_PARAMETER(global);
130  Vertex current = this->number_;
131  this->operator++();
132  return current;
133  }
134 
135  bool isPublic()
136  {
137  return isPublic_;
138  }
139 
140  void isPublic(bool b)
141  {
142  isPublic_ = isPublic_ || b;
143  }
144 
145  void reset()
146  {
147  globalIndex_ = std::numeric_limits<GlobalIndex>::max();
148  isPublic_=false;
149  }
150 
151  void attribute(const Attribute& attribute)
152  {
153  attribute_=attribute;
154  }
155 
156  Attribute attribute()
157  {
158  return attribute_;
159  }
160 
161  const GlobalIndex& globalIndex() const
162  {
163  return globalIndex_;
164  }
165 
166  void globalIndex(const GlobalIndex& global)
167  {
168  globalIndex_ = global;
169  }
170 
171  private:
172  bool isPublic_;
173  Attribute attribute_;
174  const GlobalLookupIndexSet& lookup_;
175  GlobalIndex globalIndex_;
176  };
177 
178  template<typename Graph, typename VM, typename I>
179  static void buildCoarseIndexSet(const ParallelInformation& pinfo,
180  Graph& fineGraph,
181  VM& visitedMap,
182  AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
183  ParallelIndexSet& coarseIndices,
184  ParallelAggregateRenumberer<Graph,I>& renumberer);
185 
186  template<typename Graph,typename I>
187  static void buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
188  const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
189  ParallelIndexSet& coarseIndices,
190  RemoteIndices& coarseRemote,
191  ParallelAggregateRenumberer<Graph,I>& renumberer);
192 
193  };
194 
198  template<typename G, typename L, typename E>
199  class IndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
200  : public ParallelIndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
201  {};
202 
203 
204 #endif
205 
212  template<typename E>
213  class IndicesCoarsener<SequentialInformation,E>
214  {
215  public:
216  template<typename Graph, typename VM>
217  static typename Graph::VertexDescriptor
218  coarsen(const SequentialInformation & fineInfo,
219  Graph& fineGraph,
220  VM& visitedMap,
222  SequentialInformation& coarseInfo,
223  typename Graph::VertexDescriptor noAggregates);
224  };
225 
226 #if HAVE_MPI
227  template<typename T, typename E>
228  template<typename Graph, typename VM>
229  inline typename Graph::VertexDescriptor
230  ParallelIndicesCoarsener<T,E>::coarsen(ParallelInformation& fineInfo,
231  Graph& fineGraph,
232  VM& visitedMap,
234  ParallelInformation& coarseInfo,
235  typename Graph::VertexDescriptor noAggregates)
236  {
237  DUNE_UNUSED_PARAMETER(noAggregates);
238  ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.globalLookup());
239  buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
240  coarseInfo.indexSet(), renumberer);
241  buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, coarseInfo.indexSet(),
242  coarseInfo.remoteIndices(), renumberer);
243 
244  return renumberer;
245  }
246 
247  template<typename T, typename E>
248  template<typename Graph, typename VM, typename I>
249  void ParallelIndicesCoarsener<T,E>::buildCoarseIndexSet(const ParallelInformation& pinfo,
250  Graph& fineGraph,
251  VM& visitedMap,
253  ParallelIndexSet& coarseIndices,
254  ParallelAggregateRenumberer<Graph,I>& renumberer)
255  {
256  // fineGraph is the local subgraph corresponding to the vertices the process owns.
257  // i.e. no overlap/copy vertices can be visited traversing the graph
258  typedef typename Graph::ConstVertexIterator Iterator;
259  typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
260 
261  Iterator end = fineGraph.end();
262  const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
263 
264  coarseIndices.beginResize();
265 
266  // Setup the coarse index set and renumber the aggregate consecutively
267  // ascending from zero according to the minimum global index belonging
268  // to the aggregate
269  for(Iterator index = fineGraph.begin(); index != end; ++index) {
271  // Isolated vertices will not be represented on the next level.
272  // These should only be there if skipIsolated is activiated in
273  // the coarsening criterion as otherwise they will be aggregated
274  // and should have real aggregate number in the map right now.
275  if(!get(visitedMap, *index)) {
276  // This vertex was not visited by breadthFirstSearch yet.
278  const IndexPair* pair= lookup.pair(*index);
279 
280  renumberer.reset(); // reset attribute and global index.
281  if(pair!=0) {
282  // vertex is in the index set. Note that not all vertices have
283  // to be in the index set, just the ones where communication
284  // will happen.
285  assert(!ExcludedAttributes::contains(pair->local().attribute()));
286  renumberer.attribute(pair->local().attribute());
287  renumberer.isPublic(pair->local().isPublic());
288  renumberer.globalIndex(pair->global());
289  }
290 
291  // Reconstruct aggregate and mark vertices as visited
292  aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
293  fineGraph, renumberer, visitedMap);
294 
295  typedef typename GlobalLookupIndexSet::IndexPair::GlobalIndex GlobalIndex;
296 
297  if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
298  // vertex is in the index set.
299  //std::cout <<" Adding global="<< renumberer.globalIndex()<<" local="<<static_cast<std::size_t>(renumberer)<<std::endl;
300  coarseIndices.add(renumberer.globalIndex(),
301  LocalIndex(renumberer, renumberer.attribute(),
302  renumberer.isPublic()));
303  }
304 
305  aggregates[*index] = renumberer;
306  ++renumberer;
307  }
308  }
309 
310  coarseIndices.endResize();
311 
312  assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
313 
314  // Reset the visited flags
315  for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
316  put(visitedMap, *vertex, false);
317  }
318 
319  template<typename T, typename E>
320  template<typename Graph, typename I>
321  void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
322  const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
323  ParallelIndexSet& coarseIndices,
324  RemoteIndices& coarseRemote,
325  ParallelAggregateRenumberer<Graph,I>& renumberer)
326  {
327  std::vector<char> attributes(static_cast<std::size_t>(renumberer));
328 
329  GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
330 
331  typedef typename RemoteIndices::const_iterator Iterator;
332  Iterator end = fineRemote.end();
333 
334  for(Iterator neighbour = fineRemote.begin();
335  neighbour != end; ++neighbour) {
336  int process = neighbour->first;
337 
338  assert(neighbour->second.first==neighbour->second.second);
339 
340  // Mark all as not known
341  typedef typename std::vector<char>::iterator CIterator;
342 
343  for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
344  *iter = std::numeric_limits<char>::max();
345 
346  typedef typename RemoteIndices::RemoteIndexList::const_iterator Iterator;
347  Iterator riEnd = neighbour->second.second->end();
348 
349  for(Iterator index = neighbour->second.second->begin();
350  index != riEnd; ++index) {
351  if(!E::contains(index->localIndexPair().local().attribute()) &&
352  aggregates[index->localIndexPair().local()] !=
354  {
355  assert(aggregates[index->localIndexPair().local()]<attributes.size());
356  if (attributes[aggregates[index->localIndexPair().local()]] != 3)
357  attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
358  }
359  }
360 
361  // Build remote index list
362  typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
363  typedef typename RemoteIndices::RemoteIndex RemoteIndex;
364  typedef typename ParallelIndexSet::const_iterator IndexIterator;
365 
366  Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
367 
368  IndexIterator iend = coarseIndices.end();
369  for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
370  if(attributes[index->local()] != std::numeric_limits<char>::max()) {
371  // remote index is present
372  coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
373  }
374  //std::cout<<coarseRemote<<std::endl;
375  }
376 
377  // The number of neighbours should not change!
378  assert(coarseRemote.neighbours()==fineRemote.neighbours());
379 
380  // snyc the index set and the remote indices to recompute missing
381  // indices
382  IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
383  syncer.sync(renumberer);
384 
385  }
386 
387 #endif
388 
389  template<typename E>
390  template<typename Graph, typename VM>
391  typename Graph::VertexDescriptor
392  IndicesCoarsener<SequentialInformation,E>::coarsen(const SequentialInformation& fineInfo,
393  Graph& fineGraph,
394  VM& visitedMap,
395  AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
396  SequentialInformation& coarseInfo,
397  typename Graph::VertexDescriptor noAggregates)
398  {
399  DUNE_UNUSED_PARAMETER(fineInfo);
400  DUNE_UNUSED_PARAMETER(fineGraph);
401  DUNE_UNUSED_PARAMETER(visitedMap);
402  DUNE_UNUSED_PARAMETER(aggregates);
403  DUNE_UNUSED_PARAMETER(coarseInfo);
404  DUNE_UNUSED_PARAMETER(noAggregates);
405  return noAggregates;
406  }
407 
408  } //namespace Amg
409 } // namespace Dune
410 #endif
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:498
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition: indexset.hh:507
A pair consisting of a global and local index.
Definition: indexset.hh:85
An index present on the local process.
Definition: localindex.hh:34
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:173
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:218
The indices present on remote processes.
Definition: remoteindices.hh:183
Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
Type of the remote indices we manage.
Definition: remoteindices.hh:225
const IndexPair * pair(const std::size_t &local) const
Get the index pair corresponding to a local index.
void beginResize()
Indicate that the index set is to be resized.
size_t size() const
Get the total number (public and nonpublic) indices.
ArrayList< IndexPair, N >::const_iterator const_iterator
The constant iterator over the pairs.
Definition: indexset.hh:306
void add(const GlobalIndex &global)
Add an new index to the set.
const_iterator end() const
Get an iterator over the indices positioned after the last index.
LocalIndex & local()
Get the local index.
const GlobalIndex & global() const
Get the global index.
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:239
void endResize()
Indicate that the resizing finishes.
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:226
TG GlobalIndex
the type of the global index.
Definition: indexset.hh:107
SLListConstIterator< T, A > const_iterator
The constant iterator of the list.
Definition: sllist.hh:73
LocalIndex::Attribute Attribute
The type of the attribute.
Definition: indicescoarsener.hh:70
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indicescoarsener.hh:65
T ParallelInformation
The type of the parallel information.
Definition: indicescoarsener.hh:53
static const V ISOLATED
Identifier of isolated vertices.
Definition: aggregates.hh:509
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: indicescoarsener.hh:60
E ExcludedAttributes
The set of excluded attributes.
Definition: indicescoarsener.hh:48
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
The type of the remote indices.
Definition: indicescoarsener.hh:75
Class for adding missing indices of a distributed index set in a local communication.
Dune namespace.
Definition: alignment.hh:14
Classes providing communication interfaces for overlapping Schwarz methods.
Definition of the DUNE_UNUSED macro for the case that config.h is not available.
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentional unused function parameters with.
Definition: unused.hh:18
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)