1 #ifndef DUNE_ENTITYKEY_INLINE_HH
2 #define DUNE_ENTITYKEY_INLINE_HH
5 #include <dune/geometry/referenceelements.hh>
17 origKey_( key.size() ),
18 origKeySet_( setOrigKey )
20 for (
size_t i=0;i<key_.size();i++)
25 std :: sort( key_.begin(), key_.end() );
31 int N,
int offset,
bool setOrigKey )
34 origKeySet_( setOrigKey )
36 for (
size_t i=0;i<key_.size();i++)
38 key_[i]=key[(i+offset)%key.size()];
39 origKey_[i]=key[(i+offset)%key.size()];
41 std :: sort( key_.begin(), key_.end() );
47 : key_( k.key_.size() ),
48 origKey_( k.key_.size() ),
49 origKeySet_( k. origKeySet_ )
51 for (
size_t i=0;i<key_.size();i++)
54 origKey_[i]=k.origKey_[i];
62 assert(key_.size()==k.key_.size());
63 for (
size_t i=0;i<key_.size();i++) {
65 origKey_[i]=k.origKey_[i];
67 origKeySet_ = k.origKeySet_;
77 assert( (
size_t) origKey_[0] < vtx.size() );
78 std::vector<double>& p0 = vtx[origKey_[0]];
79 assert( (
size_t) origKey_[1] < vtx.size() );
80 std::vector<double>& p1 = vtx[origKey_[1]];
81 assert( (
size_t) origKey_[2] < vtx.size() );
82 std::vector<double>& p2 = vtx[origKey_[2]];
83 assert( (
size_t) base < vtx.size() );
84 std::vector<double>& q = vtx[base];
86 n[0] = (p1[1]-p0[1])*(p2[2]-p0[2])-(p2[1]-p0[1])*(p1[2]-p0[2]);
87 n[1] = (p1[2]-p0[2])*(p2[0]-p0[0])-(p2[2]-p0[2])*(p1[0]-p0[0]);
88 n[2] = (p1[0]-p0[0])*(p2[1]-p0[1])-(p2[0]-p0[0])*(p1[1]-p0[1]);
89 double test = n[0]*(q[0]-p0[0])+n[1]*(q[1]-p0[1])+n[2]*(q[2]-p0[2]);
90 bool reorient = (test>0);
93 origKey_[1]=origKey_[2];
103 for(
size_t i = 0; i < key_.size(); ++i )
104 out << key_[ i ] <<
" ";
114 ElementFaceUtil::generateCubeFace
115 (
const std::vector< unsigned int > &element,
int f )
117 const GenericReferenceElement< double, dim > &refCube
119 const unsigned int size = refCube.size( f, 1, dim );
120 std::vector< unsigned int > k( size );
121 for(
unsigned int i = 0; i < size; ++ i )
122 k[ i ] = element[ refCube.subEntity( f, 1, i, dim ) ];
128 inline DGFEntityKey< unsigned int >
129 ElementFaceUtil :: generateSimplexFace
130 (
const std :: vector< unsigned int > &element,
int f )
132 const GenericReferenceElement< double, dim > &refSimplex
134 const unsigned int size = refSimplex.size( f, 1, dim );
135 std :: vector< unsigned int > k( size );
136 for(
unsigned int i = 0; i < size; ++i )
137 k[ i ] = element[ refSimplex.subEntity( f, 1, i, dim ) ];
138 return DGFEntityKey< unsigned int >( k );
142 inline DGFEntityKey< unsigned int >
145 if( element.size() == size_t(dim+1) )
151 return generateSimplexFace< 3 >( element, f );
153 return generateSimplexFace< 2 >( element, f );
155 return generateSimplexFace< 1 >( element, f );
157 DUNE_THROW( NotImplemented,
"ElementUtil::generateFace not implemented for dim = " << dim <<
"." );
166 return generateCubeFace< 3 >( element, f );
168 return generateCubeFace< 2 >( element, f );
170 return generateCubeFace< 1 >( element, f );
172 DUNE_THROW( NotImplemented,
"ElementUtil::generateFace not implemented for dim = " << dim <<
"." );
179 #endif // DUNE_ENTITYKEY_INLINE_HH