DUNE PDELab (2.7)

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"
19#include <dune/common/unused.hh>
20
21namespace Dune
22{
23 namespace Amg
24 {
25
26 template<typename T, typename TI>
27 struct GlobalAggregatesMap
28 {
29 public:
30 typedef TI ParallelIndexSet;
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
40 GlobalAggregatesMap(AggregatesMap<Vertex>& aggregates,
41 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
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) {
49 assert(aggregate != AggregatesMap<Vertex>::UNAGGREGATED);
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];
62 assert(aggregate < AggregatesMap<Vertex>::ISOLATED);
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:
71 Proxy(const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
72 : indexset_(&indexset), aggregate_(&aggregate)
73 {}
74
75 Proxy& operator=(const GlobalIndex& global)
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:
86 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
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_;
103 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
104 static const GlobalIndex isolatedMarker;
105 };
106
107 template<typename T, typename TI>
108 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
110
111 template<typename T, typename TI>
112 struct AggregatesGatherScatter
113 {
114 typedef TI ParallelIndexSet;
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
122 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global, size_t i)
123 {
124 ga[i]=global;
125 }
126 };
127
128 template<typename T, typename O, typename I>
129 struct AggregatesPublisher
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>
141 class OwnerOverlapCopyCommunication;
142#endif
143
144 namespace Amg
145 {
146
147#if HAVE_MPI
157 template<typename T, typename O, typename T1, typename T2>
158 struct AggregatesPublisher<T,O,OwnerOverlapCopyCommunication<T1,T2> >
159 {
160 typedef T Vertex;
161 typedef O OverlapFlags;
165
166 static void publish(AggregatesMap<Vertex>& aggregates,
167 ParallelInformation& pinfo,
168 const GlobalLookupIndexSet& globalLookup)
169 {
170 typedef Dune::Amg::GlobalAggregatesMap<Vertex,IndexSet> GlobalMap;
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 (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping))
176 pinfo.copyCopyToAll(gmap,gmap);
177
178 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
179 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
180 if(lists!=pinfo.remoteIndices().end()) {
181
182 // For periodic boundary conditions we must renumber
183 // the aggregates of vertices in the overlap whose owners are
184 // on the same process
185 Vertex maxAggregate =0;
186 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
187 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
188 maxAggregate = std::max(maxAggregate, *i);
189
190 // Compute new mapping of aggregates in the overlap that we also own
191 std::map<Vertex,Vertex> newMapping;
192
193 // insert all elements into map
194 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
195 ::const_iterator RIter;
196 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
197 ri!=rend; ++ri)
198 if(O::contains(ri->localIndexPair().local().attribute()))
199 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
200 maxAggregate));
201 // renumber
202 typedef typename std::map<Vertex,Vertex>::iterator MIter;
203 for(MIter mi=newMapping.begin(), mend=newMapping.end();
204 mi != mend; ++mi)
205 mi->second=++maxAggregate;
206
207
208 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
209 ri!=rend; ++ri)
210 if(O::contains(ri->localIndexPair().local().attribute()))
211 aggregates[ri->localIndexPair().local()] =
212 newMapping[aggregates[ri->localIndexPair().local()]];
213 }
214 }
215 };
216#endif
217
218 template<typename T, typename O>
219 struct AggregatesPublisher<T,O,SequentialInformation>
220 {
221 typedef T Vertex;
222 typedef SequentialInformation ParallelInformation;
223 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
224
225 static void publish(AggregatesMap<Vertex>& aggregates,
226 ParallelInformation& pinfo,
227 const GlobalLookupIndexSet& globalLookup)
228 {
229 DUNE_UNUSED_PARAMETER(aggregates);
231 DUNE_UNUSED_PARAMETER(globalLookup);
232 }
233 };
234
235 } // end Amg namespace
236
237
238#if HAVE_MPI
239 template<typename T, typename TI>
240 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
241 {
242 typedef Amg::AggregatesMap<T> Type;
243 typedef typename Amg::GlobalAggregatesMap<T,TI>::IndexedType IndexedType;
244 typedef SizeOne IndexedTypeFlag;
245 static int getSize(const Type&, int)
246 {
247 return 1;
248 }
249 };
250#endif
251
252} // end Dune namespace
253 /* @} */
254#endif
Provides classes for the Coloring process of AMG.
A pair consisting of a global and local index.
Definition: indexset.hh:84
A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
Definition: owneroverlapcopy.hh:172
void copyCopyToAll(const T &source, T &dest) const
Communicate values from copy data points to all other data points.
Definition: owneroverlapcopy.hh:340
void copyOwnerToAll(const T &source, T &dest) const
Communicate values from owner data points to all other data points.
Definition: owneroverlapcopy.hh:323
const RemoteIndices & remoteIndices() const
Get the underlying remote indices.
Definition: owneroverlapcopy.hh:481
const_iterator end() const
Get an iterator over all remote index lists.
Definition: remoteindices.hh:1535
const_iterator find(int proc) const
Find an iterator over the remote index lists of a specific process.
Definition: remoteindices.hh:1521
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:238
const GlobalIndex & global() const
Get the global index.
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:225
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentionally unused function parameters with.
Definition: unused.hh:25
static const Vertex ISOLATED
Identifier of isolated vertices.
Definition: aggregates.hh:567
static const Vertex UNAGGREGATED
Identifier of not yet aggregated vertices.
Definition: aggregates.hh:562
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:79
Provides a map between global and local indices.
Dune namespace.
Definition: alignedallocator.hh:14
V::value_type IndexedType
The type we get at each index with operator[].
Definition: communicator.hh:146
static int getSize(const V &, int index)
Get the number of primitve elements at that index.
SizeOne IndexedTypeFlag
Whether the indexed type has variable size or there is always one value at each index.
Definition: communicator.hh:152
V Type
The type the policy is for.
Definition: communicator.hh:139
@ nonoverlapping
Category for non-overlapping solvers.
Definition: solvercategory.hh:25
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:32
Definition of the DUNE_UNUSED macro for the case that config.h is not available.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)