Dune Core Modules (2.4.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
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.111.3 (Nov 21, 23:30, 2024)