dune-grid 2.9.0
iterator.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4// vi: set et ts=4 sw=2 sts=2:
5#ifndef DUNE_GEOGRID_ITERATOR_HH
6#define DUNE_GEOGRID_ITERATOR_HH
7
8#include <cassert>
9
10#include <type_traits>
11#include <utility>
12
13#include <dune/geometry/referenceelements.hh>
14
18
19namespace Dune
20{
21
22 namespace GeoGrid
23 {
24
25 // Internal Forward Declarations
26 // -----------------------------
27
28 template< class HostGridView, int codim, PartitionIteratorType pitype, class Grid,
29 bool fake = !Capabilities::hasHostEntity< Grid, codim >::v >
30 class Iterator;
31
32 template< class Grid >
34
35
36
37 // PartitionIteratorFilter
38 // -----------------------
39
40 template< int codim, PartitionIteratorType pitype, class Grid >
42
43 template< int codim, class Grid >
45 {
46 static const int dimension = std::remove_const< Grid >::type::dimension;
47 static const int codimension = codim;
48
49 static const PartitionIteratorType Element_Partition = Interior_Partition;
50
51 typedef typename std::remove_const< Grid >::type::ctype ctype;
52 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
53 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
54
55 static bool apply ( const RefElement &refElement,
56 const Element &element, int subEntity )
57 {
58 const int size = refElement.size( subEntity, codim, dimension );
59 for( int i = 0; i < size; ++i )
60 {
61 const int j = refElement.subEntity( subEntity, codim, i, dimension );
62 PartitionType type = element.template subEntity< dimension >( j ).partitionType();
63 if( type == InteriorEntity )
64 return true;
65 }
66 return false;
67 }
68 };
69
70 template< int codim, class Grid >
72 {
73 static const int dimension = std::remove_const< Grid >::type::dimension;
74 static const int codimension = codim;
75
76 static const PartitionIteratorType Element_Partition = Interior_Partition;
77
78 typedef typename std::remove_const< Grid >::type::ctype ctype;
79 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
80 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
81
82 static bool apply ( const RefElement &refElement,
83 const Element &element, int subEntity )
84 {
85 return true;
86 }
87 };
88
89 template< int codim, class Grid >
91 {
92 static const int dimension = std::remove_const< Grid >::type::dimension;
93 static const int codimension = codim;
94
95 static const PartitionIteratorType Element_Partition = Overlap_Partition;
96
97 typedef typename std::remove_const< Grid >::type::ctype ctype;
98 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
99 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
100
101 static bool apply ( const RefElement &refElement,
102 const Element &element, int subEntity )
103 {
104 if( element.partitionType() == InteriorEntity )
105 return true;
106
107 const int size = refElement.size( subEntity, codim, dimension );
108 for( int i = 0; i < size; ++i )
109 {
110 const int j = refElement.subEntity( subEntity, codim, i, dimension );
111 PartitionType type = element.template subEntity< dimension >( j ).partitionType();
112 if( (type == OverlapEntity) || (type == BorderEntity) )
113 return true;
114 }
115 return false;
116 }
117 };
118
119 template< int codim, class Grid >
121 {
122 static const int dimension = std::remove_const< Grid >::type::dimension;
123 static const int codimension = codim;
124
125 static const PartitionIteratorType Element_Partition = Overlap_Partition;
126
127 typedef typename std::remove_const< Grid >::type::ctype ctype;
128 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
129 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
130
131 static bool apply ( const RefElement &refElement,
132 const Element &element, int subEntity )
133 {
134 return true;
135 }
136 };
137
138 template< int codim, class Grid >
140 {
141 static const int dimension = std::remove_const< Grid >::type::dimension;
142 static const int codimension = codim;
143
144 static const PartitionIteratorType Element_Partition = All_Partition;
145
146 typedef typename std::remove_const< Grid >::type::ctype ctype;
147 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
148 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
149
150 static bool apply ( const RefElement &refElement,
151 const Element &element, int subEntity )
152 {
153 return true;
154 }
155 };
156
157 template< int codim, class Grid >
159 {
160 static const int dimension = std::remove_const< Grid >::type::dimension;
161 static const int codimension = codim;
162
163 static const PartitionIteratorType Element_Partition = Ghost_Partition;
164
165 typedef typename std::remove_const< Grid >::type::ctype ctype;
166 typedef typename std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element;
167 typedef Transitional::ReferenceElement< ctype, Dim<dimension> > RefElement;
168
169 static bool apply ( const RefElement &refElement,
170 const Element &element, int subEntity )
171 {
172 const int size = refElement.size( subEntity, codim, dimension );
173 for( int i = 0; i < size; ++i )
174 {
175 const int j = refElement.subEntity( subEntity, codim, i, dimension );
176 PartitionType type = element.template subEntity< dimension >( j ).partitionType();
177 if( type == GhostEntity )
178 return true;
179 }
180 return false;
181 }
182 };
183
184
185
186 // Iterator (real)
187 // ---------------
188
189 template< class HostGridView, int codim, PartitionIteratorType pitype, class G >
190 class Iterator< HostGridView, codim, pitype, G, false >
191 {
192 typedef typename std::remove_const< G >::type::Traits Traits;
193
194 public:
195 typedef typename Traits::Grid Grid;
196
197 static const int codimension = codim;
198
199 typedef typename Traits::template Codim< codimension >::Entity Entity;
200
201 static const bool fake = false;
202
203 private:
205
206 typedef typename HostGridView::template Codim< codim >::template Partition< pitype >::Iterator HostEntityIterator;
207
208 public:
209 Iterator () : grid_( nullptr ) {}
210
211 Iterator ( const Grid &grid, HostEntityIterator hostEntityIterator )
212 : grid_( &grid ),
213 hostEntityIterator_( std::move( hostEntityIterator ) )
214 {}
215
216 void increment ()
217 {
218 ++hostEntityIterator_;
219 }
220
221 bool equals ( const Iterator &rhs ) const
222 {
223 return hostEntityIterator_ == rhs.hostEntityIterator_;
224 }
225
227 {
228 return EntityImpl( grid(), *hostEntityIterator_ );
229 }
230
231 int level () const { return hostEntityIterator_.level(); }
232
233 const Grid &grid () const
234 {
235 assert( grid_ );
236 return *grid_;
237 }
238
239 static Iterator begin ( const Grid &grid, const HostGridView &hostGridView )
240 {
241 HostEntityIterator hostEntityIterator = hostGridView.template begin< codimension, pitype >();
242 return Iterator( grid, std::move( hostEntityIterator ) );
243 }
244
245 static Iterator end ( const Grid &grid, const HostGridView &hostGridView )
246 {
247 HostEntityIterator hostEntityIterator = hostGridView.template end< codimension, pitype >();
248 return Iterator( grid, std::move( hostEntityIterator ) );
249 }
250
251 private:
252 const Grid *grid_;
253 HostEntityIterator hostEntityIterator_;
254 };
255
256
257
258 // Iterator (fake)
259 // ---------------
260
261 template< class HostGridView, int codim, PartitionIteratorType pitype, class G >
262 class Iterator< HostGridView, codim, pitype, G, true >
263 {
264 typedef typename std::remove_const< G >::type::Traits Traits;
265
266 public:
267 typedef typename Traits::Grid Grid;
268
269 static const int codimension = codim;
270
271 typedef typename Traits::template Codim< codimension >::Entity Entity;
272
273 private:
275
277
278 typedef typename HostGridView::template Codim<0>::template Partition< Filter::Element_Partition >::Iterator HostElementIterator;
279 typedef typename HostElementIterator::Entity HostElement;
280 typedef typename HostGridView::IndexSet HostIndexSet;
281
282 public:
283 Iterator () : grid_( nullptr ), subEntity_( -1 ), hostIndexSet_( nullptr ) {}
284
285 Iterator ( const Grid &grid, HostElementIterator hostElementIterator, HostElementIterator hostEnd, const HostIndexSet &hostIndexSet )
286 : grid_( &grid ),
287 hostElementIterator_( hostElementIterator ),
288 hostEnd_( hostEnd ),
289 subEntity_( -1 ),
290 hostIndexSet_( &hostIndexSet )
291 {
292 if( hostElementIterator_ != hostEnd_ )
293 {
294 visited_.resize( hostIndexSet_->size( codimension ), false );
295 increment();
296 }
297 }
298
299 void increment ()
300 {
301 typedef typename Traits::ctype ctype;
302
303 while( hostElementIterator_ != hostEnd_ )
304 {
305 const HostElement &hostElement = *hostElementIterator_;
306
307 auto refElement = referenceElement< ctype, Traits::dimension >( hostElement.type() );
308
309 ++subEntity_;
310 const int count = refElement.size( codimension );
311 for( ; subEntity_ < count; ++subEntity_ )
312 {
313 if( !Filter::apply( refElement, hostElement, subEntity_ ) )
314 continue;
315
316 const size_t index = hostIndexSet_->subIndex( hostElement, subEntity_, codimension );
317 if( !visited_[ index ] )
318 {
319 visited_[ index ] = true;
320 return;
321 }
322 }
323 ++hostElementIterator_;
324 subEntity_ = -1;
325 }
326 }
327
328 bool equals ( const Iterator &rhs ) const
329 {
330 return hostElementIterator_ == rhs.hostElementIterator_ && ( hostElementIterator_ == hostEnd_ || subEntity_ == rhs.subEntity_ );
331 }
332
334 {
335 return EntityImpl( grid(), *hostElementIterator_, subEntity_ );
336 }
337
338 int level () const { return hostElementIterator_.level(); }
339
340 const Grid &grid () const
341 {
342 assert( grid_ );
343 return *grid_;
344 }
345
346 static Iterator begin ( const Grid &grid, const HostGridView &hostGridView )
347 {
348 HostElementIterator first = hostGridView.template begin< 0, Filter::Element_Partition >();
349 HostElementIterator last = hostGridView.template end< 0, Filter::Element_Partition >();
350 return Iterator( grid, std::move( first ), std::move( last ), hostGridView.indexSet() );
351 }
352
353 static Iterator end ( const Grid &grid, const HostGridView &hostGridView )
354 {
355 HostElementIterator last = hostGridView.template end< 0, Filter::Element_Partition >();
356 return Iterator( grid, last, last, hostGridView.indexSet() );
357 }
358
359 private:
360 const Grid *grid_;
361 HostElementIterator hostElementIterator_, hostEnd_;
362 int subEntity_;
363 const HostIndexSet *hostIndexSet_;
364 std::vector< bool > visited_;
365 };
366
367
368
369 // HierarchicIterator
370 // ------------------
371
372 template< class G >
374 {
375 typedef typename std::remove_const< G >::type::Traits Traits;
376
377 public:
378 typedef typename Traits::Grid Grid;
379
380 static const int codimension = 0;
381
382 typedef typename Traits::template Codim< codimension >::Entity Entity;
383
384 private:
386
387 typedef typename Grid::HostGrid::HierarchicIterator HostEntityIterator;
388
389 public:
390 HierarchicIterator () : grid_( nullptr ) {}
391
392 HierarchicIterator ( const Grid &grid, HostEntityIterator hostEntityIterator )
393 : grid_( &grid ),
394 hostEntityIterator_( std::move( hostEntityIterator ) )
395 {}
396
397 void increment ()
398 {
399 ++hostEntityIterator_;
400 }
401
402 bool equals ( const HierarchicIterator &rhs ) const
403 {
404 return hostEntityIterator_ == rhs.hostEntityIterator_;
405 }
406
408 {
409 return EntityImpl( grid(), *hostEntityIterator_ );
410 }
411
412 int level () const { return hostEntityIterator_.level(); }
413
414 const Grid &grid () const
415 {
416 assert( grid_ );
417 return *grid_;
418 }
419
420 private:
421 const Grid *grid_;
422 HostEntityIterator hostEntityIterator_;
423 };
424
425 } // namespace GeoGrid
426
427} // namespace Dune
428
429#endif // #ifndef DUNE_GEOGRID_ITERATOR_HH
PartitionIteratorType
Parameter to be used for the parallel level- and leaf iterators.
Definition: gridenums.hh:136
PartitionType
Attributes used in the generic overlap model.
Definition: gridenums.hh:30
@ All_Partition
all entities
Definition: gridenums.hh:141
@ OverlapFront_Partition
interior, border, overlap and front entities
Definition: gridenums.hh:140
@ Interior_Partition
only interior entities
Definition: gridenums.hh:137
@ InteriorBorder_Partition
interior and border entities
Definition: gridenums.hh:138
@ Overlap_Partition
interior, border, and overlap entities
Definition: gridenums.hh:139
@ Ghost_Partition
only ghost entities
Definition: gridenums.hh:142
@ InteriorEntity
all interior entities
Definition: gridenums.hh:31
@ GhostEntity
ghost entities
Definition: gridenums.hh:35
@ BorderEntity
on boundary between interior and overlap
Definition: gridenums.hh:32
@ OverlapEntity
all entities lying in the overlap zone
Definition: gridenums.hh:33
STL namespace.
Include standard header files.
Definition: agrid.hh:60
Grid abstract base class.
Definition: common/grid.hh:375
DUNE-conform implementation of the entity.
Definition: geometrygrid/entity.hh:694
Definition: iterator.hh:374
static const int codimension
Definition: iterator.hh:380
int level() const
Definition: iterator.hh:412
void increment()
Definition: iterator.hh:397
bool equals(const HierarchicIterator &rhs) const
Definition: iterator.hh:402
Entity dereference() const
Definition: iterator.hh:407
HierarchicIterator()
Definition: iterator.hh:390
HierarchicIterator(const Grid &grid, HostEntityIterator hostEntityIterator)
Definition: iterator.hh:392
Traits::Grid Grid
Definition: iterator.hh:378
const Grid & grid() const
Definition: iterator.hh:414
Traits::template Codim< codimension >::Entity Entity
Definition: iterator.hh:382
Definition: iterator.hh:30
Definition: iterator.hh:41
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:51
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:52
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:55
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:53
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:80
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:82
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:78
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:79
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:99
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:98
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:101
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:97
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:128
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:127
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:129
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:131
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:150
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:146
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:148
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:147
Transitional::ReferenceElement< ctype, Dim< dimension > > RefElement
Definition: iterator.hh:167
std::remove_const< Grid >::type::Traits::template Codim< 0 >::Entity Element
Definition: iterator.hh:166
std::remove_const< Grid >::type::ctype ctype
Definition: iterator.hh:165
static bool apply(const RefElement &refElement, const Element &element, int subEntity)
Definition: iterator.hh:169
Entity dereference() const
Definition: iterator.hh:226
bool equals(const Iterator &rhs) const
Definition: iterator.hh:221
static Iterator begin(const Grid &grid, const HostGridView &hostGridView)
Definition: iterator.hh:239
Traits::template Codim< codimension >::Entity Entity
Definition: iterator.hh:199
const Grid & grid() const
Definition: iterator.hh:233
static Iterator end(const Grid &grid, const HostGridView &hostGridView)
Definition: iterator.hh:245
Iterator(const Grid &grid, HostEntityIterator hostEntityIterator)
Definition: iterator.hh:211
const Grid & grid() const
Definition: iterator.hh:340
static Iterator end(const Grid &grid, const HostGridView &hostGridView)
Definition: iterator.hh:353
static Iterator begin(const Grid &grid, const HostGridView &hostGridView)
Definition: iterator.hh:346
bool equals(const Iterator &rhs) const
Definition: iterator.hh:328
Entity dereference() const
Definition: iterator.hh:333
Iterator(const Grid &grid, HostElementIterator hostElementIterator, HostElementIterator hostEnd, const HostIndexSet &hostIndexSet)
Definition: iterator.hh:285
Traits::template Codim< codimension >::Entity Entity
Definition: iterator.hh:271