dune-istl 3.0-git
globalaggregates.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#ifndef DUNE_GLOBALAGGREGATES_HH
4#define DUNE_GLOBALAGGREGATES_HH
5
16#include "aggregates.hh"
17#include "pinfo.hh"
18#include <dune/common/parallel/indexset.hh>
19#include <dune/common/unused.hh>
20
21namespace Dune
22{
23 namespace Amg
24 {
25
26 template<typename T, typename TI>
28 {
29 public:
31
32 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
33
34 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
35
36 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
37
38 typedef T Vertex;
39
42 : aggregates_(aggregates), indexset_(indexset)
43 {}
44
45 inline const GlobalIndex& operator[](std::size_t index) const
46 {
47 const Vertex& aggregate = aggregates_[index];
48 if(aggregate >= AggregatesMap<Vertex>::ISOLATED) {
50 return isolatedMarker;
51 }else{
52 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
53 assert(pair!=0);
54 return pair->global();
55 }
56 }
57
58
59 inline GlobalIndex& get(std::size_t index)
60 {
61 const Vertex& aggregate = aggregates_[index];
63 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
64 assert(pair!=0);
65 return const_cast<GlobalIndex&>(pair->global());
66 }
67
68 class Proxy
69 {
70 public:
72 : indexset_(&indexset), aggregate_(&aggregate)
73 {}
74
76 {
77 if(global==isolatedMarker)
79 else{
80 //assert(global < AggregatesMap<Vertex>::ISOLATED);
81 *aggregate_ = indexset_->operator[](global).local();
82 }
83 return *this;
84 }
85 private:
87 Vertex* aggregate_;
88 };
89
90 inline Proxy operator[](std::size_t index)
91 {
92 return Proxy(indexset_, aggregates_[index]);
93 }
94
95 inline void put(const GlobalIndex& global, size_t i)
96 {
97 aggregates_[i]=indexset_[global].local();
98
99 }
100
101 private:
102 AggregatesMap<Vertex>& aggregates_;
104 static const GlobalIndex isolatedMarker;
105 };
106
107 template<typename T, typename TI>
108 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
109 std::numeric_limits<typename TI::GlobalIndex>::max();
110
111 template<typename T, typename TI>
113 {
115 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
116
117 static const GlobalIndex& gather(const GlobalAggregatesMap<T,TI>& ga, size_t i)
118 {
119 return ga[i];
120 }
121
123 {
124 ga[i]=global;
125 }
126 };
127
128 template<typename T, typename O, typename I>
130 {};
131
132#if HAVE_MPI
133
134#endif
135
136 } // namespace Amg
137
138#if HAVE_MPI
139 // forward declaration
140 template<class T1, class T2>
142#endif
143
144 namespace Amg
145 {
146
147#if HAVE_MPI
157 template<typename T, typename O, typename T1, typename T2>
159 {
160 typedef T Vertex;
163 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
164 typedef typename ParallelInformation::ParallelIndexSet IndexSet;
165
166 static void publish(AggregatesMap<Vertex>& aggregates,
167 ParallelInformation& pinfo,
168 const GlobalLookupIndexSet& globalLookup)
169 {
171 GlobalMap gmap(aggregates, globalLookup);
172 pinfo.copyOwnerToAll(gmap,gmap);
173 // communication only needed for ALU
174 // (ghosts with same global id as owners on the same process)
175 if (pinfo.getSolverCategory() ==
176 static_cast<int>(SolverCategory::nonoverlapping))
177 pinfo.copyCopyToAll(gmap,gmap);
178
179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
180 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
181 if(lists!=pinfo.remoteIndices().end()) {
182
183 // For periodic boundary conditions we must renumber
184 // the aggregates of vertices in the overlap whose owners are
185 // on the same process
187 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
189 maxAggregate = std::max(maxAggregate, *i);
190
191 // Compute new mapping of aggregates in the overlap that we also own
192 std::map<Vertex,Vertex> newMapping;
193
194 // insert all elements into map
195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
196 ::const_iterator RIter;
197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
198 ri!=rend; ++ri)
199 if(O::contains(ri->localIndexPair().local().attribute()))
200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
201 maxAggregate));
202 // renumber
203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
205 mi != mend; ++mi)
206 mi->second=++maxAggregate;
207
208
209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
210 ri!=rend; ++ri)
211 if(O::contains(ri->localIndexPair().local().attribute()))
212 aggregates[ri->localIndexPair().local()] =
213 newMapping[aggregates[ri->localIndexPair().local()]];
214 }
215 }
216 };
217#endif
218
219 template<typename T, typename O>
221 {
222 typedef T Vertex;
225
226 static void publish(AggregatesMap<Vertex>& aggregates,
227 ParallelInformation& pinfo,
228 const GlobalLookupIndexSet& globalLookup)
229 {
230 DUNE_UNUSED_PARAMETER(aggregates);
232 DUNE_UNUSED_PARAMETER(globalLookup);
233 }
234 };
235
236 } // end Amg namespace
237
238
239#if HAVE_MPI
240 template<typename T, typename TI>
241 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
242 {
246 static int getSize(const Type&, int)
247 {
248 return 1;
249 }
250 };
251#endif
252
253} // end Dune namespace
254 /* @} */
255#endif
Provides classes for the Coloring process of AMG.
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:163
const GlobalIndex & operator[](std::size_t index) const
Definition globalaggregates.hh:45
static int getSize(const Type &, int)
Definition globalaggregates.hh:246
Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
Definition globalaggregates.hh:244
GlobalIndex & get(std::size_t index)
Definition globalaggregates.hh:59
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:226
SequentialInformation ParallelInformation
Definition globalaggregates.hh:223
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:32
ParallelInformation::ParallelIndexSet IndexSet
Definition globalaggregates.hh:164
void put(const GlobalIndex &global, size_t i)
Definition globalaggregates.hh:95
T Vertex
Definition globalaggregates.hh:38
GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const GlobalLookupIndexSet< ParallelIndexSet > &indexset)
Definition globalaggregates.hh:40
TI ParallelIndexSet
Definition globalaggregates.hh:30
Amg::AggregatesMap< T > Type
Definition globalaggregates.hh:243
static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
Definition globalaggregates.hh:122
OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation
Definition globalaggregates.hh:162
SizeOne IndexedTypeFlag
Definition globalaggregates.hh:245
Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
Definition globalaggregates.hh:71
static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
Definition globalaggregates.hh:166
ParallelIndexSet::GlobalIndex GlobalIndex
Definition globalaggregates.hh:115
const AggregateDescriptor * const_iterator
Definition aggregates.hh:710
ParallelIndexSet::LocalIndex LocalIndex
Definition globalaggregates.hh:36
TI ParallelIndexSet
Definition globalaggregates.hh:114
ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
Definition globalaggregates.hh:224
static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, size_t i)
Definition globalaggregates.hh:117
Proxy & operator=(const GlobalIndex &global)
Definition globalaggregates.hh:75
ParallelIndexSet::GlobalIndex IndexedType
Definition globalaggregates.hh:34
Proxy operator[](std::size_t index)
Definition globalaggregates.hh:90
Definition basearray.hh:19
Statistics about compression achieved in implicit mode.
Definition bcrsmatrix.hh:81
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition owneroverlapcopy.hh:173
Class providing information about the mapping of the vertices onto aggregates.
Definition aggregates.hh:543
Definition globalaggregates.hh:28
Definition globalaggregates.hh:69
Definition globalaggregates.hh:113
Definition globalaggregates.hh:130
Definition pinfo.hh:26
@ nonoverlapping
Category for non-overlapping solvers.
Definition solvercategory.hh:23