1#ifndef DUNE_FEM_TWISTUTILITY_HH
2#define DUNE_FEM_TWISTUTILITY_HH
6#include <dune/common/version.hh>
8#include <dune/geometry/type.hh>
10#include <dune/grid/utility/hostgridaccess.hh>
24 template<
class Gr
id >
30 template<
class Intersection >
37 template<
class Intersection >
44 template<
class Intersection >
45 static GeometryType
elementGeometry (
const Intersection &intersection,
const bool inside )
47 typedef Dune::Capabilities::hasSingleGeometryType< GridType > hasSingleGeometryType;
48 if( hasSingleGeometryType::v )
49 return GeometryType( hasSingleGeometryType::topologyId, GridType::dimension );
51 return inside ? intersection.inside().type() : intersection.outside().type();
81 template<
class Gr
id >
92 template<
int dim,
int dimW >
96 typedef typename GridType::Traits::LeafIntersectionIterator LeafIntersectionIterator;
97 typedef typename LeafIntersectionIterator::Intersection LeafIntersection;
98 typedef typename GridType::Traits::LevelIntersectionIterator LevelIntersectionIterator;
99 typedef typename LevelIntersectionIterator::Intersection LevelIntersection;
101 static const int dimension = GridType::dimension;
107 return grid.getTwistInInside( it );
113 return grid.getTwistInOutside( it );
118 template <
class Intersection>
119 static inline GeometryType
123 return Dune::GeometryTypes::simplex(dimension);
136 template<
int dim,
int dimw, ALUGr
idElementType elType, ALUGr
idRefinementType refineType,
class Comm >
137 struct TwistUtility< ALUGrid< dim, dimw, elType, refineType, Comm > >
139 typedef ALUGrid< dim, dimw, elType, refineType, Comm >
GridType;
143 template<
class Intersection >
146 assert( dim == 2 ? (intersection.impl().twistInInside() == 0 ||
147 intersection.impl().twistInInside() == 1 ) :
true );
148 return intersection.impl().twistInInside();
152 template<
class Intersection >
155 assert( dim == 2 ? (intersection.impl().twistInOutside() == 0 ||
156 intersection.impl().twistInOutside() == 1 ) :
true );
157 return intersection.impl().twistInOutside();
162 template <
class Intersection>
163 static inline GeometryType
167 return GeometryType( Dune::Capabilities::hasSingleGeometryType< GridType > :: topologyId,
172 TwistUtility(
const TwistUtility&);
173 TwistUtility& operator=(
const TwistUtility&);
184 struct TwistUtility< UGGrid< dim > >
188 typedef typename GridType::Traits::LeafIntersectionIterator LeafIntersectionIterator;
189 typedef typename LeafIntersectionIterator::Intersection LeafIntersection;
190 typedef typename GridType::Traits::LevelIntersectionIterator LevelIntersectionIterator;
191 typedef typename LevelIntersectionIterator::Intersection LevelIntersection;
199 template<
class Intersection >
201 elementGeometry (
const Intersection &intersection,
const bool inside )
203 return (inside ? intersection.inside().type() : intersection.outside().type());
213 template<
class HostGr
id,
class CoordFunction,
class Allocator >
214 struct TwistUtility< GeometryGrid< HostGrid, CoordFunction, Allocator > >
216 typedef GeometryGrid< HostGrid, CoordFunction, Allocator >
GridType;
228 template<
class Intersection >
231 return HostTwistUtility::twistInSelf( grid.hostGrid(), HostGridAccess::hostIntersection( intersection ) );
235 template<
class Intersection >
238 return HostTwistUtility::twistInNeighbor( grid.hostGrid(), HostGridAccess::hostIntersection( intersection ) );
242 template<
class Intersection >
245 return HostTwistUtility::elementGeometry( HostGridAccess::hostIntersection( intersection ), inside );
Definition: bindguard.hh:11
Definition: boundaryidprovider.hh:25
Definition: griddeclaration.hh:39
TwistFreeTwistUtility provides the default implementation for twistfree grid such as Cartesian grids.
Definition: twistutility.hh:26
Grid GridType
Definition: twistutility.hh:27
static int twistInSelf(const GridType &, const Intersection &)
return 0 for inner face
Definition: twistutility.hh:31
static GeometryType elementGeometry(const Intersection &intersection, const bool inside)
return geometry type of inside or outside entity
Definition: twistutility.hh:45
static int twistInNeighbor(const GridType &, const Intersection &)
return 0 for outer face
Definition: twistutility.hh:38
Utility to get twist from IntersectionIterator, if provided by grid (i.e. AlbertaGrid,...
Definition: twistutility.hh:84
LevelIntersectionIterator::Intersection LevelIntersection
Definition: twistutility.hh:220
GridType::Traits::LevelIntersectionIterator LevelIntersectionIterator
Definition: twistutility.hh:219
static int twistInSelf(const GridType &grid, const Intersection &intersection)
return twist for inner face
Definition: twistutility.hh:229
LeafIntersectionIterator::Intersection LeafIntersection
Definition: twistutility.hh:218
GeometryGrid< HostGrid, CoordFunction, Allocator > GridType
Definition: twistutility.hh:216
static GeometryType elementGeometry(const Intersection &intersection, bool inside)
return element geometry type of inside or outside entity
Definition: twistutility.hh:243
static int twistInNeighbor(const GridType &grid, const Intersection &intersection)
return twist for outer face
Definition: twistutility.hh:236
GridType::Traits::LeafIntersectionIterator LeafIntersectionIterator
Definition: twistutility.hh:217