dune-grid-dev-howto  2.2beta1
identitygrid.hh
Go to the documentation of this file.
00001 #ifndef DUNE_IDENTITYGRID_HH
00002 #define DUNE_IDENTITYGRID_HH
00003 
00008 #include <string>
00009 #include <map>
00010 
00011 #include <dune/common/collectivecommunication.hh>
00012 #include <dune/grid/common/capabilities.hh>
00013 #include <dune/grid/common/grid.hh>
00014 #include <dune/common/timer.hh>
00015 
00016 // The components of the Identitygrid interface
00017 #include "identitygrid/identitygridgeometry.hh"
00018 #include "identitygrid/identitygridentity.hh"
00019 #include "identitygrid/identitygridentitypointer.hh"
00020 #include "identitygrid/identitygridintersectioniterator.hh"
00021 #include "identitygrid/identitygridleveliterator.hh"
00022 #include "identitygrid/identitygridleafiterator.hh"
00023 #include "identitygrid/identitygridhierarchiciterator.hh"
00024 #include "identitygrid/identitygridindexsets.hh"
00025 
00026 namespace Dune {
00027 
00028 // Forward declaration
00029 template <class HostGrid>
00030 class IdentityGrid;
00031 
00032 
00033 // External forward declarations
00034 template< class Grid >
00035 class HostGridAccess;
00036 
00037 
00038 
00039 template<int dim, class HostGrid>
00040 struct IdentityGridFamily
00041 {
00042     typedef GridTraits<
00043         dim,
00044         HostGrid::dimensionworld,
00045         Dune::IdentityGrid<HostGrid>,
00046         IdentityGridGeometry,
00047         IdentityGridEntity,
00048         IdentityGridEntityPointer,
00049         IdentityGridLevelIterator,
00050         IdentityGridLeafIntersection,
00051         IdentityGridLevelIntersection,
00052         IdentityGridLeafIntersectionIterator,
00053         IdentityGridLevelIntersectionIterator,
00054         IdentityGridHierarchicIterator,
00055         IdentityGridLeafIterator,
00056         IdentityGridLevelIndexSet< const IdentityGrid<HostGrid> >,
00057         IdentityGridLeafIndexSet< const IdentityGrid<HostGrid> >,
00058         IdentityGridGlobalIdSet< const IdentityGrid<HostGrid> >,
00059         typename HostGrid::Traits::GlobalIdSet::IdType,
00060         IdentityGridLocalIdSet< const IdentityGrid<HostGrid> >,
00061         typename HostGrid::Traits::LocalIdSet::IdType,
00062         CollectiveCommunication<IdentityGrid<HostGrid> >
00063             > Traits;
00064 };
00065 
00066 
00067 
00068 
00069 //**********************************************************************
00070 //
00071 // --IdentityGrid
00072 //
00073 //**********************************************************************
00074 
00078 template <class HostGrid>
00079 class IdentityGrid :
00080         public GridDefaultImplementation  <HostGrid::dimension, HostGrid::dimensionworld, double, IdentityGridFamily<HostGrid::dimension,HostGrid> >
00081 {
00082     
00083     friend class IdentityGridLevelIndexSet<const IdentityGrid<HostGrid> >;
00084     friend class IdentityGridLeafIndexSet<const IdentityGrid<HostGrid> >;
00085     friend class IdentityGridGlobalIdSet<const IdentityGrid<HostGrid> >;
00086     friend class IdentityGridLocalIdSet<const IdentityGrid<HostGrid> >;
00087     friend class IdentityGridHierarchicIterator<const IdentityGrid<HostGrid> >;
00088     friend class IdentityGridLevelIntersectionIterator<const IdentityGrid<HostGrid> >;
00089     friend class IdentityGridLeafIntersectionIterator<const IdentityGrid<HostGrid> >;
00090 
00091     template<int codim, PartitionIteratorType pitype, class GridImp_>
00092     friend class IdentityGridLevelIterator;
00093 
00094     template<int codim, PartitionIteratorType pitype, class GridImp_>
00095     friend class IdentityGridLeafIterator;
00096     
00097     
00098     template<int codim_, int dim_, class GridImp_>
00099     friend class IdentityGridEntity;
00100 
00101     friend class HostGridAccess< IdentityGrid< HostGrid > >;
00102 
00103     public:
00104         
00106         typedef HostGrid HostGridType;
00107         
00108         //**********************************************************
00109         // The Interface Methods
00110         //**********************************************************
00111     
00113         typedef IdentityGridFamily<HostGrid::dimension,HostGrid>  GridFamily;
00114     
00116     typedef typename IdentityGridFamily<HostGrid::dimension,HostGrid>::Traits Traits;
00117     
00119         typedef typename HostGrid::ctype ctype;
00120     
00121         
00124         explicit IdentityGrid(HostGrid& hostgrid) :
00125             hostgrid_(&hostgrid),
00126             leafIndexSet_(*this),
00127             globalIdSet_(*this),
00128             localIdSet_(*this)
00129         {
00130             setIndices();
00131         }
00132     
00133         
00135         ~IdentityGrid()
00136         {
00137             // Delete level index sets
00138             for (size_t i=0; i<levelIndexSets_.size(); i++)
00139                 if (levelIndexSets_[i])
00140                     delete (levelIndexSets_[i]);
00141         }
00142         
00143         
00145         std::string name() const
00146         {
00147             return "IdentityGrid";
00148         }
00149     
00150         
00153         int maxLevel() const {
00154             return hostgrid_->maxLevel();
00155         }
00156         
00157         
00159         template<int codim>
00160         typename Traits::template Codim<codim>::LevelIterator lbegin (int level) const{
00161             return IdentityGridLevelIterator<codim,All_Partition, const IdentityGrid<HostGrid> >(this, level);
00162         }
00163     
00164         
00166         template<int codim>
00167         typename Traits::template Codim<codim>::LevelIterator lend (int level) const{
00168             return IdentityGridLevelIterator<codim,All_Partition, const IdentityGrid<HostGrid> >(this, level, true);
00169         }
00170         
00171         
00173         template<int codim, PartitionIteratorType PiType>
00174         typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lbegin (int level) const{
00175             return IdentityGridLevelIterator<codim,PiType, const IdentityGrid<HostGrid> >(this, level);
00176         }
00177         
00178 
00180         template<int codim, PartitionIteratorType PiType>
00181         typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lend (int level) const{
00182             return IdentityGridLevelIterator<codim,PiType, const IdentityGrid<HostGrid> >(this, level, true);
00183         }
00184         
00185     
00187         template<int codim>
00188         typename Traits::template Codim<codim>::LeafIterator leafbegin() const {
00189             return IdentityGridLeafIterator<codim,All_Partition, const IdentityGrid<HostGrid> >(this);
00190         }
00191         
00192     
00194         template<int codim>
00195         typename Traits::template Codim<codim>::LeafIterator leafend() const {
00196             return IdentityGridLeafIterator<codim,All_Partition, const IdentityGrid<HostGrid> >(this, true);
00197         }
00198         
00199     
00201         template<int codim, PartitionIteratorType PiType>
00202         typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafbegin() const {
00203             return IdentityGridLeafIterator<codim,PiType, const IdentityGrid<HostGrid> >(this);
00204         }
00205         
00206         
00208         template<int codim, PartitionIteratorType PiType>
00209         typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafend() const {
00210             return IdentityGridLeafIterator<codim,PiType, const IdentityGrid<HostGrid> >(this, true);
00211         }
00212         
00213 
00216         int size (int level, int codim) const {
00217             return hostgrid_->size(level,codim);        
00218         }
00219 
00222         size_t numBoundarySegments () const {
00223             return hostgrid_->numBoundarySegments();
00224         }
00225         
00227         int size (int codim) const{
00228             return leafIndexSet().size(codim);
00229         }
00230         
00231         
00233         int size (int level, GeometryType type) const {
00234             return levelIndexSets_[level]->size(type);
00235         }
00236         
00237             
00239         int size (GeometryType type) const
00240         {
00241             return leafIndexSet().size(type);
00242         }
00243         
00244         
00246         const typename Traits::GlobalIdSet& globalIdSet() const{
00247             return globalIdSet_;
00248         }
00249         
00250         
00252         const typename Traits::LocalIdSet& localIdSet() const{
00253             return localIdSet_;
00254         }
00255         
00256         
00258         const typename Traits::LevelIndexSet& levelIndexSet(int level) const
00259         {
00260             if (level<0 || level>maxLevel())
00261                 DUNE_THROW(GridError, "levelIndexSet of nonexisting level " << level << " requested!");
00262             return *levelIndexSets_[level];
00263         }
00264         
00265         
00267         const typename Traits::LeafIndexSet& leafIndexSet() const
00268         {
00269             return leafIndexSet_;
00270         }
00271         
00272         
00275         
00276         
00280         void globalRefine (int refCount)
00281         {
00282             hostgrid_->globalRefine(refCount);
00283         }
00284         
00295         bool mark(int refCount, const typename Traits::template Codim<0>::EntityPointer & e)
00296         {
00297             return hostgrid_->mark(refCount, *getHostEntityPointer<0>(*e));
00298         }
00299         
00304         int getMark(const typename Traits::template Codim<0>::EntityPointer & e) const
00305         {
00306             return hostgrid_->getMark(*getHostEntityPointer<0>(*e));
00307         }
00308 
00310         bool preAdapt() {
00311             return hostgrid_->preAdapt();
00312         }
00313         
00314         
00316         bool adapt()
00317         {
00318             return hostgrid_->adapt();
00319         }
00320 
00322         void postAdapt() {
00323             return hostgrid_->postAdapt();
00324         }
00325         
00329         unsigned int overlapSize(int codim) const {
00330             return hostgrid_->overlapSize(codim);
00331         }
00332         
00333         
00335         unsigned int ghostSize(int codim) const {
00336             return hostgrid_->ghostSize(codim);
00337         }
00338         
00339         
00341         unsigned int overlapSize(int level, int codim) const {
00342             return hostgrid_->overlapSize(level,codim);
00343         }
00344         
00345         
00347         unsigned int ghostSize(int level, int codim) const {
00348             return hostgrid_->ghostSize(level,codim);
00349         }
00350         
00351             
00352 #if 0
00353 
00358         void loadBalance(int strategy, int minlevel, int depth, int maxlevel, int minelement){
00359             DUNE_THROW(NotImplemented, "IdentityGrid::loadBalance()");
00360         }
00361         
00373         template<class T, template<class> class P, int codim>
00374         void communicate (T& t, InterfaceType iftype, CommunicationDirection dir, int level);
00375         
00380         template<class DataHandle>
00381         void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir, int level) const
00382         {}
00383         
00384         template<class DataHandle>
00385         void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const
00386         {}
00387 #endif
00388         
00389         
00391         const CollectiveCommunication<IdentityGrid>& comm () const
00392         {
00393             return ccobj;
00394         }
00395         
00396         
00397         // **********************************************************
00398         // End of Interface Methods
00399         // **********************************************************
00400         
00402         HostGridType& getHostGrid() const
00403         {
00404             return *hostgrid_;
00405         }
00406         
00407         
00409         template <int codim>
00410         typename HostGrid::Traits::template Codim<codim>::EntityPointer getHostEntityPointer(const typename Traits::template Codim<codim>::Entity& e) const
00411         {
00412             return getRealImplementation(e).hostEntity_;
00413         }
00414         
00415     protected:
00416         
00418         HostGrid* hostgrid_;
00419     
00420     private:
00421 
00423     void setIndices()
00424     {
00425             localIdSet_.update();
00426             
00427             globalIdSet_.update();
00428             
00429             // //////////////////////////////////////////
00430             //   Create the index sets
00431             // //////////////////////////////////////////
00432             for (int i=levelIndexSets_.size(); i<=maxLevel(); i++) {
00433                 IdentityGridLevelIndexSet<const IdentityGrid<HostGrid> >* p
00434                     = new IdentityGridLevelIndexSet<const IdentityGrid<HostGrid> >();
00435                 levelIndexSets_.push_back(p);
00436             }
00437             
00438             for (int i=0; i<=maxLevel(); i++)
00439                 if (levelIndexSets_[i])
00440                     levelIndexSets_[i]->update(*this, i);
00441             
00442             leafIndexSet_.update(*this);
00443             
00444         }
00445          
00447         CollectiveCommunication<IdentityGrid> ccobj;
00448         
00450         std::vector<IdentityGridLevelIndexSet<const IdentityGrid<HostGrid> >*> levelIndexSets_;
00451         
00453         IdentityGridLeafIndexSet<const IdentityGrid<HostGrid> > leafIndexSet_;
00454     
00456         IdentityGridGlobalIdSet<const IdentityGrid<HostGrid> > globalIdSet_;
00457     
00459         IdentityGridLocalIdSet<const IdentityGrid<HostGrid> > localIdSet_;
00460     
00461 }; // end Class IdentityGrid
00462 
00463 
00464 
00465 
00466 namespace Capabilities
00467 {
00469     template<class HostGrid, int codim>
00470     struct hasEntity< IdentityGrid<HostGrid>, codim>
00471     {
00472         static const bool v = hasEntity<HostGrid,codim>::v;
00473     };
00474     
00475     
00477     template<class HostGrid>
00478     struct isParallel< IdentityGrid<HostGrid> >
00479     {
00480         static const bool v = isParallel<HostGrid>::v;
00481     };
00482     
00483     
00486     template<class HostGrid>
00487     struct isLevelwiseConforming< IdentityGrid<HostGrid> >
00488     {
00489         static const bool v = isLevelwiseConforming<HostGrid>::v;
00490     };
00491 
00493     template<class HostGrid>
00494     struct isLeafwiseConforming< IdentityGrid<HostGrid> >
00495     {
00496         static const bool v = isLeafwiseConforming<HostGrid>::v;
00497     };
00498 }
00499 
00500 } // namespace Dune
00501 
00502 #endif