3 #ifndef DUNE_GEOGRID_INTERSECTION_HH
4 #define DUNE_GEOGRID_INTERSECTION_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;
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;
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;
53 , insideGeo_ ( insideGeo )
59 , insideGeo_ ( insideGeo )
65 return hostIntersection_ == other.hostIntersection_;
68 operator bool ()
const {
return bool( hostIntersection_ ); }
108 geo_ = GeometryImpl(
grid(),
type(), coords );
125 FieldVector< ctype, dimensionworld >
131 const ReferenceElement< ctype, dimension > &refElement
132 = ReferenceElements< ctype, dimension>::general( insideGeo_.type() );
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
151 = ReferenceElements< ctype, dimension>::general( insideGeo_.type() );
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 >
165 FieldVector< ctype, dimensionworld > normal =
outerNormal( local );
166 normal *= (
ctype( 1 ) / normal.two_norm());
173 = ReferenceElements< ctype, dimension-1 >::general(
type() );
179 return hostIntersection_;
182 const Grid &
grid ()
const {
return insideGeo_.grid(); }
185 HostIntersection hostIntersection_;
186 ElementGeometryImpl insideGeo_;
187 mutable GeometryImpl geo_;
194 #endif // #ifndef DUNE_GEOGRID_INTERSECTION_HH