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