Dune Core Modules (2.5.0)

grid.hh
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
7
9
10#include <dune/grid/geometrygrid/backuprestore.hh>
11#include <dune/grid/geometrygrid/capabilities.hh>
12#include <dune/grid/geometrygrid/datahandle.hh>
13#include <dune/grid/geometrygrid/gridfamily.hh>
14#include <dune/grid/geometrygrid/identity.hh>
15#include <dune/grid/geometrygrid/persistentcontainer.hh>
16
17namespace Dune
18{
19
20 // DefaultCoordFunction
21 // --------------------
22
23 template< class HostGrid >
24 class DefaultCoordFunction
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 > >
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,
87 GeoGrid::GridFamily< HostGrid, CoordFunction, Allocator > >
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:
105 typedef GeoGrid::GridFamily< HostGrid, CoordFunction, Allocator > GridFamily;
112 typedef typename GridFamily::Traits Traits;
113
120 template< int codim >
121 struct Codim;
122
129 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
206 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
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
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
650 GeoGrid::AdaptCoordFunction< typename CoordFunction::Interface >::adapt( coordFunction() );
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
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 >
756 ::template Partition< pitype >::LeafIterator
758 typedef typename Traits::template Codim< codim >
759 ::template Partition< pitype >::LevelIterator
761 };
762
770 typedef typename Partition< All_Partition >::LeafIterator LeafIterator;
771
779 typedef typename Partition< All_Partition >::LevelIterator LevelIterator;
780
782 };
783
784} // namespace Dune
785
786#endif // #ifndef DUNE_GEOGRID_GRID_HH
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:73
Store a reference to an entity with a minimal memory footprint.
Definition: entityseed.hh:24
actual implementation of the entity
Definition: entity.hh:32
grid wrapper replacing the geometries
Definition: grid.hh:82
int maxLevel() const
obtain maximal grid level
Definition: grid.hh:297
CoordFunction & coordFunction()
obtain mutable reference to the coordinate function.
Definition: grid.hh:670
static std::conditional< std::is_reference< InterfaceType >::value, typenamestd::add_lvalue_reference< typenameReturnImplementationType< typenamestd::remove_reference< InterfaceType >::type >::ImplementationType >::type, typenamestd::remove_const< typenameReturnImplementationType< typenamestd::remove_reference< InterfaceType >::type >::ImplementationType >::type >::type getRealImplementation(InterfaceType &&i)
return real implementation of interface class
Definition: grid.hh:1115
int size(int codim) const
obtain number of leaf entities
Definition: grid.hh:321
int size(int level, GeometryType type) const
obtain number of entites on a level
Definition: grid.hh:334
const CoordFunction & coordFunction() const
obtain constant reference to the coordinate function
Definition: grid.hh:667
LeafGridView leafGridView() const
View for the leaf grid.
Definition: grid.hh:616
Traits::LevelIntersectionIterator LevelIntersectionIterator
iterator over intersections with other entities on the same level
Definition: grid.hh:133
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &seed) const
obtain Entity from EntitySeed
Definition: grid.hh:597
LevelGridView levelGridView(int level) const
View for a grid level.
Definition: grid.hh:609
int size(int level, int codim) const
obtain number of entites on a level
Definition: grid.hh:310
Traits::LeafIndexSet LeafIndexSet
type of leaf index set
Definition: grid.hh:159
GeometryGrid(HostGrid *hostGrid, CoordFunction *coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: grid.hh:242
GeometryGrid(HostGrid *hostGrid, const Allocator &allocator=Allocator())
constructor
Definition: grid.hh:259
Traits::HierarchicIterator HierarchicIterator
iterator over the grid hierarchy
Definition: grid.hh:129
const HostGrid & hostGrid() const
obtain constant reference to the host grid
Definition: grid.hh:628
Traits::ctype ctype
type of vector coordinates (e.g., double)
Definition: grid.hh:206
GridFamily::Traits Traits
type of the grid traits
Definition: grid.hh:112
~GeometryGrid()
destructor
Definition: grid.hh:270
int overlapSize(int codim) const
obtain size of overlap region for the leaf grid
Definition: grid.hh:438
GridFamily::Traits::LevelGridView LevelGridView
type of view for level grid
Definition: grid.hh:143
HostGrid & hostGrid()
obtain mutable reference to the host grid
Definition: grid.hh:634
void communicate(CommDataHandleIF< DataHandle, Data > &dataHandle, InterfaceType interface, CommunicationDirection direction) const
communicate information on leaf entities
Definition: grid.hh:507
Traits::LevelIndexSet LevelIndexSet
type of level index set
Definition: grid.hh:169
int ghostSize(int level, int codim) const
obtain size of ghost region for a grid level
Definition: grid.hh:467
void communicate(CommDataHandleIF< DataHandle, Data > &dataHandle, InterfaceType interface, CommunicationDirection direction, int level) const
communicate information on a grid level
Definition: grid.hh:486
Traits::LocalIdSet LocalIdSet
type of local id set
Definition: grid.hh:198
Traits::GlobalIdSet GlobalIdSet
type of global id set
Definition: grid.hh:181
Traits::LeafIntersectionIterator LeafIntersectionIterator
iterator over intersections with other entities on the leaf level
Definition: grid.hh:131
int ghostSize(int codim) const
obtain size of ghost region for the leaf grid
Definition: grid.hh:447
GridFamily::Traits::LeafGridView LeafGridView
type of view for leaf grid
Definition: grid.hh:141
Traits::CollectiveCommunication CollectiveCommunication
communicator with all other processes having some part of the grid
Definition: grid.hh:209
size_t numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: grid.hh:352
int size(GeometryType type) const
obtain number of leaf entities
Definition: grid.hh:343
GeometryGrid(HostGrid &hostGrid, CoordFunction &coordFunction, const Allocator &allocator=Allocator())
constructor
Definition: grid.hh:225
void update()
update grid caches
Definition: grid.hh:647
int overlapSize(int level, int codim) const
obtain size of overlap region for a grid level
Definition: grid.hh:457
const CollectiveCommunication & comm() const
obtain CollectiveCommunication object
Definition: grid.hh:522
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:268
Definition: grid.hh:920
static std::conditional< std::is_reference< InterfaceType >::value, typenamestd::add_lvalue_reference< typenameReturnImplementationType< typenamestd::remove_reference< InterfaceType >::type >::ImplementationType >::type, typenamestd::remove_const< typenameReturnImplementationType< typenamestd::remove_reference< InterfaceType >::type >::ImplementationType >::type >::type getRealImplementation(InterfaceType &&i)
return real implementation of interface class
Definition: grid.hh:1115
Different resources needed by all grid implementations.
Definition of the DUNE_DEPRECATED macro for the case that config.h is not available.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:168
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:84
Dune namespace.
Definition: alignment.hh:11
Static tag representing a codimension.
Definition: dimension.hh:22
traits structure containing types for a codimension
Definition: grid.hh:712
Traits::template Codim< codim >::LocalGeometry LocalGeometry
type of local geometry
Definition: grid.hh:745
Partition< All_Partition >::LeafIterator LeafIterator
type of leaf iterator
Definition: grid.hh:770
Traits::template Codim< codim >::Entity Entity
type of entity
Definition: grid.hh:720
Partition< All_Partition >::LevelIterator LevelIterator
type of level iterator
Definition: grid.hh:779
Traits::template Codim< codim >::Geometry Geometry
type of world geometry
Definition: grid.hh:735
provides access to host grid objects from GeometryGrid
Definition: identitygrid.hh:36
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Nov 23, 23:29, 2024)