dune-fem  2.8-git
geogridpart.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDPART_GEOGRIDPART_HH
2 #define DUNE_FEM_GRIDPART_GEOGRIDPART_HH
3 
4 #include <cassert>
5 
6 #include <dune/grid/common/gridview.hh>
7 
20 
21 namespace Dune
22 {
23 
24  namespace Fem
25  {
26 
27  // Internal Forward Declarations
28  // -----------------------------
29 
30  template< class CoordFunction >
31  class GeoGridPart;
32 
33  template< class CoordFunction >
34  struct GeoGridPartFamily;
35 
36 
37 
38  // GeoGridPartData
39  // ---------------
40 
41  template< class CoordFunction >
43  {
44  typedef CoordFunction CoordFunctionType;
45 
46  GeoGridPartData () = default;
47  GeoGridPartData ( const CoordFunctionType &coordFunction ) : coordFunction_( &coordFunction ) {}
48 
49  operator const CoordFunctionType & () const { assert( coordFunction_ ); return *coordFunction_; }
50 
51  private:
52  const CoordFunctionType *coordFunction_ = nullptr;
53  };
54 
55 
56 
57  // GeoGridPartFamily
58  // -----------------
59 
60  // Traits for dune-grid facades ("Gen-Gurke!")
61  template< class CoordFunction >
63  {
64  typedef typename CoordFunction::RangeFieldType ctype;
65 
66  static const int dimension = CoordFunction::GridPartType::dimension;
67  static const int dimensionworld = CoordFunction::FunctionSpaceType::dimRange;
68 
70 
71  struct Traits
72  {
74  typedef CoordFunction CoordFunctionType;
75 
76  typedef typename CoordFunctionType::GridPartType HostGridPartType;
77 
78  template< int codim >
79  struct Codim
80  {
81  typedef Dune::Geometry< dimension - codim, dimensionworld, const GridPartFamily, GeoGeometry > Geometry;
82  typedef typename HostGridPartType::template Codim< codim >::LocalGeometryType LocalGeometry;
83 
84  typedef Dune::Entity< codim, dimension, const GridPartFamily, GeoEntity > Entity;
85  typedef typename HostGridPartType::GridType::template Codim< codim >::EntitySeed EntitySeed;
86  };
87 
90 
91  typedef Dune::Intersection< const GridPartFamily, IntersectionImplType > LeafIntersection;
92  typedef Dune::Intersection< const GridPartFamily, IntersectionImplType > LevelIntersection;
93 
94  typedef Dune::IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > LeafIntersectionIterator;
95  typedef Dune::IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > LevelIntersectionIterator;
96 
97  typedef Dune::EntityIterator< 0, const GridPartFamily, DeadIterator< typename Codim< 0 >::Entity > > HierarchicIterator;
98  };
99 
100  template< int codim >
101  struct Codim
102  : public Traits::template Codim< codim >
103  {};
104 
107 
109  };
110 
111 
112 
113  template< class CoordFunction >
115  {
119 
121 
122  typedef typename HostGridPartType::GridType GridType;
123 
126 
128 
129  static const PartitionIteratorType indexSetPartitionType = HostGridPartType::indexSetPartitionType;
130  static const InterfaceType indexSetInterfaceType = HostGridPartType::indexSetInterfaceType;
131 
134 
135  typedef IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > IntersectionIteratorType;
136 
137  template< int codim >
138  struct Codim
139  {
140  typedef typename GridPartFamily::Traits::template Codim< codim >::Geometry GeometryType;
141  typedef typename GridPartFamily::Traits::template Codim< codim >::LocalGeometry LocalGeometryType;
142 
143  typedef typename GridPartFamily::Traits::template Codim< codim >::Entity EntityType;
144 
145  typedef typename GridPartFamily::Traits::template Codim< codim >::EntitySeed EntitySeedType;
146 
147  template< PartitionIteratorType pitype >
148  struct Partition
149  {
150  typedef EntityIterator< codim, const GridPartFamily, IdIterator< codim, pitype, const GridPartFamily > > IteratorType;
151  };
152  };
153 
154  typedef typename HostGridPartType::CollectiveCommunicationType CollectiveCommunicationType;
155 
156  static const bool conforming = HostGridPartType::Traits::conforming;
157  };
158 
159 
160 
161  // GeoGridPart
162  // -----------
163 
164  template< class CoordFunction >
166  : public GridPartInterface< GeoGridPartTraits< CoordFunction > >
167  {
170 
172 
173  public:
175 
176  typedef CoordFunction CoordFunctionType;
177 
178  typedef typename BaseType::GridType GridType;
183 
184  template< int codim >
185  struct Codim
186  : public BaseType::template Codim< codim >
187  {};
188 
190  : coordFunction_( coordFunction ),
191  indexSet_( hostGridPart().indexSet() )
192  {}
193 
194  const GridType &grid () const
195  {
196  return hostGridPart().grid();
197  }
198 
200  {
201  return const_cast< GridType & >( hostGridPart().grid() );
202  }
203 
204  const IndexSetType &indexSet () const
205  {
206  return indexSet_;
207  }
208 
209  template< int codim >
210  typename Codim< codim >::IteratorType
211  begin () const
212  {
213  return begin< codim, InteriorBorder_Partition >();
214  }
215 
216  template< int codim, PartitionIteratorType pitype >
217  typename Codim< codim >::template Partition< pitype >::IteratorType
218  begin () const
219  {
220  return IdIterator< codim, pitype, const GridPartFamily >( coordFunction_, hostGridPart().template begin< codim, pitype >() );
221  }
222 
223  template< int codim >
224  typename Codim< codim >::IteratorType
225  end () const
226  {
227  return end< codim, InteriorBorder_Partition >();
228  }
229 
230  template< int codim, PartitionIteratorType pitype >
231  typename Codim< codim >::template Partition< pitype >::IteratorType
232  end () const
233  {
234  return IdIterator< codim, pitype, const GridPartFamily >( coordFunction_, hostGridPart().template end< codim, pitype >() );
235  }
236 
237  int level () const
238  {
239  return hostGridPart().level();
240  }
241 
243  {
245  }
246 
248  {
250  }
251 
252  int boundaryId ( const IntersectionType &intersection ) const
253  {
254  return hostGridPart().boundaryId( intersection.impl().hostIntersection() );
255  }
256 
257  const CollectiveCommunicationType &comm () const { return hostGridPart().comm(); }
258 
259  template< class DataHandle, class Data >
260  void communicate ( CommDataHandleIF< DataHandle, Data > &handle,
261  InterfaceType iftype, CommunicationDirection dir ) const
262  {
263  typedef CommDataHandleIF< DataHandle, Data > HostHandleType;
264  GeoDataHandle< GridPartFamily, HostHandleType > handleWrapper( coordFunction_, handle );
265  hostGridPart().communicate( handleWrapper, iftype, dir );
266  }
267 
268  template< class LocalFunction >
269  typename Codim< 0 >::EntityType
271  const LocalFunction &localCoordFunction ) const
272  {
273  return typename Codim< 0 >::EntityType::Implementation( entity.impl(), localCoordFunction );
274  }
275 
276  template < class EntitySeed >
277  typename Codim< EntitySeed::codimension >::EntityType
278  entity ( const EntitySeed &seed ) const
279  {
281  ::Implementation( coordFunction_, hostGridPart().entity( seed ) );
282  }
283 
284  // convert a grid entity to a grid part entity ("Gurke!")
285  template< class Entity >
286  MakeableInterfaceObject< typename Codim< Entity::codimension >::EntityType >
287  convert ( const Entity &entity ) const
288  {
289  // create a grid part entity from a given grid entity
290  typedef typename Codim< Entity::codimension >::EntityType EntityType;
291  typedef typename EntityType::Implementation Implementation;
292  typedef MakeableInterfaceObject< EntityType > EntityObj;
293 
294  // here, grid part information can be passed, if necessary
295  return EntityObj( Implementation( coordFunction_, entity ) );
296  }
297 
298  // return reference to the coordfunction
299  const CoordFunctionType &coordFunction () const { return coordFunction_; }
300 
301  // return reference to the host grid part
303  {
304  return coordFunction_.gridPart();
305  }
306 
307  // return reference to the host grid part
309  {
310  return const_cast< HostGridPartType & >( coordFunction_.gridPart() );
311  }
312 
313  private:
314  const CoordFunctionType &coordFunction_;
315  IndexSetType indexSet_;
316  };
317 
318 
319 
320  // GridEntityAccess for GeoEntity
321  // ------------------------------
322 
323  template< int codim, int dim, class GridFamily >
324  struct GridEntityAccess< Dune::Entity< codim, dim, GridFamily, GeoEntity > >
325  {
326  typedef Dune::Entity< codim, dim, GridFamily, GeoEntity > EntityType;
328  typedef typename HostAccessType::GridEntityType GridEntityType;
329 
330  static const GridEntityType &gridEntity ( const EntityType &entity )
331  {
332  return HostAccessType::gridEntity( entity.impl().hostEntity() );
333  }
334  };
335 
336 
337 
338  // EntitySearch for GeoGridPart
339  // ----------------------------
340 
341  template< class CoordFunction, int codim, PartitionIteratorType partition >
342  class EntitySearch< GeoGridPart< CoordFunction >, codim, partition >
343  : public DefaultEntitySearch< GeoGridPart< CoordFunction >, codim, partition >
344  {
345  typedef EntitySearch< GeoGridPart< CoordFunction >, codim, partition > ThisType;
347 
348  public:
350 
351  explicit EntitySearch ( const GridPartType &gridPart )
352  : BaseType( gridPart )
353  {}
354  };
355 
356  } // namespace Fem
357 
358 } // namespace Dune
359 
360 #endif // #ifndef DUNE_FEM_GRIDPART_GEOGRIDPART_HH
Definition: bindguard.hh:11
const GridEntityAccess< Entity >::GridEntityType & gridEntity(const Entity &entity)
Definition: gridpart.hh:412
interface for local functions
Definition: localfunction.hh:77
Definition: deaditerator.hh:49
Definition: deaditerator.hh:158
Definition: entitysearch.hh:25
Definition: entitysearch.hh:131
Interface for the GridPart classes A GridPart class allows to access only a specific subset of a grid...
Definition: gridpart.hh:77
Traits::CollectiveCommunicationType CollectiveCommunicationType
Collective communication.
Definition: gridpart.hh:96
Traits::GridType GridType
type of Grid implementation
Definition: gridpart.hh:90
IntersectionIteratorType::Intersection IntersectionType
type of Intersection
Definition: gridpart.hh:111
Traits::IntersectionIteratorType IntersectionIteratorType
type of IntersectionIterator
Definition: gridpart.hh:108
Definition: gridpart.hh:396
MetaTwistUtility forwards the twist calls to the TwistUtility of the underlying HostTwistUtility.
Definition: metatwistutility.hh:22
Definition: geogridpart.hh:167
const IndexSetType & indexSet() const
Definition: geogridpart.hh:204
Codim< codim >::template Partition< pitype >::IteratorType begin() const
Definition: geogridpart.hh:218
void communicate(CommDataHandleIF< DataHandle, Data > &handle, InterfaceType iftype, CommunicationDirection dir) const
Definition: geogridpart.hh:260
const HostGridPartType & hostGridPart() const
Definition: geogridpart.hh:302
Codim< 0 >::EntityType exchangeGeometry(const typename Codim< 0 >::EntityType &entity, const LocalFunction &localCoordFunction) const
Definition: geogridpart.hh:270
IntersectionIteratorType ibegin(const typename Codim< 0 >::EntityType &entity) const
Definition: geogridpart.hh:242
int boundaryId(const IntersectionType &intersection) const
Definition: geogridpart.hh:252
BaseType::IntersectionType IntersectionType
Definition: geogridpart.hh:181
GeoGridPart(const CoordFunctionType &coordFunction)
Definition: geogridpart.hh:189
Codim< codim >::IteratorType begin() const
Definition: geogridpart.hh:211
BaseType::CollectiveCommunicationType CollectiveCommunicationType
Definition: geogridpart.hh:182
BaseType::IntersectionIteratorType IntersectionIteratorType
Definition: geogridpart.hh:180
const CollectiveCommunicationType & comm() const
Definition: geogridpart.hh:257
CoordFunction CoordFunctionType
Definition: geogridpart.hh:176
const GridType & grid() const
Definition: geogridpart.hh:194
int level() const
Definition: geogridpart.hh:237
GridPartFamily::Traits::HostGridPartType HostGridPartType
Definition: geogridpart.hh:174
Codim< EntitySeed::codimension >::EntityType entity(const EntitySeed &seed) const
Definition: geogridpart.hh:278
Codim< codim >::template Partition< pitype >::IteratorType end() const
Definition: geogridpart.hh:232
Codim< codim >::IteratorType end() const
Definition: geogridpart.hh:225
BaseType::GridType GridType
Definition: geogridpart.hh:178
GridType & grid()
Definition: geogridpart.hh:199
const CoordFunctionType & coordFunction() const
Definition: geogridpart.hh:299
BaseType::IndexSetType IndexSetType
Definition: geogridpart.hh:179
IntersectionIteratorType iend(const typename Codim< 0 >::EntityType &entity) const
Definition: geogridpart.hh:247
MakeableInterfaceObject< typename Codim< Entity::codimension >::EntityType > convert(const Entity &entity) const
Definition: geogridpart.hh:287
HostGridPartType & hostGridPart()
Definition: geogridpart.hh:308
Definition: gridpart/geogridpart/datahandle.hh:22
Definition: gridpart/geogridpart/geometry.hh:57
Definition: geogridpart/intersection.hh:20
Definition: geogridpart/intersectioniterator.hh:22
Definition: geogridpart.hh:63
static const int dimensionworld
Definition: geogridpart.hh:67
static const int dimension
Definition: geogridpart.hh:66
CoordFunction::RangeFieldType ctype
Definition: geogridpart.hh:64
Traits::HierarchicIterator HierarchicIterator
Definition: geogridpart.hh:108
GeoGridPartFamily< CoordFunction > GridPartFamily
Definition: geogridpart.hh:69
Traits::LeafIntersectionIterator LeafIntersectionIterator
Definition: geogridpart.hh:105
Traits::LevelIntersectionIterator LevelIntersectionIterator
Definition: geogridpart.hh:106
Definition: geogridpart.hh:43
GeoGridPartData(const CoordFunctionType &coordFunction)
Definition: geogridpart.hh:47
CoordFunction CoordFunctionType
Definition: geogridpart.hh:44
Definition: geogridpart.hh:72
GeoGridPartData< CoordFunction > ExtraData
Definition: geogridpart.hh:73
DeadIntersectionIterator< const GridPartFamily > IntersectionIteratorImplType
Definition: geogridpart.hh:89
DeadIntersection< const GridPartFamily > IntersectionImplType
Definition: geogridpart.hh:88
Dune::IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > LeafIntersectionIterator
Definition: geogridpart.hh:94
Dune::IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > LevelIntersectionIterator
Definition: geogridpart.hh:95
CoordFunctionType::GridPartType HostGridPartType
Definition: geogridpart.hh:76
Dune::Intersection< const GridPartFamily, IntersectionImplType > LevelIntersection
Definition: geogridpart.hh:92
Dune::EntityIterator< 0, const GridPartFamily, DeadIterator< typename Codim< 0 >::Entity > > HierarchicIterator
Definition: geogridpart.hh:97
Dune::Intersection< const GridPartFamily, IntersectionImplType > LeafIntersection
Definition: geogridpart.hh:91
CoordFunction CoordFunctionType
Definition: geogridpart.hh:74
Definition: geogridpart.hh:80
HostGridPartType::template Codim< codim >::LocalGeometryType LocalGeometry
Definition: geogridpart.hh:82
Dune::Geometry< dimension - codim, dimensionworld, const GridPartFamily, GeoGeometry > Geometry
Definition: geogridpart.hh:81
Dune::Entity< codim, dimension, const GridPartFamily, GeoEntity > Entity
Definition: geogridpart.hh:84
HostGridPartType::GridType::template Codim< codim >::EntitySeed EntitySeed
Definition: geogridpart.hh:85
Definition: geogridpart.hh:103
Definition: geogridpart.hh:115
IdIndexSet< const GridPartFamily > IndexSetType
Definition: geogridpart.hh:127
static const InterfaceType indexSetInterfaceType
Definition: geogridpart.hh:130
GeoGridPart< CoordFunction > GridPartType
Definition: geogridpart.hh:116
GeoGridPartFamily< CoordFunction > GridPartFamily
Definition: geogridpart.hh:117
IntersectionIterator< const GridPartFamily, IntersectionIteratorImplType, IntersectionImplType > IntersectionIteratorType
Definition: geogridpart.hh:135
GeoGridPartFamily< CoordFunction > GridFamily
Definition: geogridpart.hh:118
GridPartFamily::Traits::HostGridPartType HostGridPartType
Definition: geogridpart.hh:120
HostGridPartType::GridType GridType
Definition: geogridpart.hh:122
static const bool conforming
Definition: geogridpart.hh:156
GeoIntersectionIterator< const GridPartFamily > IntersectionIteratorImplType
Definition: geogridpart.hh:133
GeoIntersection< const GridPartFamily > IntersectionImplType
Definition: geogridpart.hh:132
HostGridPartType::CollectiveCommunicationType CollectiveCommunicationType
Definition: geogridpart.hh:154
MetaTwistUtility< typename HostGridPartType ::TwistUtilityType > TwistUtilityType
type of twist utility
Definition: geogridpart.hh:125
static const PartitionIteratorType indexSetPartitionType
Definition: geogridpart.hh:129
Definition: geogridpart.hh:139
GridPartFamily::Traits::template Codim< codim >::LocalGeometry LocalGeometryType
Definition: geogridpart.hh:141
GridPartFamily::Traits::template Codim< codim >::Entity EntityType
Definition: geogridpart.hh:143
GridPartFamily::Traits::template Codim< codim >::EntitySeed EntitySeedType
Definition: geogridpart.hh:145
GridPartFamily::Traits::template Codim< codim >::Geometry GeometryType
Definition: geogridpart.hh:140
EntityIterator< codim, const GridPartFamily, IdIterator< codim, pitype, const GridPartFamily > > IteratorType
Definition: geogridpart.hh:150
Definition: geogridpart.hh:187
Dune::Entity< codim, dim, GridFamily, GeoEntity > EntityType
Definition: geogridpart.hh:326
GridEntityAccess< typename EntityType::Implementation::HostEntityType > HostAccessType
Definition: geogridpart.hh:327
static const GridEntityType & gridEntity(const EntityType &entity)
Definition: geogridpart.hh:330
HostAccessType::GridEntityType GridEntityType
Definition: geogridpart.hh:328
BaseType::GridPartType GridPartType
Definition: geogridpart.hh:349
EntitySearch(const GridPartType &gridPart)
Definition: geogridpart.hh:351
Definition: idgridpart/indexset.hh:260
Definition: idgridpart/iterator.hh:21