33 #include <boost/multi_index_container.hpp>
34 #include <boost/multi_index/member.hpp>
35 #include <boost/multi_index/mem_fun.hpp>
36 #include <boost/multi_index/ordered_index.hpp>
38 #include <feel/feelmesh/geoelement.hpp>
42 namespace multi_index = boost::multi_index;
52 template<
typename EdgeType,
typename FaceType>
62 typedef typename mpl::if_<mpl::equal_to<mpl::int_<EdgeType::nRealDim>, mpl::int_<3> >,
63 mpl::identity<GeoElement1D<3, EdgeType,SubFaceOfMany<FaceType> > >,
64 mpl::identity<boost::none_t> >::type::type edge_type;
67 typedef multi_index::multi_index_container<
69 multi_index::indexed_by<
71 multi_index::ordered_unique<multi_index::identity<edge_type> >,
73 multi_index::ordered_non_unique<multi_index::tag<detail::by_marker>,
74 multi_index::const_mem_fun<edge_type,
76 &edge_type::marker> >,
79 multi_index::ordered_non_unique<multi_index::tag<detail::by_pid>,
80 multi_index::const_mem_fun<edge_type,
82 &edge_type::processId> >,
85 multi_index::ordered_non_unique<multi_index::tag<detail::by_location>,
86 multi_index::const_mem_fun<edge_type,
88 &edge_type::isOnBoundary> >
93 typedef typename edges_type::iterator edge_iterator;
94 typedef typename edges_type::const_iterator edge_const_iterator;
95 typedef typename edges_type::template index<detail::by_marker>::type marker_edges;
97 typedef typename marker_edges::iterator marker_edge_iterator;
98 typedef typename marker_edges::const_iterator marker_edge_const_iterator;
100 typedef typename edges_type::template index<detail::by_pid>::type pid_edges;
101 typedef typename pid_edges::iterator pid_edge_iterator;
102 typedef typename pid_edges::const_iterator pid_edge_const_iterator;
104 typedef typename edges_type::template index<detail::by_location>::type location_edges;
105 typedef typename location_edges::iterator location_edge_iterator;
106 typedef typename location_edges::const_iterator location_edge_const_iterator;
114 Edges( WorldComm
const& worldComm = Environment::worldComm() )
116 M_worldCommEdges( worldComm ),
120 Edges( Edges
const & f )
122 M_worldCommEdges( f.M_worldCommEdges ),
153 edges_type
const&
edges()
const
161 WorldComm
const& worldCommFaces()
const
163 return M_worldCommEdges;
171 return M_edges.empty();
174 bool isBoundaryEdge( edge_type
const & e )
const
176 return M_edges.find( e )->isOnBoundary();
178 bool isBoundaryEdge(
size_type const &
id )
const
180 return M_edges.find( edge_type(
id ) )->isOnBoundary();
183 edge_type
const& edge(
size_type i )
const
185 return *M_edges.find( edge_type( i ) );
188 edge_iterator edgeIterator(
size_type i )
const
190 return M_edges.find( edge_type( i ) );
193 edge_iterator beginEdge()
195 return M_edges.begin();
197 edge_const_iterator beginEdge()
const
199 return M_edges.begin();
201 edge_iterator endEdge()
203 return M_edges.end();
205 edge_const_iterator endEdge()
const
207 return M_edges.end();
214 std::pair<marker_edge_iterator, marker_edge_iterator>
218 return M_edges.template get<detail::by_marker>().equal_range( Marker1( m ) );
222 marker_edge_iterator beginEdgeWithMarker(
size_type m )
224 return M_edges.template get<detail::by_marker>().lower_bound( Marker1( m ) );
226 marker_edge_const_iterator beginEdgeWithMarker(
size_type m )
const
228 return M_edges.template get<detail::by_marker>().lower_bound( Marker1( m ) );
230 marker_edge_iterator endEdgeWithMarker(
size_type m )
232 return M_edges.template get<detail::by_marker>().upper_bound( Marker1( m ) );
234 marker_edge_const_iterator endEdgeWithMarker(
size_type m )
const
236 return M_edges.template get<detail::by_marker>().upper_bound( Marker1( m ) );
245 typename edges_type::template nth_index<0>::type &
248 return M_edges.template get<0>();
257 typename edges_type::template nth_index<0>::type
const&
260 return M_edges.template get<0>();
272 return M_edges.template get<detail::by_marker>();
282 edgesByMarker()
const
284 return M_edges.template get<detail::by_marker>();
295 return M_edges.template get<detail::by_location>();
304 location_edges
const&
305 edgesByLocation()
const
307 return M_edges.template get<detail::by_location>();
315 location_edge_iterator beginInternalEdge()
317 return M_edges.template get<detail::by_location>().lower_bound( INTERNAL );
324 location_edge_iterator endInternalEdge()
326 return M_edges.template get<detail::by_location>().upper_bound( INTERNAL );
334 location_edge_const_iterator beginInternalEdge()
const
336 return M_edges.template get<detail::by_location>().lower_bound( INTERNAL );
344 location_edge_const_iterator endInternalEdge()
const
346 return M_edges.template get<detail::by_location>().upper_bound( INTERNAL );
354 location_edge_iterator beginEdgeOnBoundary()
356 return M_edges.template get<detail::by_location>().lower_bound( ON_BOUNDARY );
363 location_edge_iterator endEdgeOnBoundary()
365 return M_edges.template get<detail::by_location>().upper_bound( ON_BOUNDARY );
373 location_edge_const_iterator beginEdgeOnBoundary()
const
375 return M_edges.template get<detail::by_location>().lower_bound( ON_BOUNDARY );
383 location_edge_const_iterator endEdgeOnBoundary()
const
385 return M_edges.template get<detail::by_location>().upper_bound( ON_BOUNDARY );
392 std::pair<pid_edge_iterator, pid_edge_iterator>
395 return M_edges.template get<detail::by_pid>().equal_range( p );
416 edge_type
const& addEdge( edge_type& f )
418 f.setId( M_edges.size() );
419 return *M_edges.insert( f ).first;
422 void setWorldCommEdges( WorldComm
const& _worldComm )
424 M_worldCommEdges = _worldComm;
431 friend class boost::serialization::access;
432 template<
class Archive>
433 void serialize( Archive & ar,
const unsigned int version )
439 WorldComm M_worldCommEdges;
boost::tuple< mpl::size_t< MESH_EDGES >, typename MeshTraits< MeshType >::pid_edge_const_iterator, typename MeshTraits< MeshType >::pid_edge_const_iterator > edges(MeshType const &mesh)
Definition: filters.hpp:1213
virtual bool isEmpty() const
Definition: elements.hpp:371
size_t size_type
Indices (starting from 0)
Definition: feelcore/feel.hpp:319