3#ifndef DUNE_GEOGRID_INTERSECTION_HH
4#define DUNE_GEOGRID_INTERSECTION_HH
6#include <dune/grid/geometrygrid/declaration.hh>
7#include <dune/grid/geometrygrid/cornerstorage.hh>
18 template<
class Gr
id,
class HostIntersection >
21 typedef typename HostIntersection::Geometry HostGeometry;
22 typedef typename HostIntersection::LocalGeometry HostLocalGeometry;
24 typedef typename std::remove_const< Grid >::type::Traits Traits;
27 typedef typename Traits::ctype ctype;
29 static const int dimension = Traits::dimension;
30 static const int dimensionworld = Traits::dimensionworld;
32 typedef typename Traits::template Codim< 0 >::Entity Entity;
33 typedef typename Traits::template Codim< 1 >::Geometry Geometry;
34 typedef typename Traits::template Codim< 1 >::LocalGeometry LocalGeometry;
36 typedef typename Traits::template Codim< 0 >::Geometry ElementGeometry;
39 typedef GeoGrid::IntersectionCoordVector< Grid > CoordVector;
41 typedef typename Traits::template Codim< 0 >::EntityImpl EntityImpl;
43 typedef typename Traits::template Codim< 1 >::GeometryImpl GeometryImpl;
44 typedef typename Traits::template Codim< 0 >::GeometryImpl ElementGeometryImpl;
51 explicit Intersection (
const HostIntersection &hostIntersection,
const ElementGeometryImpl &insideGeo )
52 : hostIntersection_( hostIntersection )
53 , insideGeo_ ( insideGeo )
57 explicit Intersection ( HostIntersection&& hostIntersection,
const ElementGeometryImpl &insideGeo )
58 : hostIntersection_(
std::move( hostIntersection ) )
59 , insideGeo_ ( insideGeo )
63 bool equals (
const Intersection &other)
const
65 return hostIntersection_ == other.hostIntersection_;
68 operator bool ()
const {
return bool( hostIntersection_ ); }
70 Entity inside ()
const
72 return EntityImpl( insideGeo_, hostIntersection().inside() );
75 Entity outside ()
const
77 return EntityImpl( grid(), hostIntersection().outside() );
80 bool boundary ()
const {
return hostIntersection().boundary(); }
82 bool conforming ()
const {
return hostIntersection().conforming(); }
84 bool neighbor ()
const {
return hostIntersection().neighbor(); }
86 int boundaryId ()
const {
return hostIntersection().boundaryId(); }
88 size_t boundarySegmentIndex ()
const
90 return hostIntersection().boundarySegmentIndex();
93 LocalGeometry geometryInInside ()
const
95 return hostIntersection().geometryInInside();
98 LocalGeometry geometryInOutside ()
const
100 return hostIntersection().geometryInOutside();
103 Geometry geometry ()
const
107 CoordVector coords( insideGeo_, geometryInInside() );
108 geo_ = GeometryImpl( grid(), type(), coords );
110 return Geometry( geo_ );
113 GeometryType type ()
const {
return hostIntersection().type(); }
115 int indexInInside ()
const
117 return hostIntersection().indexInInside();
120 int indexInOutside ()
const
122 return hostIntersection().indexInOutside();
125 FieldVector< ctype, dimensionworld >
126 integrationOuterNormal (
const FieldVector< ctype, dimension-1 > &local )
const
128 const LocalGeometry geoInInside = geometryInInside();
129 const int idxInInside = indexInInside();
131 const ReferenceElement< ctype, dimension > &refElement
134 FieldVector< ctype, dimension > x( geoInInside.global( local ) );
135 const typename ElementGeometryImpl::JacobianInverseTransposed &jit = insideGeo_.jacobianInverseTransposed( x );
136 const FieldVector< ctype, dimension > &refNormal = refElement.integrationOuterNormal( idxInInside );
138 FieldVector< ctype, dimensionworld > normal;
139 jit.mv( refNormal, normal );
141 normal *= geoInInside.volume() / refElement.template geometry< 1 >( idxInInside ).volume();
142 normal *= jit.detInv();
147 FieldVector< ctype, dimensionworld >
148 outerNormal (
const FieldVector< ctype, dimension-1 > &local )
const
150 const ReferenceElement< ctype, dimension > &refElement
153 FieldVector< ctype, dimension > x( geometryInInside().global( local ) );
154 const typename ElementGeometryImpl::JacobianInverseTransposed &jit = insideGeo_.jacobianInverseTransposed( x );
155 const FieldVector< ctype, dimension > &refNormal = refElement.integrationOuterNormal( indexInInside() );
157 FieldVector< ctype, dimensionworld > normal;
158 jit.mv( refNormal, normal );
162 FieldVector< ctype, dimensionworld >
163 unitOuterNormal (
const FieldVector< ctype, dimension-1 > &local )
const
165 FieldVector< ctype, dimensionworld > normal = outerNormal( local );
166 normal *= (ctype( 1 ) / normal.two_norm());
170 FieldVector< ctype, dimensionworld > centerUnitOuterNormal ()
const
172 const ReferenceElement< ctype, dimension-1 > &refFace
174 return unitOuterNormal( refFace.position( 0, 0 ) );
177 const HostIntersection &hostIntersection ()
const
179 return hostIntersection_;
182 const Grid &grid ()
const {
return insideGeo_.grid(); }
185 HostIntersection hostIntersection_;
186 ElementGeometryImpl insideGeo_;
187 mutable GeometryImpl geo_;
@ conforming
Output conforming data.
Definition: common.hh:70
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
constexpr auto equals(T1 &&t1, T2 &&t2)
Equality comparison.
Definition: hybridutilities.hh:441
Dune namespace.
Definition: alignment.hh:11
static const ReferenceElement< ctype, dim > & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:758