Dune Core Modules (2.3.1)

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
12
14#include <dune/grid/alugrid/2d/alu2dinclude.hh>
15#include <dune/grid/alugrid/2d/entity.hh>
16
17namespace 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
261 int twistInSelf () const
262 DUNE_DEPRECATED_MSG("Use twistInInside() instead.")
263 { return twistInInside(); }
264
266 int twistInNeighbor () const
267 DUNE_DEPRECATED_MSG("Use twistInOutside() instead.")
268 { return twistInOutside(); }
269
270 NormalType outerNormal ( const LocalCoordinate &local ) const;
271 NormalType integrationOuterNormal ( const LocalCoordinate &local ) const;
272 NormalType unitOuterNormal ( const LocalCoordinate &local ) const;
273
274 LocalGeometry geometryInInside () const;
275 LocalGeometry geometryInOutside () const;
276 Geometry geometry () const;
277
279 GeometryType type () const;
280
281 protected:
282 const GridImp& grid() const { return factory_.grid(); }
283
284 virtual bool conforming() const = 0;
285
287 void checkValid () ;
288
289 // set interator to end iterator
290 void done ( const HElementType *inside );
291 void done ( const EntityImp &en ) { done( &en.getItem() ); }
292
293 // invalidate status of internal objects
294 void unsetUp2Date() ;
295
296 // reset IntersectionIterator to first neighbour
297 void first ( const EntityImp &en, int wLevel );
298
299 // reset IntersectionIterator to first neighbour
300 virtual void setFirstItem ( const HElementType &elem, int wLevel ) = 0;
301
302 // the local geometries
303 mutable GeometryImpl intersectionGlobal_;
304 mutable LocalGeometryImpl intersectionSelfLocal_;
305 mutable LocalGeometryImpl intersectionNeighborLocal_;
306
307 // reference to factory
308 const FactoryType& factory_;
309 const LocalGeometryStorageType &localGeomStorage_;
310
311 mutable int walkLevel_;
312 }; // end ALU2dGridIntersectionBase
313
314
315
316
317 //**********************************************************************
318 //
319 // --ALU2dGridLevelIntersectionIterator
320 // --IntersectionLevelIterator
321 //**********************************************************************
322
323 template< class GridImp >
324 class ALU2dGridLevelIntersectionIterator
325 : public ALU2dGridIntersectionBase< GridImp >
326 {
327 typedef ALU2dGridLevelIntersectionIterator< GridImp > ThisType;
328 typedef ALU2dGridIntersectionBase< GridImp > BaseType;
329
330 static const int dim = GridImp::dimension;
331 static const int dimworld = GridImp::dimensionworld;
332 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
333
334 typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
335 typedef typename BaseType::HElementType HElementType;
336 typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
337 typedef typename ALU2dImplTraits< dimworld, eltype >::PeriodicBndElType PeriodicBndElType;
338
339 friend class LevelIntersectionIteratorWrapper<GridImp>;
340
341 friend class IntersectionIteratorWrapper<GridImp,ThisType>;
342
343 typedef std::pair< HElementType *, int > IntersectionInfo;
344
345 public:
346 typedef typename GridImp :: GridObjectFactoryType FactoryType;
347 typedef ALUMemoryProvider< ThisType > StorageType;
348
349 enum { dimension = GridImp::dimension };
350 enum { dimensionworld = GridImp::dimensionworld };
351
352 typedef typename GridImp::template Codim<0>::Entity Entity;
353
354 typedef typename GridImp::template Codim<1>::Geometry Geometry;
355 typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
356 typedef ALU2dGridEntity<0,dim,GridImp> EntityImp;
357 typedef ALU2dGridGeometry<dim-1,dimworld,GridImp> GeometryImp;
358 typedef ALU2dGridGeometry<dim-1,dim,GridImp> LocalGeometryImp;
359 typedef FieldVector<alu2d_ctype, dimworld> NormalType;
360 typedef ALU2dGridEntityPointer<0,GridImp> EntityPointer;
361
362 typedef MakeableInterfaceObject< Geometry > GeometryObject;
363
365 ALU2dGridLevelIntersectionIterator(const FactoryType& factory, int wLevel);
366
368 ALU2dGridLevelIntersectionIterator(const FactoryType& factory, const HElementType* el, int wLevel, bool end=true);
369
371 ALU2dGridLevelIntersectionIterator(const ALU2dGridLevelIntersectionIterator<GridImp> & org);
372
373 void assign (const ALU2dGridLevelIntersectionIterator<GridImp> & org);
374
376 void increment ();
377
378 public:
381 bool conforming () const
382 {
383 return (this->grid().nonConform() || isConform());
384 }
385
386 protected:
387 bool isConform() const
388 {
389 return (!current.outside() || (current.outside() == current.inside()->neighbour( current.index_ )));
390 }
391
392 private:
393 void doIncrement ();
394
395 // reset IntersectionIterator to first neighbour
396 void setFirstItem(const HElementType & elem, int wLevel);
397
398 // reset IntersectionIterator to first neighbour
399 template <class EntityType>
400 void first(const EntityType & en, int wLevel);
401
402 void addNeighboursToStack();
403
404 static int getOppositeInFather ( int nrInChild, int nrOfChild );
405 static int getOppositeInChild ( int nrInFather, int nrOfChild );
406
407 void setupIntersection ();
408
409 protected:
410 using BaseType::done;
411
412 using BaseType::current;
413 using BaseType::walkLevel_;
414
415 private:
416 mutable std::stack<IntersectionInfo> nbStack_;
417 }; // end ALU2dGridLevelIntersectionIterator
418
419
420
421 //********************************************************************
422 //
423 // --ALU2dGridLeafIntersectionIterator
424 //
425 //
426 //********************************************************************
427
428 template< class GridImp >
429 class ALU2dGridLeafIntersectionIterator
430 : public ALU2dGridIntersectionBase< GridImp >
431 {
432 typedef ALU2dGridLeafIntersectionIterator< GridImp > ThisType;
433 typedef ALU2dGridIntersectionBase< GridImp > BaseType;
434
435 friend class LeafIntersectionIteratorWrapper<GridImp>;
436 friend class IntersectionIteratorWrapper<GridImp,ThisType>;
437
438 static const int dim = GridImp::dimension;
439 static const int dimworld = GridImp::dimensionworld;
440 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
441
442 public:
443 typedef typename GridImp :: GridObjectFactoryType FactoryType;
444 typedef ALUMemoryProvider< ThisType > StorageType;
445
446 enum { dimension = GridImp::dimension };
447 enum { dimensionworld = GridImp::dimensionworld };
448
449 private:
450 typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
451 typedef typename BaseType::HElementType HElementType;
452 typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
453 typedef typename ALU2dImplTraits< dimworld, eltype >::PeriodicBndElType PeriodicBndElType;
454
455 typedef std::pair< HElementType *, int > IntersectionInfo;
456
457 public:
458 typedef typename GridImp::template Codim<0>::Entity Entity;
459 typedef typename GridImp::template Codim<1>::Geometry Geometry;
460 typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
461 typedef ALU2dGridEntity<0,dim,GridImp> EntityImp;
462 typedef ALU2dGridGeometry<dim-1,dimworld,GridImp> GeometryImp;
463 typedef ALU2dGridGeometry<dim-1,dim,GridImp> LocalGeometryImp;
464 typedef FieldVector<alu2d_ctype, dimworld> NormalType;
465 typedef ALU2dGridEntityPointer<0,GridImp> EntityPointer;
466
467 typedef MakeableInterfaceObject< Geometry > GeometryObject;
468
470 ALU2dGridLeafIntersectionIterator(const FactoryType& factory, int wLevel);
471
473 ALU2dGridLeafIntersectionIterator(const FactoryType& factory, const HElementType* el, int wLevel, bool end=true);
474
476 ALU2dGridLeafIntersectionIterator(const ALU2dGridLeafIntersectionIterator<GridImp> & org);
477
478 void assign (const ALU2dGridLeafIntersectionIterator<GridImp> & org);
479
481 void increment ();
482
483 public:
485 bool conforming () const
486 {
487 return (!this->grid().nonConform() || isConform());
488 }
489
490 protected:
491 bool isConform() const
492 {
493 return (!current.outside() || (current.outside()->level() == current.inside()->level()) );
494 }
495
496 private:
497 void doIncrement ();
498 // reset IntersectionIterator to first neighbour
499 void setFirstItem(const HElementType & elem, int wLevel);
500
501 // reset IntersectionIterator to first neighbour
502 template <class EntityType>
503 void first(const EntityType & en, int wLevel);
504
505 void setupIntersection ();
506
507 protected:
508 using BaseType::done;
509
510 using BaseType::current;
511 using BaseType::walkLevel_;
512
513 private:
514 std::stack<IntersectionInfo> nbStack_;
515
516 }; // end ALU2dGridLeafIntersectionIterator
517
518} // end namespace Dune
519
520#include "intersection_imp.cc"
521#if COMPILE_ALU2DGRID_INLINE
522 #include "intersection.cc"
523#endif
524
525#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
int twistInSelf() const
Definition: intersection.hh:261
int twistInNeighbor() const
Definition: intersection.hh:266
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
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
Wrapper class for geometries.
Definition: geometry.hh:102
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.
Provides proxy classes for IntersectionsIterators.
Dune namespace.
Definition: alignment.hh:14
struct DUNE_DEPRECATED_MSG("Use class StaticPower from file power.hh instead") Power_m_p
Calculates m^p at compile time.
Definition: misc.hh:54
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)