3#ifndef DUNE_ALU2DGRID_INTERSECTION_HH
4#define DUNE_ALU2DGRID_INTERSECTION_HH
14#include <dune/grid/alugrid/2d/alu2dinclude.hh>
15#include <dune/grid/alugrid/2d/entity.hh>
21 template<
int cd,
int dim,
class Gr
idImp>
22 class ALU2dGridEntity;
23 template<
int cd, PartitionIteratorType pitype,
class Gr
idImp >
24 class ALU2dGridLevelIterator;
25 template<
int cd,
class Gr
idImp >
26 class ALU2dGridEntityPointer;
27 template<
int mydim,
int coorddim,
class Gr
idImp>
28 class ALU2dGridGeometry;
29 template<
class Gr
idImp>
30 class ALU2dGridHierarchicIterator;
31 template<
class Gr
idImp>
32 class ALU2dGridIntersectionBase;
33 template<
class Gr
idImp>
34 class ALU2dGridLeafIntersectionIterator;
35 template<
class Gr
idImp>
36 class ALU2dGridLevelIntersectionIterator;
37 template<
int codim, PartitionIteratorType pitype,
class Gr
idImp>
38 class ALU2dGridLeafIterator;
39 template<
int dim,
int dimworld, ALU2DSPACE ElementType eltype >
47 template<
class Gr
idImp,
class LocalGeometryImpl >
48 class ALU2DIntersectionGeometryStorage
50 typedef ALU2DIntersectionGeometryStorage< GridImp, LocalGeometryImpl > ThisType;
53 LocalGeometryImpl geoms_[ 2 ][ 4 ][ 2 ];
55#ifdef USE_SMP_PARALLEL
59 ALU2DIntersectionGeometryStorage ();
63 const LocalGeometryImpl &localGeom (
const int aluFace,
const int twist,
const int corners )
const
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 ];
72 static const ThisType &instance ()
74#ifdef USE_SMP_PARALLEL
75 typedef ALUGridObjectFactory< GridImp > GridObjectFactoryType;
76 static std::vector< ThisType > storage( GridObjectFactoryType :: maxThreads() );
77 return storage[ GridObjectFactoryType :: threadNumber () ];
79 static const ThisType geomStorage;
100 template<
class Gr
idImp>
103 static const int dim = GridImp::dimension;
104 static const int dimworld = GridImp::dimensionworld;
105 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
111 typedef typename GridImp :: GridObjectFactoryType FactoryType;
117 enum { dimension = GridImp::dimension };
118 enum { dimensionworld = GridImp::dimensionworld };
120 typedef typename GridImp::template Codim<0>::Entity Entity;
121 typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
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;
129 typedef ALU2dGridEntityPointer<0,GridImp> EntityPointerImp;
131 typedef typename ALU2dImplTraits< dimworld, eltype >::ThinelementType ThinelementType;
132 typedef typename ALU2dImplTraits< dimworld, eltype >::HElementType HElementType;
133 typedef typename ALU2dImplTraits< dimworld, eltype >::HBndElType HBndElType;
136 typedef ALU2DIntersectionGeometryStorage< GridImp, LocalGeometryImpl > LocalGeometryStorageType;
138 typedef ALU2dGridIntersectionBase<GridImp> ThisType;
139 friend class LevelIntersectionIteratorWrapper<GridImp>;
140 friend class LeafIntersectionIteratorWrapper<GridImp>;
142 friend class IntersectionIteratorWrapper<GridImp,ThisType>;
147 explicit impl( HElementType *
inside = 0 )
148 : index_(0), useOutside_(false)
154 HElementType *
inside ()
const
164 bool isBoundary ()
const
166 assert(
inside() && (index_ < nFaces()) &&
inside()->neighbour( index_ ) );
167 return inside()->neighbour( index_ )->thinis( ThinelementType::bndel_like );
172 assert( isBoundary() );
173 return (HBndElType *)
inside()->neighbour( index_ );
181 int opposite ()
const
186 void setInside ( HElementType *
inside )
192 void setOutside ( HElementType *
outside,
int opposite )
195 opposite_ = opposite;
200 HElementType *inside_;
201 HElementType *outside_;
207 mutable bool useOutside_;
217 virtual ~ALU2dGridIntersectionBase() {}
220 void assign (
const ThisType & org);
224 return reinterpret_cast< const Intersection &
>( *this );
228 bool equals (
const ThisType & i)
const;
246 EntityPointer
inside()
const;
257 int twistInInside ()
const;
258 int twistInOutside ()
const;
260 NormalType outerNormal (
const LocalCoordinate &local )
const;
261 NormalType integrationOuterNormal (
const LocalCoordinate &local )
const;
262 NormalType unitOuterNormal (
const LocalCoordinate &local )
const;
264 LocalGeometry geometryInInside ()
const;
265 LocalGeometry geometryInOutside ()
const;
266 Geometry geometry ()
const;
272 const GridImp& grid()
const {
return factory_.grid(); }
274 virtual bool conforming()
const = 0;
280 void done (
const HElementType *
inside );
281 void done (
const EntityImp &en ) { done( &en.getItem() ); }
284 void unsetUp2Date() ;
287 void first (
const EntityImp &en,
int wLevel );
290 virtual void setFirstItem (
const HElementType &elem,
int wLevel ) = 0;
293 mutable GeometryImpl intersectionGlobal_;
294 mutable LocalGeometryImpl intersectionSelfLocal_;
295 mutable LocalGeometryImpl intersectionNeighborLocal_;
298 const FactoryType& factory_;
299 const LocalGeometryStorageType &localGeomStorage_;
301 mutable int walkLevel_;
313 template<
class Gr
idImp >
314 class ALU2dGridLevelIntersectionIterator
315 :
public ALU2dGridIntersectionBase< GridImp >
317 typedef ALU2dGridLevelIntersectionIterator< GridImp > ThisType;
318 typedef ALU2dGridIntersectionBase< GridImp > BaseType;
320 static const int dim = GridImp::dimension;
321 static const int dimworld = GridImp::dimensionworld;
322 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
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;
329 friend class LevelIntersectionIteratorWrapper<GridImp>;
331 friend class IntersectionIteratorWrapper<GridImp,ThisType>;
333 typedef std::pair< HElementType *, int > IntersectionInfo;
336 typedef typename GridImp :: GridObjectFactoryType FactoryType;
337 typedef ALUMemoryProvider< ThisType > StorageType;
339 enum { dimension = GridImp::dimension };
340 enum { dimensionworld = GridImp::dimensionworld };
342 typedef typename GridImp::template Codim<0>::Entity Entity;
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;
352 typedef MakeableInterfaceObject< Geometry > GeometryObject;
355 ALU2dGridLevelIntersectionIterator(
const FactoryType& factory,
int wLevel);
358 ALU2dGridLevelIntersectionIterator(
const FactoryType& factory,
const HElementType* el,
int wLevel,
bool end=
true);
361 ALU2dGridLevelIntersectionIterator(
const ALU2dGridLevelIntersectionIterator<GridImp> & org);
363 void assign (
const ALU2dGridLevelIntersectionIterator<GridImp> & org);
371 bool conforming ()
const
373 return (this->grid().nonConform() || isConform());
377 bool isConform()
const
379 return (!current.outside() || (current.outside() == current.inside()->neighbour( current.index_ )));
386 void setFirstItem(
const HElementType & elem,
int wLevel);
389 template <
class EntityType>
390 void first(
const EntityType & en,
int wLevel);
392 void addNeighboursToStack();
394 static int getOppositeInFather (
int nrInChild,
int nrOfChild );
395 static int getOppositeInChild (
int nrInFather,
int nrOfChild );
397 void setupIntersection ();
400 using BaseType::done;
402 using BaseType::current;
403 using BaseType::walkLevel_;
406 mutable std::stack<IntersectionInfo> nbStack_;
418 template<
class Gr
idImp >
419 class ALU2dGridLeafIntersectionIterator
420 :
public ALU2dGridIntersectionBase< GridImp >
422 typedef ALU2dGridLeafIntersectionIterator< GridImp > ThisType;
423 typedef ALU2dGridIntersectionBase< GridImp > BaseType;
425 friend class LeafIntersectionIteratorWrapper<GridImp>;
426 friend class IntersectionIteratorWrapper<GridImp,ThisType>;
428 static const int dim = GridImp::dimension;
429 static const int dimworld = GridImp::dimensionworld;
430 static const ALU2DSPACE ElementType eltype = GridImp::elementType;
433 typedef typename GridImp :: GridObjectFactoryType FactoryType;
434 typedef ALUMemoryProvider< ThisType > StorageType;
436 enum { dimension = GridImp::dimension };
437 enum { dimensionworld = GridImp::dimensionworld };
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;
445 typedef std::pair< HElementType *, int > IntersectionInfo;
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;
457 typedef MakeableInterfaceObject< Geometry > GeometryObject;
460 ALU2dGridLeafIntersectionIterator(
const FactoryType& factory,
int wLevel);
463 ALU2dGridLeafIntersectionIterator(
const FactoryType& factory,
const HElementType* el,
int wLevel,
bool end=
true);
466 ALU2dGridLeafIntersectionIterator(
const ALU2dGridLeafIntersectionIterator<GridImp> & org);
468 void assign (
const ALU2dGridLeafIntersectionIterator<GridImp> & org);
475 bool conforming ()
const
477 return (!this->grid().nonConform() || isConform());
481 bool isConform()
const
483 return (!current.outside() || (current.outside()->level() == current.inside()->level()) );
489 void setFirstItem(
const HElementType & elem,
int wLevel);
492 template <
class EntityType>
493 void first(
const EntityType & en,
int wLevel);
495 void setupIntersection ();
498 using BaseType::done;
500 using BaseType::current;
501 using BaseType::walkLevel_;
504 std::stack<IntersectionInfo> nbStack_;
510#include "intersection_imp.cc"
511#if COMPILE_ALU2DGRID_INLINE
512 #include "intersection.cc"
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