28 #ifndef _GEOELEMENT_HH_
29 #define _GEOELEMENT_HH_
31 #include <boost/optional.hpp>
32 #include <boost/tuple/tuple.hpp>
34 #include <feel/feelcore/feel.hpp>
36 #include <feel/feelmesh/marker.hpp>
47 static const uint16_type nDim = 1;
53 typedef boost::tuple<size_type, size_type, uint16_type> element_connectivity_type;
55 boost::none_t element( uint16_type )
const
57 return boost::none_t();
61 SubFaceOfNone( SubFaceOfNone
const& ) {}
63 virtual ~SubFaceOfNone() {}
65 template<
typename SFO>
66 SubFaceOfNone( SFO
const& )
80 friend class boost::serialization::access;
81 template<
class Archive>
82 void serialize( Archive & ar,
const unsigned int version )
87 template<
typename ElementType>
91 static const uint16_type nDim = ElementType::nDim;
95 typedef ElementType type;
97 typedef ElementType entity_type;
98 typedef boost::tuple<ElementType const*, size_type, uint16_type, size_type> element_connectivity_type;
106 SubFaceOf( element_connectivity_type
const& connect0 )
108 M_element0( connect0 ),
111 SubFaceOf( element_connectivity_type
const& connect0,
112 element_connectivity_type
const& connect1 )
114 M_element0( connect0 ),
115 M_element1( connect1 )
118 SubFaceOf( SubFaceOf
const& sf )
120 M_element0( sf.M_element0 ),
121 M_element1( sf.M_element1 )
124 SubFaceOf( SubFaceOfNone
const& )
130 virtual ~SubFaceOf() {}
132 SubFaceOf&
operator=( SubFaceOf
const& sf )
136 M_element0 = sf.M_element0;
137 M_element1 = sf.M_element1;
143 SubFaceOf&
operator=( SubFaceOfNone
const& )
147 entity_type
const& element( uint16_type e )
const
150 return *boost::get<0>( M_element0 );
153 return *boost::get<0>( M_element1 );
156 entity_type
const& element0()
const
158 return *boost::get<0>( M_element0 );
160 entity_type
const& element1()
const
162 return *boost::get<0>( M_element1 );
167 return boost::get<1>( M_element0 );
169 uint16_type pos_first()
const
171 return boost::get<2>( M_element0 );
175 return boost::get<3>( M_element0 );
180 return boost::get<1>( M_element1 );
182 uint16_type pos_second()
const
184 return boost::get<2>( M_element1 );
188 return boost::get<3>( M_element1 );
191 element_connectivity_type
const& connection0()
const
195 element_connectivity_type
const& connection1()
const
200 void setConnection( uint16_type f, element_connectivity_type
const& connect )
203 M_element0 = connect;
206 M_element1 = connect;
210 void setConnection0( element_connectivity_type
const& connect )
212 M_element0 = connect;
214 void setConnection1( element_connectivity_type
const& connect )
216 M_element1 = connect;
219 bool isConnected()
const {
return isConnectedTo0() && isConnectedTo1(); }
221 bool isConnectedTo0()
const
227 bool isConnectedTo1()
const
238 ( ( ( boost::get<3>( M_element0 ) == p ) && ( boost::get<3>( M_element1 ) < p ) ) ||
239 ( ( boost::get<3>( M_element0 ) < p ) && ( boost::get<3>( M_element1 ) == p ) ) ) );
243 isInterProcessDomain(
size_type p )
const
246 ( ( boost::get<3>( M_element0 ) == p ) || ( boost::get<3>( M_element1 ) == p ) ) &&
247 ( boost::get<3>( M_element0 ) != boost::get<3>( M_element1 ) ) );
250 isIntraProcessDomain(
size_type p )
const
252 return ( ( boost::get<3>( M_element0 ) == p ) &&
253 ( boost::get<3>( M_element1 ) == p ) );
258 M_element0 = boost::make_tuple( ( ElementType
const* )0,
266 M_element1 = boost::make_tuple( ( ElementType
const* )0,
278 void disconnect( ElementType
const& elem )
280 if(boost::get<0>( M_element0 ) == boost::addressof(elem))
282 DVLOG(2) <<
"connecting 1 to 0 and disconnecting 1..\n";
283 M_element0 = M_element1;
288 DVLOG(2) <<
"disconnecting 1..\n";
294 friend class boost::serialization::access;
295 template<
class Archive>
296 void serialize( Archive & ar,
const unsigned int version )
300 ar & M_element0.template get<1>();
301 ar & M_element0.template get<2>();
302 ar & M_element0.template get<3>();
303 M_element0.template get<0>() = 0;
307 ar & M_element1.template get<1>();
308 ar & M_element1.template get<2>();
309 ar & M_element1.template get<3>();
310 M_element1.template get<0>() = 0;
315 element_connectivity_type M_element0;
316 element_connectivity_type M_element1;
320 template<
typename ElementType>
324 static const uint16_type nDim = ElementType::nDim;
325 static const uint16_type nRealDim = ElementType::nRealDim;
326 template<
typename ET>
329 typedef ElementType type;
331 typedef ElementType entity_type;
332 typedef boost::tuple<ElementType const*, size_type, uint16_type, size_type> element_connectivity_type;
339 SubFaceOfMany( SubFaceOfMany
const& sf )
341 M_elements( sf.M_elements )
344 SubFaceOfMany( SubFaceOfNone
const& )
349 virtual ~SubFaceOfMany() {}
351 SubFaceOfMany&
operator=( SubFaceOfMany
const& sf )
355 M_elements = sf.M_elements;
360 SubFaceOfMany&
operator=( SubFaceOfNone
const& )
365 entity_type
const& element0()
const
367 return *boost::get<0>( *M_elements.begin() );
369 entity_type
const& element1()
const
371 return *boost::get<0>( *boost::next(M_elements.begin()) );
374 void setConnection( element_connectivity_type
const& connect )
376 this->insert( connect );
381 return boost::get<1>( *M_elements.begin() );
383 uint16_type pos_first()
const
385 return boost::get<2>( *M_elements.begin() );
389 return boost::get<3>( *M_elements.begin() );
394 return boost::get<1>( *boost::next(M_elements.begin()) );
396 uint16_type pos_second()
const
398 return boost::get<2>( *boost::next(M_elements.begin()) );
402 return boost::get<3>( *boost::next(M_elements.begin()) );
406 void setConnection0( element_connectivity_type
const& connect )
408 M_elements.insert( connect );
410 void setConnection1( element_connectivity_type
const& connect )
412 M_elements.insert( connect );
415 element_connectivity_type
const& connection0()
const
417 return *M_elements.begin();
419 element_connectivity_type
const& connection1()
const
421 return *boost::next(M_elements.begin());
424 bool isConnectedTo0()
const
430 bool isConnectedTo1()
const
437 isInterProcessDomain(
size_type p )
const
442 isIntraProcessDomain(
size_type p )
const
447 entity_type
const& element( uint16_type e )
const
449 return *boost::get<0>( *M_elements.begin() );
457 friend class boost::serialization::access;
458 template<
class Archive>
459 void serialize( Archive & ar,
const unsigned int version )
464 std::set<element_connectivity_type> M_elements;
468 #define SubFaceOfMany SubFaceOf
480 template <uint16_type Dim,
481 typename SubFace = SubFaceOfNone,
491 static const uint16_type nDim = 0;
492 static const uint16_type nRealDim = Dim;
495 typedef typename geo0d_type::node_type node_type;
498 typedef SubFace super2;
501 typedef typename mpl::if_<mpl::equal_to<mpl::int_<SubFace::nDim>, mpl::int_<0> >, mpl::identity<self_type>, mpl::identity<typename SubFace::template Element<self_type>::type> >::type::type element_type;
504 static const uint16_type numLocalVertices = super::numVertices;
517 super( id, boundary ),
524 super( id, n, boundary ),
533 super( id, x, y, z, boundary ),
538 template<
typename SF>
543 M_facept( g.M_facept )
550 template<
typename SF>
551 GeoElement0D & operator = ( GeoElement0D<Dim,SF,T>
const & g )
555 M_facept = g.M_facept;
560 MeshBase
const* mesh()
const
581 bool isGhostFace()
const
640 return super::marker();
647 return super::marker();
654 return super::marker2();
661 return super::marker2();
668 return super::marker3();
675 return super::marker3();
683 friend class boost::serialization::access;
684 template<
class Archive>
685 void serialize( Archive & ar,
const unsigned int version )
687 ar & boost::serialization::base_object<super>( *this );
688 ar & boost::serialization::base_object<super2>( *this );
704 template<uint16_type Dim,
706 typename SubFace = SubFaceOfNone,
710 public GeoND<Dim, GEOSHAPE, T, GeoElement0D<Dim, SubFaceOfNone, T> >,
716 typedef SubFace super2;
718 static const uint16_type nDim = super::nDim;
719 static const uint16_type nOrder = super::nOrder;
720 static const uint16_type nRealDim = super::nRealDim;
722 static const bool condition = ( Dim==nRealDim );
723 BOOST_MPL_ASSERT_MSG( ( condition ), INVALID_ELEMENT_REAL_DIMENSION, ( mpl::int_<Dim>, mpl::int_<nRealDim>, GEOSHAPE ) );
725 typedef GEOSHAPE GeoShape;
729 typedef typename mpl::if_<mpl::equal_to<mpl::int_<nRealDim>,mpl::int_<1> >,
730 mpl::identity<GeoElement0D<Dim, SubFaceOf<self_type>, T> >,
731 mpl::identity<GeoElement0D<Dim, SubFaceOfMany<self_type>, T> > >::type::type point_type;
732 typedef point_type GeoBElement;
734 static const uint16_type numLocalVertices = super::numLocalVertices;
735 static const uint16_type numLocalEdges = super::numEdges;
736 static const uint16_type numLocalFaces = super::numLocalVertices;
739 typedef typename super::node_type node_type;
740 typedef typename super::vertex_permutation_type vertex_permutation_type;
741 typedef typename super::edge_permutation_type edge_permutation_type;
742 typedef typename super::face_permutation_type face_permutation_type;
743 typedef typename super::permutation_type permutation_type;
753 M_vertices( numLocalVertices, 0 ),
754 M_vertex_permutation( numLocalVertices )
764 M_vertices( g.M_vertices ),
765 M_vertex_permutation( g.M_vertex_permutation )
781 super::operator=( g );
783 M_vertices = g.M_vertices;
784 M_vertex_permutation = g.M_vertex_permutation;
806 bool isGhostFace()
const
852 void setMap( uint8_type k_1, uint8_type k_2 )
857 uint8_type map( uint8_type k_1 )
const
862 Marker1
const& marker()
const
864 return super::marker();
868 return super::marker();
870 Marker2
const& marker2()
const
872 return super::marker2();
874 Marker3
const& marker3()
const
876 return super::marker3();
882 void setFace( uint16_type
const i, point_type
const & p )
884 FEELPP_ASSERT( i < numLocalVertices )( i ).error(
"invalid local point index" );
885 M_vertices[i] =
const_cast<point_type*
>( boost::addressof( p ) );
888 edge_permutation_type permutation( uint16_type )
const
890 return edge_permutation_type();
893 point_type
const& edge( uint16_type i )
const
895 return *M_vertices[i];
897 point_type
const& face( uint16_type i )
const
899 return *M_vertices[i];
901 point_type
const* facePtr( uint16_type i )
const
903 FEELPP_ASSERT( i < numLocalVertices )( this->
id() )( i ).error(
"invalid local vertex index" );
904 return M_vertices[i];
906 point_type* facePtr( uint16_type i )
908 FEELPP_ASSERT( i < numLocalVertices )( this->
id() )( i ).error(
"invalid local vertex index" );
909 return M_vertices[i];
912 typedef typename ublas::bounded_array<point_type*, numLocalVertices>::iterator face_iterator;
913 typedef typename ublas::bounded_array<point_type*, numLocalVertices>::const_iterator face_const_iterator;
918 std::pair<face_iterator,face_iterator>
921 return std::make_pair( M_vertices.begin(), M_vertices.end() );
927 std::pair<face_const_iterator,face_const_iterator>
930 return std::make_pair( M_vertices.begin(), M_vertices.end() );
938 FEELPP_ASSERT( i < numLocalVertices )( i )( numLocalVertices ).error(
"invalid local vertex index" );
939 return M_vertex_permutation[i];
944 friend class boost::serialization::access;
945 template<
class Archive>
946 void serialize( Archive & ar,
const unsigned int version )
948 DVLOG(2) <<
"Serializing Geoelement1D id: " << this->
id() <<
"...\n";
949 ar & boost::serialization::base_object<super>( *this );
950 ar & boost::serialization::base_object<super2>( *this );
957 std::vector<uint8_type> M_map;
958 ublas::bounded_array<point_type*, numLocalVertices> M_vertices;
959 ublas::bounded_array<vertex_permutation_type, numLocalVertices> M_vertex_permutation;
962 template<uint16_type Dim,
966 const uint16_type GeoElement1D<Dim,GEOSHAPE,SubFace,T>::numLocalVertices;
968 template<uint16_type Dim,
972 const uint16_type GeoElement1D<Dim,GEOSHAPE,SubFace,T>::nDim;
981 template<uint16_type Dim,
983 typename SubFace = SubFaceOfNone,
987 public GeoND<Dim, GEOSHAPE, T, GeoElement0D<Dim, SubFaceOfNone, T> >,
994 typedef SubFace super2;
996 static const uint16_type nDim = super::nDim;
997 static const uint16_type nOrder = super::nOrder;
998 static const uint16_type nRealDim = super::nRealDim;
1000 static const bool condition = ( Dim==nRealDim );
1001 BOOST_MPL_ASSERT_MSG( ( condition ), INVALID_ELEMENT_REAL_DIMENSION, ( mpl::int_<Dim>, mpl::int_<nRealDim>, GEOSHAPE ) );
1005 static const uint16_type numLocalFaces = super::numFaces;
1007 typedef GEOSHAPE GeoShape;
1008 typedef typename super::face_type entity_face_type;
1012 typedef typename mpl::if_<mpl::equal_to<mpl::int_<nRealDim>,mpl::int_<2> >,
1013 mpl::identity<GeoElement1D<Dim, entity_face_type, SubFaceOf<self_type>, T> >,
1014 mpl::identity<GeoElement1D<Dim, entity_face_type, SubFaceOfMany<self_type>, T> > >::type::type edge_type;
1018 BOOST_MPL_ASSERT_MSG( ( boost::is_same<point_type,typename edge_type::point_type>::value ),
1019 INCOMPATIBLE_POINT_TYPE,
1021 BOOST_STATIC_ASSERT( ( boost::is_same<point_type,typename edge_type::point_type>::value ) );
1023 typedef typename super::node_type node_type;
1025 typedef typename super::vertex_permutation_type vertex_permutation_type;
1026 typedef typename super::edge_permutation_type edge_permutation_type;
1027 typedef typename super::edge_permutation_type permutation_type;
1028 typedef typename super::face_permutation_type face_permutation_type;
1029 typedef typename super2::element_connectivity_type element_connectivity_type;
1040 M_edge_permutation(
numLocalEdges, edge_permutation_type( edge_permutation_type::IDENTITY ) )
1051 M_edges( g.M_edges ),
1052 M_edge_permutation( g.M_edge_permutation )
1068 super::operator=( g );
1070 M_edges = g.M_edges;
1071 M_edge_permutation = g.M_edge_permutation;
1090 Marker1
const& marker()
const
1092 return super::marker();
1096 return super::marker();
1098 Marker2
const& marker2()
const
1100 return super::marker2();
1102 Marker3
const& marker3()
const
1104 return super::marker3();
1107 bool isGhostFace()
const
1158 edge_type
const&
edge( uint16_type i )
const
1161 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1162 return boost::cref( *M_edges[i] );
1171 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1172 return boost::ref( *M_edges[i] );
1175 edge_type & face( uint16_type i )
1178 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1180 return boost::ref( *M_edges[i] );
1186 edge_type
const&
face( uint16_type i )
const
1189 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1191 return boost::cref( *M_edges[i] );
1194 edge_type
const* facePtr( uint16_type i )
const
1197 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1206 void setFace( uint16_type
const i, edge_type
const & p )
1210 M_edges[i] =
const_cast<edge_type*
>( boost::addressof( p ) );
1220 return M_edge_permutation[i];
1229 return M_edge_permutation[i];
1237 DCHECK( i <
numLocalEdges ) <<
"invalid local edge index " << i <<
" should be less than " <<
numLocalEdges <<
" in element id " << this->
id();
1238 return M_edge_permutation[i];
1245 void setEdge( uint16_type i, edge_type
const & p )
1248 M_edges[i] =
const_cast<edge_type*
>( boost::addressof( p ) );
1251 void setEdgePermutation( uint16_type i, edge_permutation_type o )
1255 M_edge_permutation[i] = o;
1258 typedef typename std::vector<edge_type*>::iterator face_iterator;
1259 typedef typename std::vector<edge_type*>::const_iterator face_const_iterator;
1264 std::pair<face_iterator,face_iterator>
1267 return std::make_pair( M_edges.begin(), M_edges.end() );
1273 std::pair<face_const_iterator,face_const_iterator>
1276 return std::make_pair( M_edges.begin(), M_edges.end() );
1279 void disconnectSubEntities()
1283 M_edges[i]->disconnect(*
this);
1289 friend class boost::serialization::access;
1290 template<
class Archive>
1291 void serialize( Archive & ar,
const unsigned int version )
1293 DVLOG(2) <<
"Serializing Geoelement2D id: " << this->
id() <<
"...\n";
1294 ar & boost::serialization::base_object<super>( *this );
1295 ar & boost::serialization::base_object<super2>( *this );
1302 std::vector<edge_type*> M_edges;
1303 std::vector<edge_permutation_type> M_edge_permutation;
1309 template <u
int16_type Dim,
typename GEOSHAPE,
typename SFO,
typename T>
1310 const uint16_type GeoElement2D<Dim, GEOSHAPE, SFO, T>::numLocalEdges;
1311 template <u
int16_type Dim,
typename GEOSHAPE,
typename SFO,
typename T>
1312 const uint16_type GeoElement2D<Dim, GEOSHAPE, SFO, T>::nDim;
1320 template<uint16_type Dim,
1322 typename T =
double>
1325 public GeoND<Dim, GEOSHAPE, T, GeoElement0D<Dim, SubFaceOfNone, T> >,
1326 public SubFaceOfNone
1330 static const uint16_type nDim = Dim;
1333 typedef SubFaceOfNone super2;
1335 typedef GEOSHAPE GeoShape;
1337 typedef typename super::face_type entity_face_type;
1345 typedef typename super::node_type node_type;
1347 typedef typename super::vertex_permutation_type vertex_permutation_type;
1348 typedef typename super::edge_permutation_type edge_permutation_type;
1349 typedef typename super::face_permutation_type face_permutation_type;
1350 typedef typename super::face_permutation_type permutation_type;
1370 M_edge_permutation(
numLocalEdges, edge_permutation_type( edge_permutation_type::IDENTITY ) ),
1373 std::fill( M_faces.begin(), M_faces.end(), (
face_type* )0 );
1375 std::fill( M_face_permutation.begin(), M_face_permutation.end(), face_permutation_type( face_permutation_type::IDENTITY ) );
1385 M_edges( g.M_edges ),
1386 M_faces( g.M_faces ),
1387 M_edge_permutation( g.M_edge_permutation ),
1388 M_face_permutation( g.M_face_permutation )
1404 super::operator=( g );
1405 M_edges = g.M_edges;
1406 M_faces = g.M_faces;
1407 M_edge_permutation = g.M_edge_permutation;
1408 M_face_permutation = g.M_face_permutation;
1427 Marker1
const& marker()
const
1429 return super::marker();
1433 return super::marker();
1435 Marker2
const& marker2()
const
1437 return super::marker2();
1439 Marker3
const& marker3()
const
1441 return super::marker3();
1444 bool isGhostFace()
const
1494 uint16_type pos_first()
const
1502 uint16_type pos_second()
const
1507 edge_type
const& edge( uint16_type i )
const
1510 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1515 edge_type& edge( uint16_type i )
1518 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1523 edge_type
const* edgePtr( uint16_type i )
const
1526 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1531 edge_permutation_type edgePermutation( uint16_type i )
const
1534 DCHECK( M_edges[i] !=
nullptr ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1537 return M_edge_permutation[i];
1546 DCHECK( boost::addressof( p ) ) <<
"invalid edge (null pointer) for edge local id " << i <<
" in element " << this->
id();
1547 M_edges[i] =
const_cast<edge_type*
>( boost::addressof( p ) );
1550 void setEdgePermutation( uint16_type i, edge_permutation_type o )
1554 M_edge_permutation[i] = o;
1557 face_type
const& face( uint16_type i )
const
1559 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local edge index" );
1560 FEELPP_ASSERT( M_faces[i] )( this->
id() )( i ).error(
"invalid edge (null pointer)" );
1564 face_type& face( uint16_type i )
1566 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local edge index" );
1567 FEELPP_ASSERT( M_faces[i] )( this->
id() )( i ).error(
"invalid edge (null pointer)" );
1571 face_type
const* facePtr( uint16_type i )
const
1573 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local edge index" );
1578 face_permutation_type facePermutation( uint16_type i )
const
1580 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local face index" );
1581 FEELPP_ASSERT( M_faces[i] )( this->
id() )( i ).error(
"invalid face (null pointer)" );
1582 return M_face_permutation[i];
1584 face_permutation_type permutation( uint16_type i )
const
1586 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local face index" );
1587 FEELPP_ASSERT( M_faces[i] )( this->
id() )( i ).error(
"invalid face (null pointer)" );
1588 return M_face_permutation[i];
1596 M_faces[i] =
const_cast<face_type*
>( boost::addressof( p ) );
1599 void setFacePermutation( uint16_type i, face_permutation_type o )
1601 FEELPP_ASSERT( i <
numLocalFaces )( this->
id() )( i ).error(
"invalid local face index" );
1602 M_face_permutation[i] = o;
1605 typedef typename ublas::bounded_array<face_type*, numLocalFaces>::iterator face_iterator;
1606 typedef typename ublas::bounded_array<face_type*, numLocalFaces>::const_iterator face_const_iterator;
1611 std::pair<face_iterator,face_iterator>
1614 return std::make_pair( M_faces.begin(), M_faces.end() );
1620 std::pair<face_const_iterator,face_const_iterator>
1623 return std::make_pair( M_faces.begin(), M_faces.end() );
1627 friend class boost::serialization::access;
1628 template<
class Archive>
1629 void serialize( Archive & ar,
const unsigned int version )
1631 ar & boost::serialization::base_object<super>( *this );
1637 ublas::bounded_array<edge_type*, numLocalEdges> M_edges;
1638 ublas::bounded_array<face_type*, numLocalFaces> M_faces;
1640 ublas::bounded_array<edge_permutation_type, numLocalEdges> M_edge_permutation;
1641 ublas::bounded_array<face_permutation_type, numLocalFaces> M_face_permutation;
1651 template <u
int16_type Dim,
typename GEOSHAPE,
typename T>
1652 const uint16_type GeoElement3D<Dim, GEOSHAPE, T>::numLocalVertices;
1653 template <u
int16_type Dim,
typename GEOSHAPE,
typename T>
1654 const uint16_type GeoElement3D<Dim, GEOSHAPE, T>::numLocalFaces;
1655 template <u
int16_type Dim,
typename GEOSHAPE,
typename T>
1656 const uint16_type GeoElement3D<Dim, GEOSHAPE, T>::numLocalEdges;
1657 template <u
int16_type Dim,
typename GEOSHAPE,
typename T>
1658 const uint16_type GeoElement3D<Dim, GEOSHAPE, T>::nDim;