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