Dune Core Modules (2.9.0)

intersectioniteratorwrapper.hh
Go to the documentation of this file.
1 #ifndef DUNE_INTERSECTIONITERATORWRAPPER_HH
2 #define DUNE_INTERSECTIONITERATORWRAPPER_HH
3 
4 #include <dune/common/version.hh>
5 
6 #include <dune/grid/common/intersectioniterator.hh>
7 #include <dune/alugrid/common/macrogridview.hh>
8 
9 #include <dune/alugrid/common/memory.hh>
10 #include <dune/alugrid/3d/alu3dinclude.hh>
11 
17 namespace Dune {
18 
21 template <class GridImp, class IntersectionIteratorImpl>
23 {
24  enum { dim = GridImp :: dimension };
25  enum { dimworld = GridImp :: dimensionworld };
26 
28 
29  typedef IntersectionIteratorImpl IntersectionIteratorImp;
30 
31 public:
33  enum { dimension = dim };
35  enum { dimensionworld = dimworld };
36 
38  typedef typename GridImp :: ctype ctype;
39 
41  typedef typename GridImp::template Codim<0>::Entity Entity;
42 
44  typedef typename GridImp::template Codim<1>::Geometry Geometry;
46  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
47 
50 
51  typedef typename IntersectionIteratorImpl::Twists Twists;
52  typedef typename Twists::Twist Twist;
53 
54  IntersectionIteratorWrapper() : itPtr_() {}
55 
57  template <class EntityImp>
58  IntersectionIteratorWrapper(const GridImp& grid, const EntityImp & en, int wLevel , bool end)
59  : itPtr_()
60  {
61  if(end)
62  it().done( en );
63  else
64  it().first( en, wLevel, grid );
65  }
66 
67  operator bool () const { return bool( itPtr_ ); }
68 
70  bool equals ( const ThisType &other ) const
71  {
72  return (itPtr_ && other.itPtr_ ) ? it().equals( other.it() ) : itPtr_ == other.itPtr_;
73  }
74 
76  void increment ()
77  {
78  // if the shared pointer is unique we can increment
79  if( itPtr_.unique() )
80  {
81  it().increment();
82  }
83  else
84  {
85  // otherwise make a copy and assign the same intersection
86  // and then increment
87  ALU3DSPACE SharedPointer< IntersectionIteratorImp > copy( itPtr_ );
88  itPtr_.invalidate();
89  it().assign( *copy );
90  it().increment();
91  }
92  }
93 
95  Entity outside() const { return it().outside(); }
96 
98  Entity inside() const { return it().inside(); }
99 
102  bool boundary () const { return it().boundary(); }
103 
105  bool neighbor () const { return it().neighbor(); }
106 
108  int boundaryId () const { return it().boundaryId(); }
109 
111  size_t boundarySegmentIndex() const { return it().boundarySegmentIndex(); }
112 
114  int segmentId() const { return it().segmentId(); }
115 
121  {
122  return it().geometryInInside();
123  }
124 
130  {
131  return it().geometry();
132  }
133 
136  {
137  return it().type();
138  }
139 
142  int indexInInside () const
143  {
144  return it().indexInInside();
145  }
146 
151  {
152  return it().geometryInOutside();
153  }
154 
157  int indexInOutside () const
158  {
159  return it().indexInOutside();
160  }
161 
163  Twist twistInInside() const { return it().twistInInside(); }
164 
166  Twist twistInOutside() const { return it().twistInOutside(); }
167 
171  {
172  return it().unitOuterNormal( local );
173  }
174 
178  {
179  const auto& refElement = GridImp::faceReferenceElement();
180  assert( refElement.type() == type() );
181  return unitOuterNormal(refElement.position(0,0));
182  }
183 
187  {
188  return it().outerNormal( local );
189  }
190 
194  {
195  return it().integrationOuterNormal( local );
196  }
197 
199  int level () const { return it().level(); }
200 
202  bool conforming () const { return it().conforming(); }
203 
205  IntersectionIteratorImp & it() { return *itPtr_; }
206  const IntersectionIteratorImp & it() const { return *itPtr_; }
207 
209  int weight() const
210  {
211  return it().weight();
212  }
213 
214 private:
215  mutable ALU3DSPACE SharedPointer< IntersectionIteratorImp > itPtr_;
216 }; // end class IntersectionIteratorWrapper
217 
218 template <class GridImp>
219 class LeafIntersectionWrapper
220 : public IntersectionIteratorWrapper<GridImp,typename GridImp::LeafIntersectionIteratorImp>
221 {
222  typedef LeafIntersectionWrapper<GridImp> ThisType;
223  typedef IntersectionIteratorWrapper<GridImp,typename GridImp::LeafIntersectionIteratorImp> BaseType;
224 public:
225  LeafIntersectionWrapper () {}
226 
228  template <class EntityImp>
229  LeafIntersectionWrapper(const GridImp& grid, const EntityImp & en, int wLevel , bool end )
230  : BaseType( grid, en, wLevel, end )
231  {
232  }
233 
235  LeafIntersectionWrapper(const ThisType & org)
236  : BaseType(org)
237  {
238  }
239 
240 };
241 
244 template <class GridImp>
246 {
248  typedef LeafIntersectionWrapper<GridImp> IntersectionImp;
249 
250 public:
252 
254  enum { dimension = GridImp :: dimension };
256  enum { dimensionworld = GridImp :: dimensionworld };
257 
259  typedef typename GridImp :: ctype ctype;
260 
262  typedef typename GridImp::template Codim<0>::Entity Entity;
263 
265  typedef typename GridImp::template Codim<1>::Geometry Geometry;
267  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
268 
271 
274 
276  template <class EntityImp>
277  LeafIntersectionIteratorWrapper(const GridImp& grid, const EntityImp & en, int wLevel , bool end )
278  : intersection_( IntersectionImp( grid, en, wLevel, end) )
279  {}
280 
283  : intersection_( IntersectionImp( org.impl() ) )
284  {}
285 
288  {
289  impl() = org.impl();
290  return *this;
291  }
292 
294  const Intersection &dereference () const
295  {
296  return intersection_;
297  }
298 
300  bool equals (const ThisType & i) const { return impl().equals( i.impl() ); }
301 
303  void increment()
304  {
305  impl().increment();
306  }
307 protected:
308  // intersection object
309  Intersection intersection_;
310 
311  // return reference to real implementation
312  IntersectionImp& impl() { return intersection_.impl(); }
313  // return reference to real implementation
314  const IntersectionImp& impl() const { return intersection_.impl(); }
315 }; // end class IntersectionIteratorWrapper
316 
319 template <class GridImp>
321 : public IntersectionIteratorWrapper<GridImp,typename GridImp::LevelIntersectionIteratorImp>
322 {
325 public:
327 
329  template <class EntityImp>
330  LevelIntersectionWrapper(const GridImp& grid, const EntityImp & en, int wLevel , bool end )
331  : BaseType( grid, en, wLevel, end )
332  {
333  }
334 
337  : BaseType(org)
338  {
339  }
340 };
341 
344 template <class GridImp>
346 {
349 public:
351 
353  enum { dimension = GridImp :: dimension };
355  enum { dimensionworld = GridImp :: dimensionworld };
356 
358  typedef typename GridImp :: ctype ctype;
359 
361  typedef typename GridImp::template Codim<0>::Entity Entity;
362 
364  typedef typename GridImp::template Codim<1>::Geometry Geometry;
366  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
367 
370 
372 
374  template <class EntityImp>
375  LevelIntersectionIteratorWrapper(const GridImp& grid, const EntityImp & en, int wLevel , bool end )
376  : intersection_( IntersectionImp( grid, en, wLevel, end ) )
377  {
378  if( wLevel > 0 && grid.conformingRefinement() )
379  {
380  // conceptually the level intersection iterator does not work for
381  // bisection type grids, only on the macro level. Therefore,
382  // an exception is thrown here
383  DUNE_THROW( NotImplemented, "LevelIntersectionIterator does not work for bisection refinement type grids on higher levels!");
384  }
385  }
386 
389  : intersection_( IntersectionImp( org.impl() ) )
390  {}
391 
394  {
395  impl() = org.impl();
396  return *this;
397  }
398 
400  const Intersection &dereference () const
401  {
402  return intersection_;
403  }
404 
406  bool equals (const ThisType & i) const { return impl().equals( i.impl() ); }
407 
409  void increment()
410  {
411  impl().increment();
412  }
413 
414  // template <class,PartitionIteratorType> friend class MacroGridView; // specialize
415 protected:
416  // intersection object
417  Intersection intersection_;
418 
419  // return reference to real implementation
420  IntersectionImp& impl() { return intersection_.impl(); }
421  // return reference to real implementation
422  const IntersectionImp& impl() const { return intersection_.impl(); }
423 }; // end class IntersectionIteratorWrapper
424 
425 } // end namespace Dune
426 #endif
vector space out of a tensor product of fields.
Definition: fvector.hh:95
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:23
const NormalType centerUnitOuterNormal() const
Definition: intersectioniteratorwrapper.hh:177
Geometry geometry() const
Definition: intersectioniteratorwrapper.hh:129
const NormalType outerNormal(const FieldVector< ctype, dim-1 > &local) const
Definition: intersectioniteratorwrapper.hh:186
GridImp ::ctype ctype
define type used for coordinates in grid module
Definition: intersectioniteratorwrapper.hh:38
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: intersectioniteratorwrapper.hh:111
int weight() const
return weight associated with graph edge between the neighboring elements
Definition: intersectioniteratorwrapper.hh:209
bool boundary() const
Definition: intersectioniteratorwrapper.hh:102
Entity inside() const
access entity where iteration started
Definition: intersectioniteratorwrapper.hh:98
int segmentId() const
return the segment index (non-consecutive)
Definition: intersectioniteratorwrapper.hh:114
void increment()
increment iterator
Definition: intersectioniteratorwrapper.hh:76
bool conforming() const
return true if intersection is conform (i.e. only one neighbor)
Definition: intersectioniteratorwrapper.hh:202
Entity outside() const
access neighbor
Definition: intersectioniteratorwrapper.hh:95
int boundaryId() const
return information about the Boundary
Definition: intersectioniteratorwrapper.hh:108
GridImp::template Codim< 0 >::Entity Entity
Entity type.
Definition: intersectioniteratorwrapper.hh:41
IntersectionIteratorImp & it()
returns reference to underlying intersection iterator implementation
Definition: intersectioniteratorwrapper.hh:205
GeometryType type() const
obtain the type of reference element for this intersection
Definition: intersectioniteratorwrapper.hh:135
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
type of intersection*Local
Definition: intersectioniteratorwrapper.hh:46
const NormalType integrationOuterNormal(const FieldVector< ctype, dim-1 > &local) const
Definition: intersectioniteratorwrapper.hh:193
IntersectionIteratorWrapper(const GridImp &grid, const EntityImp &en, int wLevel, bool end)
constructor called from the ibegin and iend method
Definition: intersectioniteratorwrapper.hh:58
LocalGeometry geometryInInside() const
Definition: intersectioniteratorwrapper.hh:120
int level() const
return level of iterator
Definition: intersectioniteratorwrapper.hh:199
FieldVector< ctype, dimworld > NormalType
type of normal vector
Definition: intersectioniteratorwrapper.hh:49
LocalGeometry geometryInOutside() const
Definition: intersectioniteratorwrapper.hh:150
GridImp::template Codim< 1 >::Geometry Geometry
type of intersectionGlobal
Definition: intersectioniteratorwrapper.hh:44
Twist twistInOutside() const
twist of the face seen from the outer element
Definition: intersectioniteratorwrapper.hh:166
Twist twistInInside() const
twist of the face seen from the inner element
Definition: intersectioniteratorwrapper.hh:163
int indexInInside() const
Definition: intersectioniteratorwrapper.hh:142
int indexInOutside() const
Definition: intersectioniteratorwrapper.hh:157
bool neighbor() const
return true if across the intersection a neighbor on this level exists
Definition: intersectioniteratorwrapper.hh:105
const NormalType unitOuterNormal(const FieldVector< ctype, dim-1 > &local) const
Definition: intersectioniteratorwrapper.hh:170
bool equals(const ThisType &other) const
the equality method
Definition: intersectioniteratorwrapper.hh:70
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: intersection.hh:164
Implementation & impl()
access to the underlying implementation
Definition: intersection.hh:178
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:246
bool equals(const ThisType &i) const
the equality method
Definition: intersectioniteratorwrapper.hh:300
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
type of intersection*Local
Definition: intersectioniteratorwrapper.hh:267
GridImp::template Codim< 0 >::Entity Entity
Entity type.
Definition: intersectioniteratorwrapper.hh:262
LeafIntersectionIteratorWrapper(const ThisType &org)
The copy constructor.
Definition: intersectioniteratorwrapper.hh:282
GridImp ::ctype ctype
define type used for coordinates in grid module
Definition: intersectioniteratorwrapper.hh:259
LeafIntersectionIteratorWrapper(const GridImp &grid, const EntityImp &en, int wLevel, bool end)
constructor called from the ibegin and iend method
Definition: intersectioniteratorwrapper.hh:277
void increment()
increment iterator
Definition: intersectioniteratorwrapper.hh:303
GridImp::template Codim< 1 >::Geometry Geometry
type of intersectionGlobal
Definition: intersectioniteratorwrapper.hh:265
LeafIntersectionIteratorWrapper()
default constructor
Definition: intersectioniteratorwrapper.hh:273
const Intersection & dereference() const
return reference to intersection
Definition: intersectioniteratorwrapper.hh:294
ThisType & operator=(const ThisType &org)
the f*cking assignment operator
Definition: intersectioniteratorwrapper.hh:287
FieldVector< ctype, dimensionworld > NormalType
type of normal vector
Definition: intersectioniteratorwrapper.hh:270
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:346
GridImp::template Codim< 0 >::Entity Entity
Entity type.
Definition: intersectioniteratorwrapper.hh:361
bool equals(const ThisType &i) const
the equality method
Definition: intersectioniteratorwrapper.hh:406
GridImp::template Codim< 1 >::Geometry Geometry
type of intersectionGlobal
Definition: intersectioniteratorwrapper.hh:364
FieldVector< ctype, dimensionworld > NormalType
type of normal vector
Definition: intersectioniteratorwrapper.hh:369
GridImp::template Codim< 1 >::LocalGeometry LocalGeometry
type of intersection*Local
Definition: intersectioniteratorwrapper.hh:366
void increment()
increment iterator
Definition: intersectioniteratorwrapper.hh:409
GridImp ::ctype ctype
define type used for coordinates in grid module
Definition: intersectioniteratorwrapper.hh:358
const Intersection & dereference() const
return reference to intersection
Definition: intersectioniteratorwrapper.hh:400
LevelIntersectionIteratorWrapper(const ThisType &org)
The copy constructor.
Definition: intersectioniteratorwrapper.hh:388
LevelIntersectionIteratorWrapper(const GridImp &grid, const EntityImp &en, int wLevel, bool end)
constructor called from the ibegin and iend method
Definition: intersectioniteratorwrapper.hh:375
ThisType & operator=(const ThisType &org)
the f*cking assignment operator
Definition: intersectioniteratorwrapper.hh:393
Class that wraps IntersectionIteratorImp of a grid and gets it's internal object from a object stack ...
Definition: intersectioniteratorwrapper.hh:322
LevelIntersectionWrapper(const ThisType &org)
The copy constructor.
Definition: intersectioniteratorwrapper.hh:336
LevelIntersectionWrapper(const GridImp &grid, const EntityImp &en, int wLevel, bool end)
constructor called from the ibegin and iend method
Definition: intersectioniteratorwrapper.hh:330
Default exception for dummy implementations.
Definition: exceptions.hh:263
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
Static tag representing a codimension.
Definition: dimension.hh:24
Various macros to work with Dune module version numbers.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 3, 22:32, 2024)