dune-grid  2.6-git
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_.reset( 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 
442  const CollectiveCommunication &comm () const
443  {
444  return hostGrid().comm();
445  }
446 
447 #if 0
448  // data handle interface different between geo and interface
449 
459  bool loadBalance ()
460  {
461  const bool gridChanged= hostGrid().loadBalance();
462  if( gridChanged )
463  update();
464  return gridChanged;
465  }
466 
482  template< class DataHandle, class Data >
483  bool loadBalance ( CommDataHandleIF< DataHandle, Data > &datahandle )
484  {
485  typedef CommDataHandleIF< DataHandle, Data > DataHandleIF;
486  typedef GeoGrid :: CommDataHandle< Grid, DataHandleIF > WrappedDataHandle;
487 
488  WrappedDataHandle wrappedDataHandle( *this, datahandle );
489  const bool gridChanged = hostGrid().loadBalance( wrappedDataHandle );
490  if( gridChanged )
491  update();
492  return gridChanged;
493  }
494 #endif
495 
515  template< class EntitySeed >
516  typename Traits::template Codim< EntitySeed::codimension >::Entity
517  entity ( const EntitySeed &seed ) const
518  {
519  typedef typename Traits::template Codim< EntitySeed::codimension >::EntityImpl EntityImpl;
520  return EntityImpl( *this, seed );
521  }
522 
529  LevelGridView levelGridView ( int level ) const
530  {
531  typedef typename LevelGridView::GridViewImp ViewImp;
532  return LevelGridView( ViewImp( *this, hostGrid().levelGridView( level ) ) );
533  }
534 
536  LeafGridView leafGridView () const
537  {
538  typedef typename LeafGridView::GridViewImp ViewImp;
539  return LeafGridView( ViewImp( *this, hostGrid().leafGridView() ) );
540  }
541 
548  const HostGrid &hostGrid () const
549  {
550  return *hostGrid_;
551  }
552 
554  HostGrid &hostGrid ()
555  {
556  return *hostGrid_;
557  }
558 
567  void update ()
568  {
569  // adapt the coordinate function
571 
572  const int newNumLevels = maxLevel()+1;
573  const int oldNumLevels = levelIndexSets_.size();
574 
575  for( int i = newNumLevels; i < oldNumLevels; ++i )
576  {
577  if( levelIndexSets_[ i ] )
578  delete levelIndexSets_[ i ];
579  }
580  levelIndexSets_.resize( newNumLevels, nullptr );
581  }
582 
583 
584  using Base::getRealImplementation;
585 
587  const CoordFunction &coordFunction () const { return *coordFunction_; }
588 
590  CoordFunction &coordFunction () { return *coordFunction_; }
591 
594  protected:
595  template< int codim >
596  static const typename HostGrid::template Codim< codim >::Entity &
597  getHostEntity( const typename Codim< codim >::Entity &entity )
598  {
599  return getRealImplementation( entity ).hostEntity();
600  }
601 
602  void *allocateStorage ( std::size_t size ) const
603  {
604  return storageAllocator_.allocate( size );
605  }
606 
607  void deallocateStorage ( void *p, std::size_t size ) const
608  {
609  storageAllocator_.deallocate( (char *)p, size );
610  }
611 
612  private:
613  HostGrid *const hostGrid_;
614  CoordFunction *coordFunction_;
615  bool removeHostGrid_;
616  mutable std::vector< LevelIndexSet *, typename Allocator::template rebind< LevelIndexSet * >::other > levelIndexSets_;
617  mutable LeafIndexSet leafIndexSet_;
618  mutable GlobalIdSet globalIdSet_;
619  mutable LocalIdSet localIdSet_;
620  mutable typename Allocator::template rebind< char >::other storageAllocator_;
621  };
622 
623 
624 
625  // GeometryGrid::Codim
626  // -------------------
627 
628  template< class HostGrid, class CoordFunction, class Allocator >
629  template< int codim >
630  struct GeometryGrid< HostGrid, CoordFunction, Allocator >::Codim
631  : public Base::template Codim< codim >
632  {
640  typedef typename Traits::template Codim< codim >::Entity Entity;
641 
655  typedef typename Traits::template Codim< codim >::Geometry Geometry;
656 
665  typedef typename Traits::template Codim< codim >::LocalGeometry LocalGeometry;
666 
672  template< PartitionIteratorType pitype >
673  struct Partition
674  {
675  typedef typename Traits::template Codim< codim >
678  typedef typename Traits::template Codim< codim >
681  };
682 
691 
700 
702  };
703 
704 } // namespace Dune
705 
706 #endif // #ifndef DUNE_GEOGRID_GRID_HH
Include standard header files.
Definition: agrid.hh:58
const CoordFunction & coordFunction() const
obtain constant reference to the coordinate function
Definition: geometrygrid/grid.hh:587
static const HostGrid::template Codim< codim >::Entity & getHostEntity(const typename Codim< codim >::Entity &entity)
Definition: geometrygrid/grid.hh:597
const LocalIdSet & localIdSet() const
Definition: geometrygrid/grid.hh:366
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:792
Traits::LeafIndexSet LeafIndexSet
type of leaf index set
Definition: geometrygrid/grid.hh:159
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator LevelIterator
Definition: geometrygrid/grid.hh:680
const LevelIndexSet & levelIndexSet(int level) const
Definition: geometrygrid/grid.hh:374
traits structure containing types for a codimension
Definition: geometrygrid/grid.hh:121
Traits::LeafIntersectionIterator LeafIntersectionIterator
iterator over intersections with other entities on the leaf level
Definition: geometrygrid/grid.hh:131
Definition: geometrygrid/entity.hh:58
const HostGrid & hostGrid() const
obtain constant reference to the host grid
Definition: geometrygrid/grid.hh:548
const GlobalIdSet & globalIdSet() const
Definition: geometrygrid/grid.hh:358
Traits::GlobalIdSet GlobalIdSet
type of global id set
Definition: geometrygrid/grid.hh:181
const LeafIndexSet & leafIndexSet() const
Definition: geometrygrid/grid.hh:390
GridFamily::Traits Traits
type of the grid traits
Definition: geometrygrid/grid.hh:112
Definition: geometrygrid/backuprestore.hh:21
grid wrapper replacing the geometriesGeometryGrid wraps another DUNE grid and replaces its geometry b...
Definition: declaration.hh:10
Definition: idset.hh:18
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
GridFamily::Traits::LevelGridView LevelGridView
type of view for level grid
Definition: geometrygrid/grid.hh:143
LevelGridView levelGridView(int level) const
View for a grid level.
Definition: geometrygrid/grid.hh:529
int size(int codim) const
obtain number of leaf entities
Definition: geometrygrid/grid.hh:321
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:75
Definition: geometrygrid/entity.hh:55
~GeometryGrid()
destructor
Definition: geometrygrid/grid.hh:270
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &seed) const
obtain Entity from EntitySeed
Definition: geometrygrid/grid.hh:517
GridFamily::Traits::LeafGridView LeafGridView
type of view for leaf grid
Definition: geometrygrid/grid.hh:141
Definition: geometrygrid/geometry.hh:86
Traits::template Codim< codim >::Geometry Geometry
type of world geometry
Definition: geometrygrid/grid.hh:655
Partition< All_Partition >::LevelIterator LevelIterator
type of level iterator
Definition: geometrygrid/grid.hh:699
Definition: geometrygrid/intersection.hh:19
GeometryGrid(HostGrid *hostGrid, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:259
Definition: identity.hh:12
size_t numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: geometrygrid/grid.hh:352
HostGrid::ctype ctype
field type of the coordinate vector
Definition: coordfunction.hh:52
Traits::LevelIntersectionIterator LevelIntersectionIterator
iterator over intersections with other entities on the same level
Definition: geometrygrid/grid.hh:133
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:16
Definition: geometrygrid/gridfamily.hh:32
CoordFunction & coordFunction()
obtain mutable reference to the coordinate function.
Definition: geometrygrid/grid.hh:590
Definition: geometrygrid/grid.hh:24
void postAdapt()
Definition: geometrygrid/grid.hh:426
GeometryType
Type representing VTK&#39;s entity geometry types.
Definition: common.hh:178
bool adapt()
Definition: geometrygrid/grid.hh:419
Definition: geometrygrid/gridview.hh:27
int size(int level, int codim) const
obtain number of entites on a level
Definition: geometrygrid/grid.hh:310
Definition: geometrygrid/datahandle.hh:23
provides access to host grid objects from GeometryGrid
Definition: identitygrid.hh:36
Store a reference to an entity with a minimal memory footprint.
Definition: common/entityseed.hh:23
bool mark(int refCount, const typename Codim< 0 >::Entity &entity)
Definition: geometrygrid/grid.hh:404
Definition: geometrygrid/grid.hh:673
LeafGridView leafGridView() const
View for the leaf grid.
Definition: geometrygrid/grid.hh:536
Traits::CollectiveCommunication CollectiveCommunication
communicator with all other processes having some part of the grid
Definition: geometrygrid/grid.hh:209
GeometryGrid(HostGrid *hostGrid, CoordFunction *coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:242
Partition< All_Partition >::LeafIterator LeafIterator
type of leaf iterator
Definition: geometrygrid/grid.hh:690
void * allocateStorage(std::size_t size) const
Definition: geometrygrid/grid.hh:602
Traits::template Codim< codim >::Entity Entity
type of entity
Definition: geometrygrid/grid.hh:640
actual implementation of the entity
Definition: geometrygrid/entity.hh:32
Definition: common/geometry.hh:24
Definition: geometrygrid/gridfamily.hh:48
void update()
update grid caches
Definition: geometrygrid/grid.hh:567
Traits::LocalIdSet LocalIdSet
type of local id set
Definition: geometrygrid/grid.hh:198
const CollectiveCommunication & comm() const
obtain CollectiveCommunication object
Definition: geometrygrid/grid.hh:442
bool preAdapt()
Definition: geometrygrid/grid.hh:414
int getMark(const typename Codim< 0 >::Entity &entity) const
Definition: geometrygrid/grid.hh:409
int size(int level, GeometryType type) const
obtain number of entites on a level
Definition: geometrygrid/grid.hh:334
GeometryGrid(HostGrid &hostGrid, CoordFunction &coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: geometrygrid/grid.hh:225
Different resources needed by all grid implementations.
int maxLevel() const
obtain maximal grid level
Definition: geometrygrid/grid.hh:297
void deallocateStorage(void *p, std::size_t size) const
Definition: geometrygrid/grid.hh:607
int size(GeometryType type) const
obtain number of leaf entities
Definition: geometrygrid/grid.hh:343
Traits::LevelIndexSet LevelIndexSet
type of level index set
Definition: geometrygrid/grid.hh:169
Traits::HierarchicIterator HierarchicIterator
iterator over the grid hierarchy
Definition: geometrygrid/grid.hh:129
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:809
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator LeafIterator
Definition: geometrygrid/grid.hh:677
Traits::template Codim< codim >::LocalGeometry LocalGeometry
type of local geometry
Definition: geometrygrid/grid.hh:665
Definition: geometrygrid/indexsets.hh:25
HostGrid & hostGrid()
obtain mutable reference to the host grid
Definition: geometrygrid/grid.hh:554
static void adapt(CoordFunctionInterface &coordFunction)
Definition: coordfunction.hh:321
void globalRefine(int refCount)
Definition: geometrygrid/grid.hh:398