Dune Core Modules (2.5.0)

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_GEOGRID_INTERSECTION_HH
4#define DUNE_GEOGRID_INTERSECTION_HH
5
6#include <dune/grid/geometrygrid/declaration.hh>
7#include <dune/grid/geometrygrid/cornerstorage.hh>
8
9namespace Dune
10{
11
12 namespace GeoGrid
13 {
14
15 // Intersection
16 // ------------
17
18 template< class Grid, class HostIntersection >
19 class Intersection
20 {
21 typedef typename HostIntersection::Geometry HostGeometry;
22 typedef typename HostIntersection::LocalGeometry HostLocalGeometry;
23
24 typedef typename std::remove_const< Grid >::type::Traits Traits;
25
26 public:
27 typedef typename Traits::ctype ctype;
28
29 static const int dimension = Traits::dimension;
30 static const int dimensionworld = Traits::dimensionworld;
31
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;
35
36 typedef typename Traits::template Codim< 0 >::Geometry ElementGeometry;
37
38 private:
39 typedef GeoGrid::IntersectionCoordVector< Grid > CoordVector;
40
41 typedef typename Traits::template Codim< 0 >::EntityImpl EntityImpl;
42
43 typedef typename Traits::template Codim< 1 >::GeometryImpl GeometryImpl;
44 typedef typename Traits::template Codim< 0 >::GeometryImpl ElementGeometryImpl;
45
46 public:
47
48 Intersection()
49 {}
50
51 explicit Intersection ( const HostIntersection &hostIntersection, const ElementGeometryImpl &insideGeo )
52 : hostIntersection_( hostIntersection )
53 , insideGeo_ ( insideGeo )
54 , geo_( grid() )
55 {}
56
57 explicit Intersection ( HostIntersection&& hostIntersection, const ElementGeometryImpl &insideGeo )
58 : hostIntersection_( std::move( hostIntersection ) )
59 , insideGeo_ ( insideGeo )
60 , geo_( grid() )
61 {}
62
63 bool equals ( const Intersection &other) const
64 {
65 return hostIntersection_ == other.hostIntersection_;
66 }
67
68 operator bool () const { return bool( hostIntersection_ ); }
69
70 Entity inside () const
71 {
72 return EntityImpl( insideGeo_, hostIntersection().inside() );
73 }
74
75 Entity outside () const
76 {
77 return EntityImpl( grid(), hostIntersection().outside() );
78 }
79
80 bool boundary () const { return hostIntersection().boundary(); }
81
82 bool conforming () const { return hostIntersection().conforming(); }
83
84 bool neighbor () const { return hostIntersection().neighbor(); }
85
86 int boundaryId () const { return hostIntersection().boundaryId(); }
87
88 size_t boundarySegmentIndex () const
89 {
90 return hostIntersection().boundarySegmentIndex();
91 }
92
93 LocalGeometry geometryInInside () const
94 {
95 return hostIntersection().geometryInInside();
96 }
97
98 LocalGeometry geometryInOutside () const
99 {
100 return hostIntersection().geometryInOutside();
101 }
102
103 Geometry geometry () const
104 {
105 if( !geo_ )
106 {
107 CoordVector coords( insideGeo_, geometryInInside() );
108 geo_ = GeometryImpl( grid(), type(), coords );
109 }
110 return Geometry( geo_ );
111 }
112
113 GeometryType type () const { return hostIntersection().type(); }
114
115 int indexInInside () const
116 {
117 return hostIntersection().indexInInside();
118 }
119
120 int indexInOutside () const
121 {
122 return hostIntersection().indexInOutside();
123 }
124
125 FieldVector< ctype, dimensionworld >
126 integrationOuterNormal ( const FieldVector< ctype, dimension-1 > &local ) const
127 {
128 const LocalGeometry geoInInside = geometryInInside();
129 const int idxInInside = indexInInside();
130
131 const ReferenceElement< ctype, dimension > &refElement
133
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 );
137
138 FieldVector< ctype, dimensionworld > normal;
139 jit.mv( refNormal, normal );
140 if( !conforming() )
141 normal *= geoInInside.volume() / refElement.template geometry< 1 >( idxInInside ).volume();
142 normal *= jit.detInv();
143 //normal *= insideGeo_.integrationElement( x );
144 return normal;
145 }
146
147 FieldVector< ctype, dimensionworld >
148 outerNormal ( const FieldVector< ctype, dimension-1 > &local ) const
149 {
150 const ReferenceElement< ctype, dimension > &refElement
152
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() );
156
157 FieldVector< ctype, dimensionworld > normal;
158 jit.mv( refNormal, normal );
159 return normal;
160 }
161
162 FieldVector< ctype, dimensionworld >
163 unitOuterNormal ( const FieldVector< ctype, dimension-1 > &local ) const
164 {
165 FieldVector< ctype, dimensionworld > normal = outerNormal( local );
166 normal *= (ctype( 1 ) / normal.two_norm());
167 return normal;
168 }
169
170 FieldVector< ctype, dimensionworld > centerUnitOuterNormal () const
171 {
172 const ReferenceElement< ctype, dimension-1 > &refFace
174 return unitOuterNormal( refFace.position( 0, 0 ) );
175 }
176
177 const HostIntersection &hostIntersection () const
178 {
179 return hostIntersection_;
180 }
181
182 const Grid &grid () const { return insideGeo_.grid(); }
183
184 private:
185 HostIntersection hostIntersection_;
186 ElementGeometryImpl insideGeo_;
187 mutable GeometryImpl geo_;
188 };
189
190 } // namespace GeoGrid
191
192} // namespace Dune
193
194#endif // #ifndef DUNE_GEOGRID_INTERSECTION_HH
@ 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
STL namespace.
static const ReferenceElement< ctype, dim > & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:757
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 23, 23:29, 2024)