Logo  0.95.0-final
Finite Element Embedded Library and Language in C++
Feel++ Feel++ on Github Feel++ community
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
elements.hpp
Go to the documentation of this file.
1 /* -*- mode: c++; coding: utf-8; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; show-trailing-whitespace: t -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
2 
3  This file is part of the Feel library
4 
5  Author(s): Christophe Prud'homme <christophe.prudhomme@feelpp.org>
6  Date: 2005-09-03
7 
8  Copyright (C) 2005,2006 EPFL
9  Copyright (C) 2007,2008,2009,2010 Université Joseph Fourier (Grenoble I)
10 
11  This library is free software; you can redistribute it and/or
12  modify it under the terms of the GNU Lesser General Public
13  License as published by the Free Software Foundation; either
14  version 3.0 of the License, or (at your option) any later version.
15 
16  This library is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  Lesser General Public License for more details.
20 
21  You should have received a copy of the GNU Lesser General Public
22  License along with this library; if not, write to the Free Software
23  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 */
30 #ifndef FEELPP_ELEMENTS_HPP
31 #define FEELPP_ELEMENTS_HPP 1
32 
33 
34 #include <boost/multi_index_container.hpp>
35 #include <boost/multi_index/member.hpp>
36 #include <boost/multi_index/composite_key.hpp>
37 #include <boost/multi_index/mem_fun.hpp>
38 #include <boost/multi_index/ordered_index.hpp>
39 #include <boost/multi_index/hashed_index.hpp>
40 #include <boost/multi_index/random_access_index.hpp>
41 
42 #include <feel/feelmesh/geoelement.hpp>
44 
45 namespace Feel
46 {
47 namespace multi_index = boost::multi_index;
49 
50 namespace detail
51 {
52  template <typename EltType >
53  void
54  updateElementGhostConnectEdgeToElement( EltType& e, int i, mpl::int_<1> )
55  {}
56  template <typename EltType >
57  void
58  updateElementGhostConnectEdgeToElement( EltType& e, int i, mpl::int_<2> )
59  {}
60  template <typename EltType >
61  void
62  updateElementGhostConnectEdgeToElement( EltType& e, int i, mpl::int_<3> )
63  {
64  e.edge( i ).addElementGhost( e.processId(),e.id() );
65  }
66 }
67 
68 
76 template<typename ElementType>
77 class Elements
78 {
79 public:
80 
81 
85 
91  typedef typename mpl::if_<mpl::equal_to<mpl::int_<ElementType::nDim>, mpl::int_<3> >,
92  mpl::identity<GeoElement3D<ElementType::nRealDim, ElementType> >,
93  typename mpl::if_<mpl::equal_to<mpl::int_<ElementType::nDim>, mpl::int_<2> >,
94  mpl::identity<GeoElement2D<ElementType::nRealDim, ElementType> >,
95  typename mpl::if_<mpl::equal_to<mpl::int_<ElementType::nDim>, mpl::int_<1> >,
96  mpl::identity<GeoElement1D<ElementType::nRealDim, ElementType> >,
97  mpl::identity<GeoElement0D<ElementType::nRealDim, ElementType> > >::type>::type>::type::type element_type;
98 
102  typedef multi_index::multi_index_container<
103  element_type,
104  multi_index::indexed_by<
105  //multi_index::random_access<>,
106  // sort by less<int> on id() + pid()
107  multi_index::ordered_unique<
108  multi_index::composite_key<element_type,
109  multi_index::const_mem_fun<element_type,
110  uint16_type,
111  &element_type::processId>,
112  multi_index::const_mem_fun<element_type,
113  size_type,
114  &element_type::id> > >,
115  // sort by less<int> on marker
116  multi_index::ordered_non_unique<multi_index::tag<detail::by_marker>,
117  multi_index::composite_key<element_type,
118  multi_index::const_mem_fun<element_type,
119  Marker1 const&,
120  &element_type::marker>,
121  multi_index::const_mem_fun<element_type,
122  uint16_type,
123  &element_type::processId> > >,
124  // sort by less<int> on marker
125  multi_index::ordered_non_unique<multi_index::tag<detail::by_marker2>,
126  multi_index::composite_key<element_type,
127  multi_index::const_mem_fun<element_type,
128  Marker2 const&,
129  &element_type::marker2>,
130  multi_index::const_mem_fun<element_type,
131  uint16_type,
132  &element_type::processId> > >,
133 
134  // sort by less<int> on marker
135  multi_index::ordered_non_unique<multi_index::tag<detail::by_marker3>,
136  multi_index::composite_key<element_type,
137  multi_index::const_mem_fun<element_type,
138  Marker3 const&,
139  &element_type::marker3>,
140  multi_index::const_mem_fun<element_type,
141  uint16_type,
142  &element_type::processId> > >,
143 
144  // sort by less<int> on boundary
145  multi_index::ordered_non_unique<multi_index::tag<detail::by_location>,
146  multi_index::composite_key<element_type,
147  multi_index::const_mem_fun<element_type,
148  uint16_type,
149  &element_type::processId>,
150  multi_index::const_mem_fun<element_type,
151  bool,
152  &element_type::isOnBoundary>,
153  multi_index::const_mem_fun<element_type,
154  uint16_type,
155  &element_type::boundaryEntityDimension> > >,
156 
157 
158  // sort by less<int> on processId
159  multi_index::ordered_non_unique<multi_index::tag<detail::by_pid>,
160  multi_index::const_mem_fun<element_type,
161  uint16_type,
162  &element_type::processId> >,
163 
164  // sort by less<int> on processId
165  multi_index::ordered_non_unique<multi_index::tag<detail::by_ghostcell>,
166  multi_index::const_mem_fun<element_type,
167  bool,
168  &element_type::isGhostCell> >
169 
170 
171  > > elements_type;
172 
173 
174  typedef typename elements_type::iterator element_iterator;
175  typedef typename elements_type::const_iterator element_const_iterator;
176 
177  // marker
178  typedef typename elements_type::template index<detail::by_marker>::type marker_elements;
179  typedef typename marker_elements::iterator marker_element_iterator;
180  typedef typename marker_elements::const_iterator marker_element_const_iterator;
181 
182  // marker2
183  typedef typename elements_type::template index<detail::by_marker2>::type marker2_elements;
184  typedef typename marker2_elements::iterator marker2_element_iterator;
185  typedef typename marker2_elements::const_iterator marker2_element_const_iterator;
186 
187  // marker3
188  typedef typename elements_type::template index<detail::by_marker3>::type marker3_elements;
189  typedef typename marker3_elements::iterator marker3_element_iterator;
190  typedef typename marker3_elements::const_iterator marker3_element_const_iterator;
191 
192  typedef typename elements_type::template index<detail::by_pid>::type pid_elements;
193  typedef typename pid_elements::iterator pid_element_iterator;
194  typedef typename pid_elements::const_iterator pid_element_const_iterator;
195 
196 
197  typedef typename elements_type::template index<detail::by_location>::type location_elements;
198  typedef typename location_elements::iterator location_element_iterator;
199  typedef typename location_elements::const_iterator location_element_const_iterator;
200 
201  typedef typename elements_type::template index<detail::by_ghostcell>::type ghostcell_elements;
202  typedef typename ghostcell_elements::iterator ghostcell_element_iterator;
203  typedef typename ghostcell_elements::const_iterator ghostcell_element_const_iterator;
204 
205  typedef std::map<int, size_type> parts_map_type;
206  typedef typename parts_map_type::const_iterator parts_const_iterator_type;
207 
209  struct update_element_neighbor_type
210  {
211  update_element_neighbor_type( uint16_type n, size_type id )
212  :
213  M_pos_neigh( n ),
214  M_neigh_id( id )
215  {}
216 
217  void operator()( element_type& e )
218  {
219  e.setNeighbor( M_pos_neigh, M_neigh_id );
220  }
221 
222  private:
223  uint16_type M_pos_neigh;
224  size_type M_neigh_id;
225  };
226 
235  struct ElementUpdatePoint
236  {
241  ElementUpdatePoint( uint16_type index, typename element_type::PointType const& pt )
242  :
243  M_index( index ),
244  M_pt( pt )
245  {}
246 
251  void operator()( element_type& e )
252  {
253  e.setPoint( M_index, M_pt );
254  }
255  private:
256  uint16_type M_index;
257  typename element_type::PointType const& M_pt;
258 
259  };
265  struct ElementConnectPointToElement
266  {
267  void operator()( element_type& e )
268  {
269  for ( int i = 0; i < e.numPoints; ++i )
270  e.point( i ).addElement( e.id() );
271  }
272  };
273 
279  struct ElementGhostConnectPointToElement
280  {
281  void operator()( element_type& e )
282  {
283  for ( int i = 0; i < e.numPoints; ++i )
284  e.point( i ).addElementGhost( e.processId(),e.id() );
285  }
286  };
287 
293  struct ElementGhostConnectEdgeToElement
294  {
295  void operator()( element_type& e )
296  {
297  for ( int i = 0; i < e.numEdges; ++i )
298  detail::updateElementGhostConnectEdgeToElement(e,i,mpl::int_<element_type::nDim>());
299  }
300  };
301 
302 
304 
306 
310 
311  Elements( WorldComm const& worldComm = Environment::worldComm() )
312  :
313  M_worldCommElements(worldComm),
314  M_elements()
315  {}
316 
317  Elements( Elements const & f )
318  :
319  M_worldCommElements( f.worldCommElements() ),
320  M_elements( f.M_elements )
321  {}
322 
323  virtual ~Elements()
324  {}
325 
327 
331 
335  Elements& operator=( Elements const& e )
336  {
337  if ( this != &e )
338  {
339  M_worldCommElements = e.M_worldCommElements;
340  M_elements = e.M_elements;
341  }
342 
343  return *this;
344  }
345 
347 
351 
355  elements_type const& elements() const
356  {
357  return M_elements;
358  }
359 
363  elements_type & elements()
364  {
365  return M_elements;
366  }
367 
371  virtual bool isEmpty() const
372  {
373  return M_elements.empty();
374  }
375 
376  WorldComm const& worldCommElements() const
377  {
378  return M_worldCommElements;
379  }
380 
381 
382  bool isBoundaryElement( element_type const & e ) const
383  {
384  return M_elements.find( e )->isOnBoundary();
385  }
386  bool isBoundaryElement( size_type const & id ) const
387  {
388  return M_elements.find( element_type( id ) )->isOnBoundary();
389  }
390 
391  element_iterator elementIterator( size_type i ) const
392  {
393  return M_elements.template get<0>().find( boost::make_tuple( this->worldCommElements().localRank(), i ) );
394  };
395 
396  element_iterator elementIterator( size_type i, size_type p ) const
397  {
398  return M_elements.template get<0>().find( boost::make_tuple( p, i ) );
399  };
400 
401  element_type const& element( size_type i ) const
402  {
403  return *M_elements.template get<0>().find( boost::make_tuple( this->worldCommElements().localRank(), i ) );
404  };
405 
406  element_type const& element( size_type i, size_type p ) const
407  {
408  return *M_elements.template get<0>().find( boost::make_tuple( p, i ) );
409  };
410 
414  bool hasElement( size_type i ) const
415  {
416  return M_elements.template get<0>().find( boost::make_tuple( this->worldCommElements().localRank(), i ) ) !=
417  M_elements.template get<0>().end();
418  }
419 
420  element_iterator beginElement()
421  {
422  return M_elements.begin();
423  }
424  element_const_iterator beginElement() const
425  {
426  return M_elements.begin();
427  }
428  element_iterator endElement()
429  {
430  return M_elements.end();
431  }
432  element_const_iterator endElement() const
433  {
434  return M_elements.end();
435  }
436 
437 
438  parts_const_iterator_type beginParts() const
439  {
440  return M_parts.begin();
441  }
442  parts_const_iterator_type endParts() const
443  {
444  return M_parts.end();
445  }
446 
451  std::pair<element_iterator, element_iterator>
453  {
454  return std::make_pair( M_elements.begin(), M_elements.end() );
455  }
456 
461  std::pair<element_const_iterator, element_const_iterator>
462  elementsRange() const
463  {
464  return std::make_pair( M_elements.begin(), M_elements.end() );
465  }
466 
467  element_iterator beginElementWithId( size_type m )
468  {
469  return M_elements.template get<0>().lower_bound( boost::make_tuple( this->worldCommElements().localRank(), m ) );
470  }
471  element_const_iterator beginElementWithId( size_type m ) const
472  {
473  return M_elements.template get<0>().lower_bound( boost::make_tuple( this->worldCommElements().localRank(), m ) );
474  }
475  element_iterator endElementWithId( size_type m )
476  {
477  return M_elements.template get<0>().upper_bound( boost::make_tuple( this->worldCommElements().localRank(), m ) );
478  }
479  element_const_iterator endElementWithId( size_type m ) const
480  {
481  return M_elements.template get<0>().upper_bound( boost::make_tuple( this->worldCommElements().localRank(), m ) );
482  }
483 
487  marker_element_const_iterator beginElementWithMarker( size_type m ) const
488  {
489  return M_elements.template get<detail::by_marker>().equal_range( boost::make_tuple( Marker1( m ), this->worldCommElements().localRank() ) ).first;
490  }
491 
495  marker2_element_const_iterator beginElementWithMarker2( size_type m ) const
496  {
497  return M_elements.template get<detail::by_marker2>().equal_range( boost::make_tuple( Marker2( m ), this->worldCommElements().localRank() ) ).first;
498  }
499 
503  marker3_element_const_iterator beginElementWithMarker3( size_type m ) const
504  {
505  return M_elements.template get<detail::by_marker3>().equal_range( boost::make_tuple( Marker3( m ), this->worldCommElements().localRank() ) ).first;
506  }
507 
511  marker_element_const_iterator endElementWithMarker( size_type m ) const
512  {
513  return M_elements.template get<detail::by_marker>().equal_range( boost::make_tuple( Marker1( m ), this->worldCommElements().localRank() ) ).second;
514  }
515 
519  marker2_element_const_iterator endElementWithMarker2( size_type m ) const
520  {
521  return M_elements.template get<detail::by_marker2>().equal_range( boost::make_tuple( Marker2( m ), this->worldCommElements().localRank() ) ).second;
522  }
523 
527  marker3_element_const_iterator endElementWithMarker3( size_type m ) const
528  {
529  return M_elements.template get<detail::by_marker3>().equal_range( boost::make_tuple( Marker3( m ), this->worldCommElements().localRank() ) ).second;
530  }
531 
536  std::pair<marker_element_const_iterator, marker_element_const_iterator>
538  {
539  return M_elements.template get<detail::by_marker>().equal_range( boost::make_tuple( Marker1( m ), this->worldCommElements().localRank() ) );
540  }
541 
542 
547  std::pair<marker2_element_const_iterator, marker2_element_const_iterator>
549  {
550  return M_elements.template get<detail::by_marker2>().equal_range( boost::make_tuple( Marker2( m ), this->worldCommElements().localRank() ) );
551  }
552 
557  std::pair<marker3_element_const_iterator, marker3_element_const_iterator>
559  {
560  return M_elements.template get<detail::by_marker3>().equal_range( boost::make_tuple( Marker3( m ), this->worldCommElements().localRank() ) );
561  }
562 
563  element_iterator beginElementWithProcessId( size_type m )
564  {
565  return M_elements.template get<0>().lower_bound( boost::make_tuple( m ) );
566  }
567  element_const_iterator beginElementWithProcessId( size_type m ) const
568  {
569  return M_elements.template get<0>().lower_bound( boost::make_tuple( m ) );
570  }
571  element_iterator endElementWithProcessId( size_type m )
572  {
573  return M_elements.template get<0>().upper_bound( boost::make_tuple( m ) );
574  }
575  element_const_iterator endElementWithProcessId( size_type m ) const
576  {
577  return M_elements.template get<0>().upper_bound( boost::make_tuple( m ) );
578  }
579 
580  std::pair<element_const_iterator, element_const_iterator>
581  elementsWithProcessId( size_type m ) const
582  {
583  return M_elements.template get<0>().equal_range( boost::make_tuple( m ) );
584  }
585 
586  std::pair<element_iterator, element_iterator>
587  elementsWithProcessId( size_type m )
588  {
589  return M_elements.template get<0>().equal_range( boost::make_tuple( m ) );
590  }
591 
598  typename elements_type::template nth_index<0>::type &
600  {
601  return M_elements.template get<0>();
602  }
603 
610  typename elements_type::template nth_index<0>::type const&
611  elementsById() const
612  {
613  return M_elements.template get<0>();
614  }
615 
622  marker_elements &
624  {
625  return M_elements.template get<detail::by_marker>();
626  }
627 
634  marker2_elements &
636  {
637  return M_elements.template get<detail::by_marker2>();
638  }
639 
646  marker3_elements &
648  {
649  return M_elements.template get<detail::by_marker3>();
650  }
651 
658  marker_elements const&
659  elementsByMarker() const
660  {
661  return M_elements.template get<detail::by_marker>();
662  }
663 
670  marker2_elements const&
671  elementsByMarker2() const
672  {
673  return M_elements.template get<detail::by_marker2>();
674  }
675 
682  marker3_elements const&
683  elementsByMarker3() const
684  {
685  return M_elements.template get<detail::by_marker3>();
686  }
687 
694  pid_elements &
696  {
697  return M_elements.template get<detail::by_pid>();
698  }
699 
706  pid_elements const&
707  elementsByProcessId() const
708  {
709  return M_elements.template get<detail::by_pid>();
710  }
711 
716  std::pair<location_element_const_iterator, location_element_const_iterator>
717  boundaryElements( uint16_type entity_min_dim, uint16_type entity_max_dim, size_type p ) const
718  {
719  auto lower = M_elements.template get<detail::by_location>().lower_bound( boost::make_tuple( this->worldCommElements().localRank(), bool(ON_BOUNDARY), entity_min_dim ) );
720  auto upper = M_elements.template get<detail::by_location>().upper_bound( boost::make_tuple( this->worldCommElements().localRank(), bool(ON_BOUNDARY), entity_max_dim ) );
721  return std::make_pair( lower, upper );
722 
723  }
724 
729  std::pair<location_element_const_iterator, location_element_const_iterator>
731  {
732  return boundaryElements( 0, 2, p );
733  //auto lower = boost::make_tuple( this->worldCommElements().localRank(), bool(ON_BOUNDARY), 0);
734  //auto upper = boost::make_tuple( this->worldCommElements().localRank(), bool(ON_BOUNDARY), 2);
735  //return M_elements.template get<detail::by_location>().range( lower, upper );
736 
737  }
738 
739 
744  std::pair<location_element_const_iterator, location_element_const_iterator>
746  {
747  return M_elements.template get<detail::by_location>().equal_range( boost::make_tuple( this->worldCommElements().localRank(), bool(INTERNAL), invalid_uint16_type_value ) );
748  }
749 
750 
757  location_elements &
759  {
760  return M_elements.template get<detail::by_location>();
761  }
762 
769  location_elements const&
770  elementsByLocation() const
771  {
772  return M_elements.template get<detail::by_location>();
773  }
774 
780  location_element_iterator beginInternalElement()
781  {
782  return M_elements.template get<detail::by_location>().equal_range( boost::make_tuple( this->worldCommElements().localRank(). INTERNAL, invalid_uint16_type_value ) ).first;
783  }
789  location_element_iterator endInternalElement()
790  {
791  return M_elements.template get<detail::by_location>().equal_range( boost::make_tuple( this->worldCommElements().localRank(), INTERNAL, invalid_uint16_type_value ) ).second;
792  }
793 
799  location_element_const_iterator beginInternalElement() const
800  {
801  return M_elements.template get<detail::by_location>().equal_range( boost::make_tuple( this->worldCommElements().localRank(), INTERNAL, invalid_uint16_type_value ) ).first;
802  }
803 
809  location_element_const_iterator endInternalElement() const
810  {
811  return M_elements.template get<detail::by_location>().equal_range( boost::make_tuple( this->worldCommElements().localRank(), INTERNAL, invalid_uint16_type_value ) ).second;
812  }
813 
819  location_element_iterator beginElementOnBoundary()
820  {
821  return M_elements.template get<detail::by_location>().lower_bound( boost::make_tuple( this->worldCommElements().localRank(), ON_BOUNDARY, 0 ) );
822  }
828  location_element_iterator endElementOnBoundary()
829  {
830  return M_elements.template get<detail::by_location>().upper_bound( boost::make_tuple( this->worldCommElements().localRank(), ON_BOUNDARY, 2 ) );
831  }
832 
838  location_element_const_iterator beginElementOnBoundary() const
839  {
840  return M_elements.template get<detail::by_location>().lower_bound( boost::make_tuple( this->worldCommElements().localRank(), ON_BOUNDARY, 0 ) );
841  }
842 
848  location_element_const_iterator endElementOnBoundary() const
849  {
850  return M_elements.template get<detail::by_location>().upper_bound( boost::make_tuple( this->worldCommElements().localRank(), ON_BOUNDARY, 2 ) );
851  }
852 
858  ghostcell_element_iterator beginGhostElement()
859  {
860  //return M_elements.template get<detail::by_ghostcell>().equal_range(boost::make_tuple(true)).first;
861  return M_elements.template get<detail::by_ghostcell>().equal_range( true ).first;
862  //return M_elements.template get<detail::by_ghostcell>().begin();
863  }
864 
870  ghostcell_element_iterator endGhostElement()
871  {
872  //return M_elements.template get<detail::by_ghostcell>().equal_range(boost::make_tuple(true)).second;
873  return M_elements.template get<detail::by_ghostcell>().equal_range( true ).second;
874  //return M_elements.template get<detail::by_ghostcell>().end();
875  }
876 
882  ghostcell_element_const_iterator beginGhostElement() const
883  {
884  //return M_elements.template get<detail::by_ghostcell>().equal_range(boost::make_tuple(true)).first;
885  return M_elements.template get<detail::by_ghostcell>().equal_range( true ).first;
886  //return M_elements.template get<detail::by_ghostcell>().begin();
887  }
888 
894  ghostcell_element_const_iterator endGhostElement() const
895  {
896  //return M_elements.template get<detail::by_ghostcell>().equal_range(boost::make_tuple(true)).second;
897  return M_elements.template get<detail::by_ghostcell>().equal_range( true ).second;
898  //return M_elements.template get<detail::by_ghostcell>().end();
899  }
900 
901 
902 
904 
908 
909 
911 
915 
921  element_type const& addElement( element_type& f )
922  {
923  M_parts[f.marker().value()]++;
924  f.setId( M_elements.size() );
925  return *M_elements.insert( f ).first;
926  //M_elements.push_back( f );
927  //return M_elements.back();
928 
929  }
930 
931  template<typename ElementVecType>
932  void updateMarker2( ElementVecType const& evec )
933  {
934  element_iterator it;
935  element_iterator en;
936  boost::tie( it, en ) = elementsWithProcessId( this->worldCommElements().localRank() );
937 
938  for ( ; it != en; ++it )
939  M_elements.modify( it, [&evec]( element_type& e )
940  {
941  e.setMarker2( evec.localToGlobal( e.id(), 0, 0 ) );
942  } );
943  }
944 
945  template<typename ElementVecType>
946  void updateMarker3( ElementVecType const& evec )
947  {
948  element_iterator it;
949  element_iterator en;
950  boost::tie( it, en ) = elementsWithProcessId( this->worldCommElements().localRank() );
951 
952  for ( ; it != en; ++it )
953  M_elements.modify( it, [&evec]( element_type& e )
954  {
955  e.setMarker3( evec.localToGlobal( e.id(), 0, 0 ) );
956  } );
957  }
958 
959  template<typename IteratorRange>
960  void updateMarker2WithRangeElements( IteratorRange const& range, flag_type flag )
961  {
962  typedef typename boost::tuples::template element<1, IteratorRange>::type iterator_range_type;
963  iterator_range_type it, en;
964  boost::tie( boost::tuples::ignore, it, en ) = range;
965 
966  for ( ; it != en; ++it )
967  M_elements.modify( this->elementIterator( it->id() ), [&flag]( element_type& e )
968  {
969  e.setMarker2( flag );
970  } );
971  }
972 
973  template<typename IteratorRange>
974  void updateMarker3WithRangeElements( IteratorRange const& range, flag_type flag )
975  {
976  typedef typename boost::tuples::template element<1, IteratorRange>::type iterator_type;
977  iterator_type it, en;
978  boost::tie( boost::tuples::ignore, it, en ) = range;
979 
980  for ( ; it != en; ++it )
981  M_elements.modify( this->elementIterator( it->id() ), [&flag]( element_type& e )
982  {
983  e.setMarker3( flag );
984  } );
985  }
986 
987 
994  {
995 
996  auto it = beginElement(), en = endElement();
997 
998  for ( ; it != en; ++it )
999  M_elements.modify( it,
1000  []( element_type& e )
1001  {
1002  int newtag2=0, newtag3=0;
1003  for (uint16_type f=0;f<e.numTopologicalFaces; ++f)
1004  {
1005  int tag2 = e.face(f).marker2().value();
1006  int tag3 = e.face(f).marker3().value();
1007  if (tag2>0) newtag2=tag2;
1008  if (tag3>0) newtag3=tag3;
1009  }
1010 
1011  if (newtag2>0) e.setMarker2( newtag2 );
1012  if (newtag3>0) e.setMarker3( newtag3 );
1013 
1014  } );
1015 
1016  }
1017 
1018 
1019 
1020  void setWorldCommElements( WorldComm const& _worldComm )
1021  {
1022  M_worldCommElements = _worldComm;
1023  }
1024 
1026 
1027 private:
1028 
1029  friend class boost::serialization::access;
1030  template<class Archive>
1031  void serialize( Archive & ar, const unsigned int version )
1032  {
1033  ar & M_elements;
1034  ar & M_parts;
1035  }
1036 
1037 
1038 private:
1039  WorldComm M_worldCommElements;
1040  elements_type M_elements;
1041  parts_map_type M_parts;
1042 };
1044 } // Feel
1045 #endif /* FEELPP_ELEMENTS_HPP */
std::pair< marker2_element_const_iterator, marker2_element_const_iterator > elementsWithMarker2(size_type m, size_type p) const
Definition: elements.hpp:548
elements_type const & elements() const
Definition: elements.hpp:355
marker_elements & elementsByMarker()
Definition: elements.hpp:623
element_type const & addElement(element_type &f)
Definition: elements.hpp:921
marker_element_const_iterator endElementWithMarker(size_type m) const
Definition: elements.hpp:511
const uint16_type invalid_uint16_type_value
Definition: feelcore/feel.hpp:338
location_elements & elementsByLocation()
Definition: elements.hpp:758
ghostcell_element_iterator endGhostElement()
Definition: elements.hpp:870
std::pair< location_element_const_iterator, location_element_const_iterator > internalElements(size_type p) const
Definition: elements.hpp:745
location_element_iterator endInternalElement()
Definition: elements.hpp:789
pid_elements & elementsByProcessId()
Definition: elements.hpp:695
location_element_iterator beginInternalElement()
Definition: elements.hpp:780
marker2_elements & elementsByMarker2()
Definition: elements.hpp:635
marker3_element_const_iterator endElementWithMarker3(size_type m) const
Definition: elements.hpp:527
ghostcell_element_iterator beginGhostElement()
Definition: elements.hpp:858
marker2_element_const_iterator beginElementWithMarker2(size_type m) const
Definition: elements.hpp:495
std::pair< element_iterator, element_iterator > elementsRange()
Definition: elements.hpp:452
void updateMarkersFromFaces()
Definition: elements.hpp:993
marker3_elements & elementsByMarker3()
Definition: elements.hpp:647
marker3_element_const_iterator beginElementWithMarker3(size_type m) const
Definition: elements.hpp:503
elements_type::template nth_index< 0 >::type & elementsById()
Definition: elements.hpp:599
virtual bool isEmpty() const
Definition: elements.hpp:371
location_element_iterator beginElementOnBoundary()
Definition: elements.hpp:819
std::pair< location_element_const_iterator, location_element_const_iterator > boundaryElements(uint16_type entity_min_dim, uint16_type entity_max_dim, size_type p) const
Definition: elements.hpp:717
bool hasElement(size_type i) const
Definition: elements.hpp:414
marker2_element_const_iterator endElementWithMarker2(size_type m) const
Definition: elements.hpp:519
size_t size_type
Indices (starting from 0)
Definition: feelcore/feel.hpp:319
location_element_iterator endElementOnBoundary()
Definition: elements.hpp:828
Elements & operator=(Elements const &e)
Definition: elements.hpp:335
std::pair< marker_element_const_iterator, marker_element_const_iterator > elementsWithMarker(size_type m, size_type p) const
Definition: elements.hpp:537
marker_element_const_iterator beginElementWithMarker(size_type m) const
Definition: elements.hpp:487
std::pair< marker3_element_const_iterator, marker3_element_const_iterator > elementsWithMarker3(size_type m, size_type p) const
Definition: elements.hpp:558

Generated on Sun Dec 22 2013 13:10:59 for Feel++ by doxygen 1.8.5