dune-grid-dev-howto
2.1.1
|
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