dune-fem  2.8-git
gridpart2gridview.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDPART_COMMON_GRIDPART2GRIDVIEW_HH
2 #define DUNE_FEM_GRIDPART_COMMON_GRIDPART2GRIDVIEW_HH
3 
4 #include <cassert>
5 
6 #include <dune/common/exceptions.hh>
7 
8 #include <dune/grid/common/gridenums.hh>
9 #include <dune/grid/common/gridview.hh>
10 
11 namespace Dune
12 {
13 
14 #ifdef USING_DUNE_PYTHON
15  namespace FemPy
16  {
17  // #include <dune/fempy/py/grid/gridpart.hh>
18  namespace detail
19  {
20  template< class Grid >
21  inline static void addGridModificationListener ( const Grid &grid );
22  }
23  }
24 #endif
25  namespace Fem
26  {
27 
28  template< class GridPart >
29  class GridPart2GridViewImpl;
30 
31 
32  template< class GridPart >
34  {
36 
37  typedef typename GridPart::GridType Grid;
38  typedef typename GridPart::IndexSetType IndexSet;
39  typedef typename GridPart::IntersectionIteratorType IntersectionIterator;
40 
41  typedef typename IntersectionIterator::Intersection Intersection;
42 
43  typedef typename GridPart::CollectiveCommunicationType CollectiveCommunication;
44 
45  template< int codim >
46  struct Codim
47  : public Grid::Traits::template Codim< codim >
48  {
49  typedef typename GridPart::template Codim< codim >::EntityType Entity;
50 
51  typedef typename GridPart::template Codim< codim >::GeometryType Geometry;
52  typedef typename GridPart::template Codim< codim >::LocalGeometryType LocalGeometry;
53 
54  template< PartitionIteratorType pitype >
55  struct Partition
56  {
58  };
59 
61  };
62 
63  static const bool conforming = GridPart::Traits::conforming;
64  };
65 
66 
67  template< class GridPart >
69  {
71 
72  public:
73  typedef typename GridPart::ctype ctype;
74 
75  typedef GridPart GridPartType;
76 
78 
80  typedef typename Traits::Grid Grid;
81 
83  typedef typename Traits::IndexSet IndexSet;
84 
87 
90 
93 
95  template< int codim >
96  struct Codim
97  : public Traits::template Codim< codim >
98  {};
99 
101 
102  enum { dimension = GridPartType::dimension };
103  enum { dimensionworld = GridPartType::dimensionworld };
104 
106  : gridPartStorage_(nullptr)
107  , gridPart_( &gridPart )
108  {}
109  template< class... Args,
110  std::enable_if_t< std::is_constructible< GridPartType, Args... >::value, int > = 0 >
111  GridPart2GridViewImpl( Args &&... args )
112  : gridPartStorage_(new GridPartType( std::forward< Args >( args )..., this) )
113  , gridPart_(gridPartStorage_.get())
114  {
115 #ifdef USING_DUNE_PYTHON
116  // add grid modification listener (if not registered)
117  FemPy::detail::addGridModificationListener( gridPart().grid() );
118 #endif
119  }
120 
122  {}
123 
124  const Grid &grid () const
125  {
126  return gridPart().grid();
127  }
128 
129  const IndexSet &indexSet () const
130  {
131  return gridPart().indexSet();
132  }
133 
134  int size ( int codim ) const
135  {
136  return indexSet().size( codim );
137  }
138 
139  int size ( const GeometryType &type ) const
140  {
141  return indexSet().size( type );
142  }
143 
144  template<class EntityType>
145  bool contains (const EntityType& e) const
146  {
147  return indexSet().contains(e);
148  }
149 
150  template< int codim >
151  typename Codim< codim >::Iterator begin () const
152  {
153  return begin< codim, All_Partition >();
154  }
155 
156  template< int codim, PartitionIteratorType pitype >
157  typename Codim< codim >::template Partition< pitype >::Iterator begin () const
158  {
159  return gridPart().template begin< codim, pitype >();
160  }
161 
162  template< int codim >
163  typename Codim< codim >::Iterator end () const
164  {
165  return end< codim, All_Partition >();
166  }
167 
168  template< int codim, PartitionIteratorType pitype >
169  typename Codim< codim >::template Partition< pitype >::Iterator end () const
170  {
171  return gridPart().template end< codim, pitype >();
172  }
173 
174  IntersectionIterator ibegin ( const typename Codim< 0 >::Entity &entity ) const
175  {
176  return gridPart().ibegin( entity );
177  }
178 
179  IntersectionIterator iend ( const typename Codim< 0 >::Entity &entity ) const
180  {
181  return gridPart().iend( entity );
182  }
183 
185  {
186  return gridPart().comm();
187  }
188 
189  int overlapSize ( int codim ) const
190  {
191  DUNE_THROW( NotImplemented, "Method ghostSize() not implemented yet" );
192  }
193 
194  int ghostSize( int codim ) const
195  {
196  DUNE_THROW( NotImplemented, "Method ghostSize() not implemented yet" );
197  }
198 
199  template< class DataHandleImp, class DataType >
200  void communicate ( CommDataHandleIF< DataHandleImp, DataType > &data,
201  InterfaceType iftype,
202  CommunicationDirection dir ) const
203  {
204  gridPart().communicate( data, iftype, dir );
205  }
206 
207  const GridPartType &gridPart () const {
208  assert( gridPart_ );
209  return *gridPart_;
210  }
211 
212  private:
213  std::shared_ptr<GridPartType> gridPartStorage_;
214  const GridPartType *gridPart_;
215  };
216 
217 
218 
219  template< class GridPart >
221  : public GridView< GridPart2GridViewTraits< GridPart > >
222  {
224  typedef GridView< GridPart2GridViewTraits< GridPart > > BaseType;
225 
226  typedef typename BaseType::GridViewImp GridViewImp;
227 
228  public:
229  explicit GridPart2GridView ( const GridPart &gridPart )
230  : BaseType( GridViewImp( gridPart ) )
231  {}
232  };
233 
234  } // namespace Fem
235 
236 } // namespace Dune
237 
238 #endif // #ifndef DUNE_FEM_GRIDPART_COMMON_GRIDPART2GRIDVIEW_HH
Definition: bindguard.hh:11
std::tuple_element< i, Tuple >::type & get(Dune::TypeIndexedTuple< Tuple, Types > &tuple)
Definition: typeindexedtuple.hh:122
Definition: gridpart2gridview.hh:69
GridPart GridPartType
Definition: gridpart2gridview.hh:75
GridPart2GridViewImpl(Args &&... args)
Definition: gridpart2gridview.hh:111
int overlapSize(int codim) const
Definition: gridpart2gridview.hh:189
~GridPart2GridViewImpl()
Definition: gridpart2gridview.hh:121
Traits::Grid Grid
type of the grid
Definition: gridpart2gridview.hh:80
Traits::Intersection Intersection
type of the intersection
Definition: gridpart2gridview.hh:86
GridPart2GridViewTraits< GridPartType > Traits
Definition: gridpart2gridview.hh:77
Codim< codim >::Iterator end() const
Definition: gridpart2gridview.hh:163
Codim< codim >::template Partition< pitype >::Iterator end() const
Definition: gridpart2gridview.hh:169
Codim< codim >::template Partition< pitype >::Iterator begin() const
Definition: gridpart2gridview.hh:157
bool contains(const EntityType &e) const
Definition: gridpart2gridview.hh:145
@ dimensionworld
Definition: gridpart2gridview.hh:103
const CollectiveCommunication & comm() const
Definition: gridpart2gridview.hh:184
GridPart2GridViewImpl(const GridPartType &gridPart)
Definition: gridpart2gridview.hh:105
int size(const GeometryType &type) const
Definition: gridpart2gridview.hh:139
IntersectionIterator ibegin(const typename Codim< 0 >::Entity &entity) const
Definition: gridpart2gridview.hh:174
int ghostSize(int codim) const
Definition: gridpart2gridview.hh:194
int size(int codim) const
Definition: gridpart2gridview.hh:134
const IndexSet & indexSet() const
Definition: gridpart2gridview.hh:129
void communicate(CommDataHandleIF< DataHandleImp, DataType > &data, InterfaceType iftype, CommunicationDirection dir) const
Definition: gridpart2gridview.hh:200
Traits::IntersectionIterator IntersectionIterator
type of the intersection iterator
Definition: gridpart2gridview.hh:89
IntersectionIterator iend(const typename Codim< 0 >::Entity &entity) const
Definition: gridpart2gridview.hh:179
const Grid & grid() const
Definition: gridpart2gridview.hh:124
Traits::CollectiveCommunication CollectiveCommunication
type of the collective communication
Definition: gridpart2gridview.hh:92
@ conforming
Definition: gridpart2gridview.hh:100
@ dimension
Definition: gridpart2gridview.hh:102
GridPart::ctype ctype
Definition: gridpart2gridview.hh:73
Codim< codim >::Iterator begin() const
Definition: gridpart2gridview.hh:151
const GridPartType & gridPart() const
Definition: gridpart2gridview.hh:207
Traits::IndexSet IndexSet
type of the index set
Definition: gridpart2gridview.hh:83
Definition: gridpart2gridview.hh:34
GridPart2GridViewImpl< GridPart > GridViewImp
Definition: gridpart2gridview.hh:35
IntersectionIterator::Intersection Intersection
Definition: gridpart2gridview.hh:41
GridPart::CollectiveCommunicationType CollectiveCommunication
Definition: gridpart2gridview.hh:43
GridPart::IntersectionIteratorType IntersectionIterator
Definition: gridpart2gridview.hh:39
GridPart::IndexSetType IndexSet
Definition: gridpart2gridview.hh:38
static const bool conforming
Definition: gridpart2gridview.hh:63
GridPart::GridType Grid
Definition: gridpart2gridview.hh:37
Definition: gridpart2gridview.hh:48
GridPart::template Codim< codim >::GeometryType Geometry
Definition: gridpart2gridview.hh:51
Partition< All_Partition >::Iterator Iterator
Definition: gridpart2gridview.hh:60
GridPart::template Codim< codim >::LocalGeometryType LocalGeometry
Definition: gridpart2gridview.hh:52
GridPart::template Codim< codim >::EntityType Entity
Definition: gridpart2gridview.hh:49
Definition: gridpart2gridview.hh:56
GridPart::template Codim< codim >::template Partition< pitype >::IteratorType Iterator
Definition: gridpart2gridview.hh:57
Codim Structure.
Definition: gridpart2gridview.hh:98
Definition: gridpart2gridview.hh:222
GridPart2GridView(const GridPart &gridPart)
Definition: gridpart2gridview.hh:229