Dune Core Modules (2.4.2)

intersection.hh
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_ALU2DGRID_INTERSECTION_HH
4 #define DUNE_ALU2DGRID_INTERSECTION_HH
5 
6 // System includes
7 #include <stack>
8 #include <utility>
9 
10 // Dune includes
11 #include <dune/grid/common/grid.hh>
12 
14 #include <dune/grid/alugrid/2d/alu2dinclude.hh>
15 #include <dune/grid/alugrid/2d/entity.hh>
16 
17 namespace Dune
18 {
19 
20  // Forward declarations
21  template<int cd, int dim, class GridImp>
22  class ALU2dGridEntity;
23  template<int cd, PartitionIteratorType pitype, class GridImp >
24  class ALU2dGridLevelIterator;
25  template<int cd, class GridImp >
26  class ALU2dGridEntityPointer;
27  template<int mydim, int coorddim, class GridImp>
28  class ALU2dGridGeometry;
29  template<class GridImp>
30  class ALU2dGridHierarchicIterator;
31  template<class GridImp>
32  class ALU2dGridIntersectionBase;
33  template<class GridImp>
34  class ALU2dGridLeafIntersectionIterator;
35  template<class GridImp>
36  class ALU2dGridLevelIntersectionIterator;
37  template<int codim, PartitionIteratorType pitype, class GridImp>
38  class ALU2dGridLeafIterator;
39  template< int dim, int dimworld, ALU2DSPACE ElementType eltype >
40  class ALU2dGrid;
41 
42 
43 
44  // ALU2DIntersectionGeometryStorage
45  // --------------------------------
46 
47  template< class GridImp, class LocalGeometryImpl >
48  class ALU2DIntersectionGeometryStorage
49  {
50  typedef ALU2DIntersectionGeometryStorage< GridImp, LocalGeometryImpl > ThisType;
51 
52  // one geometry for each face and twist 0 and 1
53  LocalGeometryImpl geoms_[ 2 ][ 4 ][ 2 ];
54 
55 #ifdef USE_SMP_PARALLEL
56  // make public because of std::vector
57  public:
58 #endif
59  ALU2DIntersectionGeometryStorage ();
60 
61  public:
62  // return reference to local geometry
63  const LocalGeometryImpl &localGeom ( const int aluFace, const int twist, const int corners ) const
64  {
65  assert( corners == 3 || corners == 4 );
66  assert( 0 <= aluFace && aluFace < corners );
67  assert( twist == 0 || twist == 1 );
68  return geoms_[ corners-3 ][ aluFace ][ twist ];
69  }
70 
71  // return static instance
72  static const ThisType &instance ()
73  {
74 #ifdef USE_SMP_PARALLEL
75  typedef ALUGridObjectFactory< GridImp > GridObjectFactoryType;
76  static std::vector< ThisType > storage( GridObjectFactoryType :: maxThreads() );
77  return storage[ GridObjectFactoryType :: threadNumber () ];
78 #else
79  static const ThisType geomStorage;
80  return geomStorage;
81 #endif
82  }
83  };
84 
85 
86 
87  //**********************************************************************
88  //
89  // --ALU2dGridIntersectionBase
90  // --IntersectionBase
91  //**********************************************************************
100  template<class GridImp>
102  {
103  static const int dim = GridImp::dimension;
104  static const int dimworld = GridImp::dimensionworld;
105  static const ALU2DSPACE ElementType eltype = GridImp::elementType;
106 
107  typedef typename GridImp::Traits::template Codim< 1 >::GeometryImpl GeometryImpl;
108  typedef typename GridImp::Traits::template Codim< 1 >::LocalGeometryImpl LocalGeometryImpl;
109 
110  public:
111  typedef typename GridImp :: GridObjectFactoryType FactoryType;
112 
116 
117  enum { dimension = GridImp::dimension };
118  enum { dimensionworld = GridImp::dimensionworld };
119 
120  typedef typename GridImp::template Codim<0>::Entity Entity;
121  typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
122 
123  typedef typename GridImp::template Codim<1>::Geometry Geometry;
124  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
125  typedef ALU2dGridEntity<0,dim,GridImp> EntityImp;
126  typedef FieldVector< alu2d_ctype, dimworld > NormalType;
127  typedef FieldVector< alu2d_ctype, dim-1 > LocalCoordinate;
128 
129  typedef ALU2dGridEntityPointer<0,GridImp> EntityPointerImp;
130 
131  typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
132  typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType;
133  typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
134 
135  // type of local geometry storage
136  typedef ALU2DIntersectionGeometryStorage< GridImp, LocalGeometryImpl > LocalGeometryStorageType;
137 
138  typedef ALU2dGridIntersectionBase<GridImp> ThisType;
139  friend class LevelIntersectionIteratorWrapper<GridImp>;
140  friend class LeafIntersectionIteratorWrapper<GridImp>;
141 
142  friend class IntersectionIteratorWrapper<GridImp,ThisType>;
143 
144  protected:
145  struct impl
146  {
147  explicit impl( HElementType *inside = 0 )
148  : index_(0), useOutside_(false)
149  {
150  setInside( inside );
151  setOutside( 0, -1 );
152  }
153 
154  HElementType *inside () const
155  {
156  return inside_;
157  }
158 
159  int nFaces () const
160  {
161  return nFaces_;
162  }
163 
164  bool isBoundary () const
165  {
166  assert( inside() && (index_ < nFaces()) && inside()->neighbour( index_ ) );
167  return inside()->neighbour( index_ )->thinis( ThinelementType::bndel_like );
168  }
169 
170  HBndElType *boundary () const
171  {
172  assert( isBoundary() );
173  return (HBndElType *)inside()->neighbour( index_ );
174  }
175 
176  HElementType *outside () const
177  {
178  return outside_;
179  }
180 
181  int opposite () const
182  {
183  return opposite_;
184  }
185 
186  void setInside ( HElementType *inside )
187  {
188  inside_ = inside;
189  nFaces_ = (inside != 0 ? inside->numfaces() : 0);
190  }
191 
192  void setOutside ( HElementType *outside, int opposite )
193  {
194  outside_ = outside;
195  opposite_ = opposite;
196  }
197 
198  private:
199  // current element from which we started the intersection iterator
200  HElementType *inside_;
201  HElementType *outside_;
202  int nFaces_;
203  int opposite_;
204 
205  public:
206  mutable int index_;
207  mutable bool useOutside_;
208  } current;
209 
210  public:
212  ALU2dGridIntersectionBase(const FactoryType& factory, int wLevel);
213 
215  ALU2dGridIntersectionBase(const ThisType & org);
216 
217  virtual ~ALU2dGridIntersectionBase() {}
218 
220  void assign (const ThisType & org);
221 
222  const Intersection &dereference () const
223  {
224  return reinterpret_cast< const Intersection & >( *this );
225  }
226 
228  bool equals (const ThisType & i) const;
229 
231  int level () const;
232 
234  bool boundary() const;
235 
237  int boundaryId () const;
238 
240  size_t boundarySegmentIndex() const;
241 
243  bool neighbor () const;
244 
246  EntityPointer inside() const;
247 
249  EntityPointer outside() const;
250 
252  int indexInInside () const;
253 
255  int indexInOutside () const;
256 
257  int twistInInside () const;
258  int twistInOutside () const;
259 
260  NormalType outerNormal ( const LocalCoordinate &local ) const;
261  NormalType integrationOuterNormal ( const LocalCoordinate &local ) const;
262  NormalType unitOuterNormal ( const LocalCoordinate &local ) const;
263 
264  LocalGeometry geometryInInside () const;
265  LocalGeometry geometryInOutside () const;
266  Geometry geometry () const;
267 
269  GeometryType type () const;
270 
271  protected:
272  const GridImp& grid() const { return factory_.grid(); }
273 
274  virtual bool conforming() const = 0;
275 
277  void checkValid () ;
278 
279  // set interator to end iterator
280  void done ( const HElementType *inside );
281  void done ( const EntityImp &en ) { done( &en.getItem() ); }
282 
283  // invalidate status of internal objects
284  void unsetUp2Date() ;
285 
286  // reset IntersectionIterator to first neighbour
287  void first ( const EntityImp &en, int wLevel );
288 
289  // reset IntersectionIterator to first neighbour
290  virtual void setFirstItem ( const HElementType &elem, int wLevel ) = 0;
291 
292  // the local geometries
293  mutable GeometryImpl intersectionGlobal_;
294  mutable LocalGeometryImpl intersectionSelfLocal_;
295  mutable LocalGeometryImpl intersectionNeighborLocal_;
296 
297  // reference to factory
298  const FactoryType& factory_;
299  const LocalGeometryStorageType &localGeomStorage_;
300 
301  mutable int walkLevel_;
302  }; // end ALU2dGridIntersectionBase
303 
304 
305 
306 
307  //**********************************************************************
308  //
309  // --ALU2dGridLevelIntersectionIterator
310  // --IntersectionLevelIterator
311  //**********************************************************************
312 
313  template< class GridImp >
314  class ALU2dGridLevelIntersectionIterator
315  : public ALU2dGridIntersectionBase< GridImp >
316  {
317  typedef ALU2dGridLevelIntersectionIterator< GridImp > ThisType;
318  typedef ALU2dGridIntersectionBase< GridImp > BaseType;
319 
320  static const int dim = GridImp::dimension;
321  static const int dimworld = GridImp::dimensionworld;
322  static const ALU2DSPACE ElementType eltype = GridImp::elementType;
323 
324  typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
325  typedef typename BaseType::HElementType HElementType;
326  typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
327  typedef typename ALU2dImplTraits< dimworld, eltype >::PeriodicBndElType PeriodicBndElType;
328 
329  friend class LevelIntersectionIteratorWrapper<GridImp>;
330 
331  friend class IntersectionIteratorWrapper<GridImp,ThisType>;
332 
333  typedef std::pair< HElementType *, int > IntersectionInfo;
334 
335  public:
336  typedef typename GridImp :: GridObjectFactoryType FactoryType;
337  typedef ALUMemoryProvider< ThisType > StorageType;
338 
339  enum { dimension = GridImp::dimension };
340  enum { dimensionworld = GridImp::dimensionworld };
341 
342  typedef typename GridImp::template Codim<0>::Entity Entity;
343 
344  typedef typename GridImp::template Codim<1>::Geometry Geometry;
345  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
346  typedef ALU2dGridEntity<0,dim,GridImp> EntityImp;
347  typedef ALU2dGridGeometry<dim-1,dimworld,GridImp> GeometryImp;
348  typedef ALU2dGridGeometry<dim-1,dim,GridImp> LocalGeometryImp;
349  typedef FieldVector<alu2d_ctype, dimworld> NormalType;
350  typedef ALU2dGridEntityPointer<0,GridImp> EntityPointer;
351 
352  typedef MakeableInterfaceObject< Geometry > GeometryObject;
353 
355  ALU2dGridLevelIntersectionIterator(const FactoryType& factory, int wLevel);
356 
358  ALU2dGridLevelIntersectionIterator(const FactoryType& factory, const HElementType* el, int wLevel, bool end=true);
359 
361  ALU2dGridLevelIntersectionIterator(const ALU2dGridLevelIntersectionIterator<GridImp> & org);
362 
363  void assign (const ALU2dGridLevelIntersectionIterator<GridImp> & org);
364 
366  void increment ();
367 
368  public:
371  bool conforming () const
372  {
373  return (this->grid().nonConform() || isConform());
374  }
375 
376  protected:
377  bool isConform() const
378  {
379  return (!current.outside() || (current.outside() == current.inside()->neighbour( current.index_ )));
380  }
381 
382  private:
383  void doIncrement ();
384 
385  // reset IntersectionIterator to first neighbour
386  void setFirstItem(const HElementType & elem, int wLevel);
387 
388  // reset IntersectionIterator to first neighbour
389  template <class EntityType>
390  void first(const EntityType & en, int wLevel);
391 
392  void addNeighboursToStack();
393 
394  static int getOppositeInFather ( int nrInChild, int nrOfChild );
395  static int getOppositeInChild ( int nrInFather, int nrOfChild );
396 
397  void setupIntersection ();
398 
399  protected:
400  using BaseType::done;
401 
402  using BaseType::current;
403  using BaseType::walkLevel_;
404 
405  private:
406  mutable std::stack<IntersectionInfo> nbStack_;
407  }; // end ALU2dGridLevelIntersectionIterator
408 
409 
410 
411  //********************************************************************
412  //
413  // --ALU2dGridLeafIntersectionIterator
414  //
415  //
416  //********************************************************************
417 
418  template< class GridImp >
419  class ALU2dGridLeafIntersectionIterator
420  : public ALU2dGridIntersectionBase< GridImp >
421  {
422  typedef ALU2dGridLeafIntersectionIterator< GridImp > ThisType;
423  typedef ALU2dGridIntersectionBase< GridImp > BaseType;
424 
425  friend class LeafIntersectionIteratorWrapper<GridImp>;
426  friend class IntersectionIteratorWrapper<GridImp,ThisType>;
427 
428  static const int dim = GridImp::dimension;
429  static const int dimworld = GridImp::dimensionworld;
430  static const ALU2DSPACE ElementType eltype = GridImp::elementType;
431 
432  public:
433  typedef typename GridImp :: GridObjectFactoryType FactoryType;
434  typedef ALUMemoryProvider< ThisType > StorageType;
435 
436  enum { dimension = GridImp::dimension };
437  enum { dimensionworld = GridImp::dimensionworld };
438 
439  private:
440  typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
441  typedef typename BaseType::HElementType HElementType;
442  typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
443  typedef typename ALU2dImplTraits< dimworld, eltype >::PeriodicBndElType PeriodicBndElType;
444 
445  typedef std::pair< HElementType *, int > IntersectionInfo;
446 
447  public:
448  typedef typename GridImp::template Codim<0>::Entity Entity;
449  typedef typename GridImp::template Codim<1>::Geometry Geometry;
450  typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
451  typedef ALU2dGridEntity<0,dim,GridImp> EntityImp;
452  typedef ALU2dGridGeometry<dim-1,dimworld,GridImp> GeometryImp;
453  typedef ALU2dGridGeometry<dim-1,dim,GridImp> LocalGeometryImp;
454  typedef FieldVector<alu2d_ctype, dimworld> NormalType;
455  typedef ALU2dGridEntityPointer<0,GridImp> EntityPointer;
456 
457  typedef MakeableInterfaceObject< Geometry > GeometryObject;
458 
460  ALU2dGridLeafIntersectionIterator(const FactoryType& factory, int wLevel);
461 
463  ALU2dGridLeafIntersectionIterator(const FactoryType& factory, const HElementType* el, int wLevel, bool end=true);
464 
466  ALU2dGridLeafIntersectionIterator(const ALU2dGridLeafIntersectionIterator<GridImp> & org);
467 
468  void assign (const ALU2dGridLeafIntersectionIterator<GridImp> & org);
469 
471  void increment ();
472 
473  public:
475  bool conforming () const
476  {
477  return (!this->grid().nonConform() || isConform());
478  }
479 
480  protected:
481  bool isConform() const
482  {
483  return (!current.outside() || (current.outside()->level() == current.inside()->level()) );
484  }
485 
486  private:
487  void doIncrement ();
488  // reset IntersectionIterator to first neighbour
489  void setFirstItem(const HElementType & elem, int wLevel);
490 
491  // reset IntersectionIterator to first neighbour
492  template <class EntityType>
493  void first(const EntityType & en, int wLevel);
494 
495  void setupIntersection ();
496 
497  protected:
498  using BaseType::done;
499 
500  using BaseType::current;
501  using BaseType::walkLevel_;
502 
503  private:
504  std::stack<IntersectionInfo> nbStack_;
505 
506  }; // end ALU2dGridLeafIntersectionIterator
507 
508 } // end namespace Dune
509 
510 #include "intersection_imp.cc"
511 #if COMPILE_ALU2DGRID_INLINE
512  #include "intersection.cc"
513 #endif
514 
515 #endif // #ifndef DUNE_ALU2DGRID_INTERSECTION_HH
Definition: intersection.hh:102
void checkValid()
return true if intersection is with boundary
Definition: intersection_imp.cc:92
bool boundary() const
return true if intersection is with boundary
Definition: intersection_imp.cc:104
GeometryType type() const
obtain the type of reference element for this intersection
Definition: intersection_imp.cc:309
void assign(const ThisType &org)
The copy constructor.
Definition: intersection_imp.cc:50
EntityPointer inside() const
return EntityPointer to the Entity on the inside of this intersection.
Definition: intersection_imp.cc:140
size_t boundarySegmentIndex() const
return the boundary segment index
Definition: intersection_imp.cc:118
ALU2dGridIntersectionBase(const FactoryType &factory, int wLevel)
The default Constructor , creating an empty ALU2dGridIntersectionIterator.
Definition: intersection_imp.cc:28
int level() const
return level of inside(entity)
Definition: intersection_imp.cc:71
int indexInInside() const
local index of codim 1 entity in self where intersection is contained in
Definition: intersection_imp.cc:165
void first(const EntityImp &en, int wLevel)
reset IntersectionIterator to first neighbour
Definition: intersection_imp.cc:81
int boundaryId() const
return boundary type
Definition: intersection_imp.cc:110
Dune::Intersection< GridImp, Dune::ALU2dGridIntersectionBase< GridImp > > Intersection
type of the intersection
Definition: intersection.hh:115
bool equals(const ThisType &i) const
check whether entities are the same or whether iterator is done
Definition: intersection_imp.cc:63
int indexInOutside() const
local index of codim 1 entity in neighbor where intersection is contained in
Definition: intersection_imp.cc:176
EntityPointer outside() const
return EntityPointer to the Entity on the outside of this intersection.
Definition: intersection_imp.cc:157
bool neighbor() const
return true if intersection is with neighbor on this level
Definition: intersection_imp.cc:132
Intersection of a mesh entities of codimension 0 ("elements") with a "neighboring" element or with th...
Definition: intersection.hh:161
Different resources needed by all grid implementations.
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
Provides proxy classes for IntersectionsIterators.
Dune namespace.
Definition: alignment.hh:10
Static tag representing a codimension.
Definition: dimension.hh:22
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)