Dune Core Modules (2.9.0)

gridview.hh
1#ifndef DUNE_SPGRID_GRIDVIEW_HH
2#define DUNE_SPGRID_GRIDVIEW_HH
3
4#include <memory>
5#include <type_traits>
6
7#include <dune/grid/common/gridview.hh>
8
10
11#include <dune/grid/spgrid/boundarysegmentiterator.hh>
13#include <dune/grid/spgrid/communication.hh>
14#include <dune/grid/spgrid/indexset.hh>
15#include <dune/grid/spgrid/intersection.hh>
16#include <dune/grid/spgrid/intersectioniterator.hh>
17#include <dune/grid/spgrid/iterator.hh>
18#include <dune/grid/spgrid/superentityiterator.hh>
19
20namespace Dune
21{
22
23 // Internal Forward Declarations
24 // -----------------------------
25
26 template< class ViewTraits >
27 class SPGridView;
28
29
30
31 // SPGridViewTraits
32 // ----------------
33
34 template< class G >
35 struct SPGridViewTraits
36 {
37 typedef SPGridView< SPGridViewTraits< G > > GridViewImp;
38
39 typedef typename std::remove_const< G >::type Grid;
40
41 typedef SPIndexSet< const Grid > IndexSet;
44
45 static const bool hasBoundarySegmentIterator = true;
47
48 typedef typename Grid::Communication Communication;
49 typedef Communication CollectiveCommunication;
50
51 static const bool conforming = true;
52
53 template< int codim >
54 struct Codim
55 {
56 typedef typename Grid::Traits::template Codim< codim >::Entity Entity;
57
58 typedef typename Grid::Traits::template Codim< codim >::Geometry Geometry;
59 typedef typename Grid::Traits::template Codim< codim >::LocalGeometry LocalGeometry;
60
61 template< PartitionIteratorType pit >
62 struct Partition
63 {
64 typedef SPPartitionIterator< codim, const Grid > IteratorImpl;
66 };
67
68 typedef typename Partition< All_Partition >::Iterator Iterator;
69 typedef typename Partition< All_Partition >::IteratorImpl IteratorImpl;
70
71 static const bool hasSuperEntityIterator = true;
72 typedef Dune::SuperEntityIterator< const Grid, SPSuperEntityIterator > SuperEntityIterator;
73 };
74 };
75
76
77
78 // SPGridView
79 // ----------
80
81 template< class ViewTraits >
82 class SPGridView
83 {
84 typedef SPGridView< ViewTraits > This;
85
86 template< class, int, template< int > class, class > friend class SPGrid;
87 template< class > friend class SPGridView;
88
89 public:
90 typedef typename ViewTraits::Grid Grid;
91 typedef typename ViewTraits::IndexSet IndexSet;
92 typedef typename ViewTraits::IntersectionIterator IntersectionIterator;
93 typedef typename ViewTraits::BoundarySegmentIterator BoundarySegmentIterator;
94 typedef typename ViewTraits::Communication Communication;
95 typedef Communication CollectiveCommunication;
96
97 typedef SPGridLevel< Grid > GridLevel;
98
99 template< int codim >
100 struct Codim
101 : public ViewTraits::template Codim< codim >
102 {};
103
104 private:
105 typedef std::pair< IndexSet, unsigned int > IndexSetPair;
106
107 typedef SPIntersectionIterator< const Grid > IntersectionIteratorImpl;
108
109 SPGridView () : indexSet_( new IndexSet ) {}
110
111 explicit SPGridView ( const GridLevel &gridLevel ) : indexSet_( new IndexSet( gridLevel ) ) {}
112
113 public:
114 const Grid &grid () const;
115
116 const IndexSet &indexSet () const;
117
118 bool isConforming() const { return bool(ViewTraits::conforming); }
119
120 int size ( int codim ) const;
121 int size ( const GeometryType &type ) const;
122
123 int overlapSize ( const int codim ) const;
124 int ghostSize ( const int codim ) const;
125
126 template< int codim >
127 typename Codim< codim >::Iterator
128 begin ( const unsigned int sweepDir = 0 ) const;
129
130 template< int codim >
131 typename Codim< codim >::Iterator
132 end ( const unsigned int sweepDir = 0 ) const;
133
134 template< int codim, PartitionIteratorType pitype >
135 typename Codim< codim >::template Partition< pitype >::Iterator
136 begin ( const unsigned int sweepDir = 0 ) const;
137
138 template< int codim, PartitionIteratorType pitype >
139 typename Codim< codim >::template Partition< pitype >::Iterator
140 end ( const unsigned int sweepDir = 0 ) const;
141
142 IntersectionIterator ibegin ( const typename Codim< 0 >::Entity &entity ) const;
143 IntersectionIterator iend ( const typename Codim< 0 >::Entity &entity ) const;
144
145 template< class Entity >
146 typename Codim< Entity::codimension >::SuperEntityIterator
147 superEntityBegin ( const Entity &entity ) const;
148
149 template< class Entity >
150 typename Codim< Entity::codimension >::SuperEntityIterator
151 superEntityEnd ( const Entity &entity ) const;
152
153 BoundarySegmentIterator boundarySegmentBegin ( int face = 0 ) const;
154 BoundarySegmentIterator boundarySegmentEnd ( int face = GridLevel::numFaces-1 ) const;
155
156 const Communication &comm () const { return grid().comm(); }
157
158 template< class DataHandle, class Data >
159 SPCommunication< Grid, CommDataHandleIF< DataHandle, Data > >
160 communicate ( CommDataHandleIF< DataHandle, Data > &data, InterfaceType iftype, CommunicationDirection dir ) const
161 {
162 return SPCommunication< Grid, CommDataHandleIF< DataHandle, Data > >( gridLevel(), data, iftype, dir );
163 }
164
165 const GridLevel &gridLevel () const { return indexSet().gridLevel(); }
166
167 void update ( const GridLevel &gridLevel ) { assert( indexSet_ ); indexSet_->update( gridLevel ); }
168
169 private:
170 std::shared_ptr< IndexSet > indexSet_;
171 };
172
173
174
175 // Implementation of SPGridView
176 // ----------------------------
177
178 template< class ViewTraits >
179 inline const typename SPGridView< ViewTraits >::Grid &
180 SPGridView< ViewTraits >::grid () const
181 {
182 return gridLevel().grid();
183 }
184
185
186 template< class ViewTraits >
187 inline const typename SPGridView< ViewTraits >::IndexSet &
188 SPGridView< ViewTraits >::indexSet () const
189 {
190 return *indexSet_;
191 }
192
193
194 template< class ViewTraits >
195 inline int SPGridView< ViewTraits >::size ( int codim ) const
196 {
197 return indexSet().size( codim );
198 }
199
200
201 template< class ViewTraits >
202 inline int SPGridView< ViewTraits >::size ( const GeometryType &type ) const
203 {
204 return indexSet().size( type );
205 }
206
207
208 template< class ViewTraits >
209 inline int SPGridView< ViewTraits >::overlapSize ( const int codim ) const
210 {
211 if( codim != 0 )
212 DUNE_THROW( NotImplemented, "overlapSize not implemented for codim > 0." );
213 int volume = gridLevel().template partition< OverlapFront_Partition >().volume();
214 volume -= gridLevel().template partition< InteriorBorder_Partition >().volume();
215 return volume;
216 }
217
218
219 template< class ViewTraits >
220 inline int SPGridView< ViewTraits >::ghostSize ( const int codim ) const
221 {
222 if( codim != 0 )
223 DUNE_THROW( NotImplemented, "ghostSize not implemented for codim > 0." );
224 return gridLevel().template partition< Ghost_Partition >().volume();
225 }
226
227
228 template< class ViewTraits >
229 template< int codim >
230 inline typename SPGridView< ViewTraits >::template Codim< codim >::Iterator
231 SPGridView< ViewTraits >::begin ( const unsigned int sweepDir ) const
232 {
233 typedef typename Codim< codim >::IteratorImpl IteratorImpl;
234 typename IteratorImpl::Begin begin;
235 return IteratorImpl( gridLevel(), gridLevel().template partition< All_Partition >(), begin, sweepDir );
236 }
237
238
239 template< class ViewTraits >
240 template< int codim >
241 inline typename SPGridView< ViewTraits >::template Codim< codim >::Iterator
242 SPGridView< ViewTraits >::end ( const unsigned int sweepDir ) const
243 {
244 typedef typename Codim< codim >::IteratorImpl IteratorImpl;
245 typename IteratorImpl::End end;
246 return IteratorImpl( gridLevel(), gridLevel().template partition< All_Partition >(), end, sweepDir );
247 }
248
249
250 template< class ViewTraits >
251 template< int codim, PartitionIteratorType pitype >
252 inline typename SPGridView< ViewTraits >::template Codim< codim >::template Partition< pitype >::Iterator
253 SPGridView< ViewTraits >::begin ( const unsigned int sweepDir ) const
254 {
255 typedef typename Codim< codim >::template Partition< pitype >::IteratorImpl IteratorImpl;
256 typename IteratorImpl::Begin begin;
257 return IteratorImpl( gridLevel(), gridLevel().template partition< pitype >(), begin, sweepDir );
258 }
259
260
261 template< class ViewTraits >
262 template< int codim, PartitionIteratorType pitype >
263 inline typename SPGridView< ViewTraits >::template Codim< codim >::template Partition< pitype >::Iterator
264 SPGridView< ViewTraits >::end ( const unsigned int sweepDir ) const
265 {
266 typedef typename Codim< codim >::template Partition< pitype >::IteratorImpl IteratorImpl;
267 typename IteratorImpl::End end;
268 return IteratorImpl( gridLevel(), gridLevel().template partition< pitype >(), end, sweepDir );
269 }
270
271
272 template< class ViewTraits >
273 inline typename SPGridView< ViewTraits >::IntersectionIterator
274 SPGridView< ViewTraits >::ibegin ( const typename Codim< 0 >::Entity &entity ) const
275 {
276 return IntersectionIteratorImpl( entity.impl().entityInfo(), 0 );
277 }
278
279
280 template< class ViewTraits >
281 inline typename SPGridView< ViewTraits >::IntersectionIterator
282 SPGridView< ViewTraits >::iend ( const typename Codim< 0 >::Entity &entity ) const
283 {
284 return IntersectionIteratorImpl( entity.impl().entityInfo(), GridLevel::ReferenceCube::numFaces );
285 }
286
287
288 template< class ViewTraits >
289 template< class Entity >
290 inline typename SPGridView< ViewTraits >::template Codim< Entity::codimension >::SuperEntityIterator
291 SPGridView< ViewTraits >::superEntityBegin ( const Entity &entity ) const
292 {
293 typedef SPSuperEntityIterator< const Grid > Impl;
294 return Impl( entity.impl().entityInfo(), typename Impl::Begin() );
295 }
296
297
298 template< class ViewTraits >
299 template< class Entity >
300 inline typename SPGridView< ViewTraits >::template Codim< Entity::codimension >::SuperEntityIterator
301 SPGridView< ViewTraits >::superEntityEnd ( const Entity &entity ) const
302 {
303 typedef SPSuperEntityIterator< const Grid > Impl;
304 return Impl( entity.impl().entityInfo(), typename Impl::End() );
305 }
306
307
308 template< class ViewTraits >
309 inline typename SPGridView< ViewTraits >::BoundarySegmentIterator
310 SPGridView< ViewTraits >::boundarySegmentBegin ( int face ) const
311 {
312 typedef SPBoundarySegmentIterator< const Grid > Impl;
313 return Impl( gridLevel(), face, typename Impl::Begin() );
314 }
315
316
317 template< class ViewTraits >
318 inline typename SPGridView< ViewTraits >::BoundarySegmentIterator
319 SPGridView< ViewTraits >::boundarySegmentEnd ( int face ) const
320 {
321 typedef SPBoundarySegmentIterator< const Grid > Impl;
322 return Impl( gridLevel(), face, typename Impl::End() );
323 }
324
325} // namespace Dune
326
327#endif // #ifndef DUNE_SPGRID_GRIDVIEW_HH
interface class for an iterator over grid entities
Definition: entityiterator.hh:32
detected_or_fallback_t< DeprecatedCollectiveCommunication_t, Communication_t, typename GridFamily::Traits > Communication
A type that is a model of Dune::Communication. It provides a portable way for communication on the se...
Definition: grid.hh:525
Mesh entities of codimension 0 ("elements") allow to visit all intersections with "neighboring" eleme...
Definition: intersectioniterator.hh:83
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: intersection.hh:164
capabilities for SPGrid
interface classes for superentity iterators
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:170
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:86
Dune namespace.
Definition: alignedallocator.hh:13
Communication< T > CollectiveCommunication
Definition: communication.hh:541
@ conforming
use only conforming bisection refinement
Definition: declaration.hh:25
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)