dune-grid  2.5.0
geometrygrid/grid.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_GEOGRID_GRID_HH
4 #define DUNE_GEOGRID_GRID_HH
5 
6 #include <dune/common/deprecated.hh>
7 
9 
16 
17 namespace Dune
18 {
19 
20  // DefaultCoordFunction
21  // --------------------
22 
23  template< class HostGrid >
25  : public IdenticalCoordFunction< typename HostGrid::ctype, HostGrid::dimensionworld >
26  {};
27 
28 
29 
30  // GeometryGrid
31  // ------------
32 
73  template< class HostGrid, class CoordFunction = DefaultCoordFunction< HostGrid >, class Allocator = std::allocator< void > >
74  class GeometryGrid
77  < HostGrid::dimension, CoordFunction::dimRange, typename HostGrid::ctype,
78  GeoGrid::GridFamily< HostGrid, CoordFunction, Allocator > >,
79  public GeoGrid::ExportParams< HostGrid, CoordFunction >,
80  public GeoGrid::BackupRestoreFacilities< GeometryGrid< HostGrid, CoordFunction, Allocator > >
82  {
84 
86  < HostGrid::dimension, CoordFunction::dimRange, typename HostGrid::ctype,
88  Base;
89 
90  friend class GeoGrid::HierarchicIterator< const Grid >;
91 
92  template< int, class, bool > friend class GeoGrid::EntityBase;
93  template< int, int, class > friend class GeoGrid::Geometry;
94  template< class, class, class > friend class GeoGrid::GridView;
95  template< class, class > friend class GeoGrid::Intersection;
96  template< class, class > friend class GeoGrid::IntersectionIterator;
97  template< class, class > friend class GeoGrid::IdSet;
98  template< class, class > friend class GeoGrid::IndexSet;
99  template< class > friend struct HostGridAccess;
100 
101  template< class, class > friend class GeoGrid::CommDataHandle;
102 
103  public:
111  typedef typename GridFamily::Traits Traits;
113 
120  template< int codim >
121  struct Codim;
122 
128  typedef typename Traits::HierarchicIterator HierarchicIterator;
131  typedef typename Traits::LeafIntersectionIterator LeafIntersectionIterator;
133  typedef typename Traits::LevelIntersectionIterator LevelIntersectionIterator;
134 
141  typedef typename GridFamily::Traits::LeafGridView LeafGridView;
143  typedef typename GridFamily::Traits::LevelGridView LevelGridView;
144 
159  typedef typename Traits::LeafIndexSet LeafIndexSet;
160 
169  typedef typename Traits::LevelIndexSet LevelIndexSet;
170 
181  typedef typename Traits::GlobalIdSet GlobalIdSet;
182 
198  typedef typename Traits::LocalIdSet LocalIdSet;
199 
205  typedef typename Traits::ctype ctype;
207 
209  typedef typename Traits::CollectiveCommunication CollectiveCommunication;
210 
225  GeometryGrid ( HostGrid &hostGrid, CoordFunction &coordFunction, const Allocator &allocator = Allocator() )
226  : hostGrid_( &hostGrid ),
227  coordFunction_( &coordFunction ),
228  removeHostGrid_( false ),
229  levelIndexSets_( hostGrid_->maxLevel()+1, nullptr, allocator ),
230  storageAllocator_( allocator )
231  {}
232 
242  GeometryGrid ( HostGrid *hostGrid, CoordFunction *coordFunction, const Allocator &allocator = Allocator() )
243  : hostGrid_( hostGrid ),
244  coordFunction_( coordFunction ),
245  removeHostGrid_( true ),
246  levelIndexSets_( hostGrid_->maxLevel()+1, nullptr, allocator ),
247  storageAllocator_( allocator )
248  {}
249 
259  GeometryGrid ( HostGrid *hostGrid, const Allocator &allocator = Allocator() )
260  : hostGrid_( hostGrid ),
261  coordFunction_( new CoordFunction( this->hostGrid() ) ),
262  removeHostGrid_( true ),
263  levelIndexSets_( hostGrid_->maxLevel()+1, nullptr, allocator ),
264  storageAllocator_( allocator )
265  {}
266 
267 
271  {
272  for( unsigned int i = 0; i < levelIndexSets_.size(); ++i )
273  {
274  if( levelIndexSets_[ i ] )
275  delete( levelIndexSets_[ i ] );
276  }
277 
278  if( removeHostGrid_ )
279  {
280  delete coordFunction_;
281  delete hostGrid_;
282  }
283  }
284 
297  int maxLevel () const
298  {
299  return hostGrid().maxLevel();
300  }
301 
310  int size ( int level, int codim ) const
311  {
312  return levelGridView( level ).size( codim );
313  }
314 
321  int size ( int codim ) const
322  {
323  return leafGridView().size( codim );
324  }
325 
334  int size ( int level, GeometryType type ) const
335  {
336  return levelGridView( level ).size( type );
337  }
338 
343  int size ( GeometryType type ) const
344  {
345  return leafGridView().size( type );
346  }
347 
352  size_t numBoundarySegments () const
353  {
354  return hostGrid().numBoundarySegments( );
355  }
358  const GlobalIdSet &globalIdSet () const
359  {
360  if( !globalIdSet_ )
361  globalIdSet_ = GlobalIdSet( hostGrid().globalIdSet() );
362  assert( globalIdSet_ );
363  return globalIdSet_;
364  }
365 
366  const LocalIdSet &localIdSet () const
367  {
368  if( !localIdSet_ )
369  localIdSet_ = LocalIdSet( hostGrid().localIdSet() );
370  assert( localIdSet_ );
371  return localIdSet_;
372  }
373 
374  const LevelIndexSet &levelIndexSet ( int level ) const
375  {
376  assert( levelIndexSets_.size() == (size_t)(maxLevel()+1) );
377  if( (level < 0) || (level > maxLevel()) )
378  {
379  DUNE_THROW( GridError, "LevelIndexSet for nonexisting level " << level
380  << " requested." );
381  }
382 
383  LevelIndexSet *&levelIndexSet = levelIndexSets_[ level ];
384  if( !levelIndexSet )
385  levelIndexSet = new LevelIndexSet( hostGrid().levelIndexSet( level ) );
386  assert( levelIndexSet );
387  return *levelIndexSet;
388  }
389 
390  const LeafIndexSet &leafIndexSet () const
391  {
392  if( !leafIndexSet_ )
393  leafIndexSet_ = LeafIndexSet( hostGrid().leafIndexSet() );
394  assert( leafIndexSet_ );
395  return leafIndexSet_;
396  }
397 
398  void globalRefine ( int refCount )
399  {
400  hostGrid().globalRefine( refCount );
401  update();
402  }
403 
404  bool mark ( int refCount, const typename Codim< 0 >::Entity &entity )
405  {
406  return hostGrid().mark( refCount, getHostEntity< 0 >( entity ) );
407  }
408 
409  int getMark ( const typename Codim< 0 >::Entity &entity ) const
410  {
411  return hostGrid().getMark( getHostEntity< 0 >( entity ) );
412  }
413 
414  bool preAdapt ()
415  {
416  return hostGrid().preAdapt();
417  }
418 
419  bool adapt ()
420  {
421  bool ret = hostGrid().adapt();
422  update();
423  return ret;
424  }
425 
426  void postAdapt ()
427  {
428  hostGrid().postAdapt();
429  }
430 
438  int overlapSize ( int codim ) const
439  {
440  return leafGridView().overlapSize( codim );
441  }
442 
447  int ghostSize( int codim ) const
448  {
449  return leafGridView().ghostSize( codim );
450  }
451 
457  int overlapSize ( int level, int codim ) const
458  {
459  return levelGridView( level ).overlapSize( codim );
460  }
461 
467  int ghostSize ( int level, int codim ) const
468  {
469  return levelGridView( level ).ghostSize( codim );
470  }
471 
485  template< class DataHandle, class Data >
487  InterfaceType interface,
488  CommunicationDirection direction,
489  int level ) const
490  {
491  levelGridView( level ).communicate( dataHandle, interface, direction );
492  }
493 
506  template< class DataHandle, class Data >
508  InterfaceType interface,
509  CommunicationDirection direction ) const
510  {
511  leafGridView().communicate( dataHandle, interface, direction );
512  }
513 
522  const CollectiveCommunication &comm () const
523  {
524  return hostGrid().comm();
525  }
526 
527 #if 0
528  // data handle interface different between geo and interface
529 
539  bool loadBalance ()
540  {
541  const bool gridChanged= hostGrid().loadBalance();
542  if( gridChanged )
543  update();
544  return gridChanged;
545  }
546 
562  template< class DataHandle, class Data >
563  bool loadBalance ( CommDataHandleIF< DataHandle, Data > &datahandle )
564  {
565  typedef CommDataHandleIF< DataHandle, Data > DataHandleIF;
566  typedef GeoGrid :: CommDataHandle< Grid, DataHandleIF > WrappedDataHandle;
567 
568  WrappedDataHandle wrappedDataHandle( *this, datahandle );
569  const bool gridChanged = hostGrid().loadBalance( wrappedDataHandle );
570  if( gridChanged )
571  update();
572  return gridChanged;
573  }
574 #endif
575 
595  template< class EntitySeed >
596  typename Traits::template Codim< EntitySeed::codimension >::Entity
597  entity ( const EntitySeed &seed ) const
598  {
599  typedef typename Traits::template Codim< EntitySeed::codimension >::EntityImpl EntityImpl;
600  return EntityImpl( *this, seed );
601  }
602 
609  LevelGridView levelGridView ( int level ) const
610  {
611  typedef typename LevelGridView::GridViewImp ViewImp;
612  return LevelGridView( ViewImp( *this, hostGrid().levelGridView( level ) ) );
613  }
614 
616  LeafGridView leafGridView () const
617  {
618  typedef typename LeafGridView::GridViewImp ViewImp;
619  return LeafGridView( ViewImp( *this, hostGrid().leafGridView() ) );
620  }
621 
628  const HostGrid &hostGrid () const
629  {
630  return *hostGrid_;
631  }
632 
634  HostGrid &hostGrid ()
635  {
636  return *hostGrid_;
637  }
638 
647  void update ()
648  {
649  // adapt the coordinate function
651 
652  const int newNumLevels = maxLevel()+1;
653  const int oldNumLevels = levelIndexSets_.size();
654 
655  for( int i = newNumLevels; i < oldNumLevels; ++i )
656  {
657  if( levelIndexSets_[ i ] )
658  delete levelIndexSets_[ i ];
659  }
660  levelIndexSets_.resize( newNumLevels, nullptr );
661  }
662 
663 
664  using Base::getRealImplementation;
665 
667  const CoordFunction &coordFunction () const { return *coordFunction_; }
668 
670  CoordFunction &coordFunction () { return *coordFunction_; }
671 
674  protected:
675  template< int codim >
676  static const typename HostGrid::template Codim< codim >::Entity &
677  getHostEntity( const typename Codim< codim >::Entity &entity )
678  {
679  return getRealImplementation( entity ).hostEntity();
680  }
681 
682  void *allocateStorage ( std::size_t size ) const
683  {
684  return storageAllocator_.allocate( size );
685  }
686 
687  void deallocateStorage ( void *p, std::size_t size ) const
688  {
689  storageAllocator_.deallocate( (char *)p, size );
690  }
691 
692  private:
693  HostGrid *const hostGrid_;
694  CoordFunction *coordFunction_;
695  bool removeHostGrid_;
696  mutable std::vector< LevelIndexSet *, typename Allocator::template rebind< LevelIndexSet * >::other > levelIndexSets_;
697  mutable LeafIndexSet leafIndexSet_;
698  mutable GlobalIdSet globalIdSet_;
699  mutable LocalIdSet localIdSet_;
700  mutable typename Allocator::template rebind< char >::other storageAllocator_;
701  };
702 
703 
704 
705  // GeometryGrid::Codim
706  // -------------------
707 
708  template< class HostGrid, class CoordFunction, class Allocator >
709  template< int codim >
710  struct GeometryGrid< HostGrid, CoordFunction, Allocator >::Codim
711  : public Base::template Codim< codim >
712  {
720  typedef typename Traits::template Codim< codim >::Entity Entity;
721 
735  typedef typename Traits::template Codim< codim >::Geometry Geometry;
736 
745  typedef typename Traits::template Codim< codim >::LocalGeometry LocalGeometry;
746 
752  template< PartitionIteratorType pitype >
753  struct Partition
754  {
755  typedef typename Traits::template Codim< codim >
758  typedef typename Traits::template Codim< codim >
761  };
762 
771 
780 
782  };
783 
784 } // namespace Dune
785 
786 #endif // #ifndef DUNE_GEOGRID_GRID_HH
Traits::template Codim< codim >::Geometry Geometry
type of world geometry
Definition: geometrygrid/grid.hh:735
Definition: geometrygrid/gridfamily.hh:33
static const HostGrid::template Codim< codim >::Entity & getHostEntity(const typename Codim< codim >::Entity &entity)
Definition: geometrygrid/grid.hh:677
Definition: geometrygrid/grid.hh:24
void update()
update grid caches
Definition: geometrygrid/grid.hh:647
int ghostSize(int codim) const
obtain size of ghost region for the leaf grid
Definition: geometrygrid/grid.hh:447
Traits::LevelIndexSet LevelIndexSet
type of level index set
Definition: geometrygrid/grid.hh:169
CoordFunction & coordFunction()
obtain mutable reference to the coordinate function.
Definition: geometrygrid/grid.hh:670
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:16
GridFamily::Traits::LevelGridView LevelGridView
type of view for level grid
Definition: geometrygrid/grid.hh:143
Grid< dim, dimworld, ct, GridFamily >::LevelGridView levelGridView(const Grid< dim, dimworld, ct, GridFamily > &grid, int level)
level grid view for the given grid and level.
Definition: common/grid.hh:857
Definition: geometrygrid/gridview.hh:27
Traits::LeafIndexSet LeafIndexSet
type of leaf index set
Definition: geometrygrid/grid.hh:159
GridFamily::Traits::LeafGridView LeafGridView
type of view for leaf grid
Definition: geometrygrid/grid.hh:141
Definition: geometrygrid/datahandle.hh:23
provides access to host grid objects from GeometryGrid
Definition: identitygrid.hh:36
GeometryType
Type representing VTK&#39;s entity geometry types.
Definition: common.hh:178
int maxLevel() const
obtain maximal grid level
Definition: geometrygrid/grid.hh:297
int getMark(const typename Codim< 0 >::Entity &entity) const
Definition: geometrygrid/grid.hh:409
Traits::GlobalIdSet GlobalIdSet
type of global id set
Definition: geometrygrid/grid.hh:181
const LeafIndexSet & leafIndexSet() const
Definition: geometrygrid/grid.hh:390
Store a reference to an entity with a minimal memory footprint.
Definition: common/entityseed.hh:23
Definition: geometrygrid/entity.hh:58
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:168
int size(GeometryType type) const
obtain number of leaf entities
Definition: geometrygrid/grid.hh:343
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator LeafIterator
Definition: geometrygrid/grid.hh:757
const CollectiveCommunication & comm() const
obtain CollectiveCommunication object
Definition: geometrygrid/grid.hh:522
int size(int codim) const
obtain number of leaf entities
Definition: geometrygrid/grid.hh:321
LevelGridView levelGridView(int level) const
View for a grid level.
Definition: geometrygrid/grid.hh:609
Definition: common/geometry.hh:24
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &seed) const
obtain Entity from EntitySeed
Definition: geometrygrid/grid.hh:597
const LevelIndexSet & levelIndexSet(int level) const
Definition: geometrygrid/grid.hh:374
HostGrid & hostGrid()
obtain mutable reference to the host grid
Definition: geometrygrid/grid.hh:634
bool preAdapt()
Definition: geometrygrid/grid.hh:414
size_t numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: geometrygrid/grid.hh:352
Definition: geometrygrid/intersection.hh:19
void communicate(CommDataHandleIF< DataHandle, Data > &dataHandle, InterfaceType interface, CommunicationDirection direction) const
communicate information on leaf entities
Definition: geometrygrid/grid.hh:507
Traits::template Codim< codim >::Entity Entity
type of entity
Definition: geometrygrid/grid.hh:720
void communicate(CommDataHandleIF< DataHandle, Data > &dataHandle, InterfaceType interface, CommunicationDirection direction, int level) const
communicate information on a grid level
Definition: geometrygrid/grid.hh:486
GeometryGrid(HostGrid &hostGrid, CoordFunction &coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:225
void postAdapt()
Definition: geometrygrid/grid.hh:426
const CoordFunction & coordFunction() const
obtain constant reference to the coordinate function
Definition: geometrygrid/grid.hh:667
void deallocateStorage(void *p, std::size_t size) const
Definition: geometrygrid/grid.hh:687
int size(int level, int codim) const
obtain number of entites on a level
Definition: geometrygrid/grid.hh:310
Traits::HierarchicIterator HierarchicIterator
iterator over the grid hierarchy
Definition: geometrygrid/grid.hh:129
int overlapSize(int level, int codim) const
obtain size of overlap region for a grid level
Definition: geometrygrid/grid.hh:457
bool mark(int refCount, const typename Codim< 0 >::Entity &entity)
Definition: geometrygrid/grid.hh:404
Partition< All_Partition >::LevelIterator LevelIterator
type of level iterator
Definition: geometrygrid/grid.hh:779
GeometryGrid(HostGrid *hostGrid, CoordFunction *coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:242
Traits::CollectiveCommunication CollectiveCommunication
communicator with all other processes having some part of the grid
Definition: geometrygrid/grid.hh:209
int overlapSize(int codim) const
obtain size of overlap region for the leaf grid
Definition: geometrygrid/grid.hh:438
Definition: identity.hh:12
int ghostSize(int level, int codim) const
obtain size of ghost region for a grid level
Definition: geometrygrid/grid.hh:467
Definition: geometrygrid/grid.hh:753
static void adapt(CoordFunctionInterface &coordFunction)
Definition: coordfunction.hh:287
void globalRefine(int refCount)
Definition: geometrygrid/grid.hh:398
const GlobalIdSet & globalIdSet() const
Definition: geometrygrid/grid.hh:358
bool adapt()
Definition: geometrygrid/grid.hh:419
Include standard header files.
Definition: agrid.hh:59
Traits::LocalIdSet LocalIdSet
type of local id set
Definition: geometrygrid/grid.hh:198
GridFamily::Traits Traits
type of the grid traits
Definition: geometrygrid/grid.hh:112
HostGrid::ctype ctype
field type of the coordinate vector
Definition: coordfunction.hh:49
Grid< dim, dimworld, ct, GridFamily >::LeafGridView leafGridView(const Grid< dim, dimworld, ct, GridFamily > &grid)
leaf grid view for the given grid
Definition: common/grid.hh:874
actual implementation of the entity
Definition: geometrygrid/entity.hh:32
Definition: geometrygrid/indexsets.hh:25
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:72
Traits::template Codim< codim >::LocalGeometry LocalGeometry
type of local geometry
Definition: geometrygrid/grid.hh:745
~GeometryGrid()
destructor
Definition: geometrygrid/grid.hh:270
LeafGridView leafGridView() const
View for the leaf grid.
Definition: geometrygrid/grid.hh:616
GeometryGrid(HostGrid *hostGrid, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:259
void * allocateStorage(std::size_t size) const
Definition: geometrygrid/grid.hh:682
Definition: geometrygrid/backuprestore.hh:21
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator LevelIterator
Definition: geometrygrid/grid.hh:760
const HostGrid & hostGrid() const
obtain constant reference to the host grid
Definition: geometrygrid/grid.hh:628
Traits::LevelIntersectionIterator LevelIntersectionIterator
iterator over intersections with other entities on the same level
Definition: geometrygrid/grid.hh:133
const LocalIdSet & localIdSet() const
Definition: geometrygrid/grid.hh:366
Definition: idset.hh:18
Definition: geometrygrid/gridfamily.hh:49
traits structure containing types for a codimension
Definition: geometrygrid/grid.hh:121
Different resources needed by all grid implementations.
Definition: geometrygrid/geometry.hh:86
Grid abstract base classThis class is the base class for all grid implementations. Although no virtual functions are used we call it abstract since its methods do not contain an implementation but forward to the methods of the derived class via the Barton-Nackman trick.
Definition: common/grid.hh:373
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
Traits::LeafIntersectionIterator LeafIntersectionIterator
iterator over intersections with other entities on the leaf level
Definition: geometrygrid/grid.hh:131
int size(int level, GeometryType type) const
obtain number of entites on a level
Definition: geometrygrid/grid.hh:334
Definition: geometrygrid/entity.hh:55
Partition< All_Partition >::LeafIterator LeafIterator
type of leaf iterator
Definition: geometrygrid/grid.hh:770
grid wrapper replacing the geometriesGeometryGrid wraps another DUNE grid and replaces its geometry b...
Definition: declaration.hh:10