dune-grid-dev-howto
2.1.1
|
00001 #ifndef DUNE_IDENTITYGRID_INTERSECTIONITERATOR_HH 00002 #define DUNE_IDENTITYGRID_INTERSECTIONITERATOR_HH 00003 00004 #include "identitygridintersections.hh" 00005 #include "identitygridentity.hh" 00006 00007 #include <dune/grid/common/intersection.hh> 00008 00013 namespace Dune { 00014 00023 template<class GridImp> 00024 class IdentityGridLeafIntersectionIterator 00025 { 00026 00027 enum {dim=GridImp::dimension}; 00028 00029 enum {dimworld=GridImp::dimensionworld}; 00030 00031 // The type used to store coordinates 00032 typedef typename GridImp::ctype ctype; 00033 00034 typedef typename GridImp::HostGridType::template Codim<0>::Entity::LeafIntersectionIterator HostLeafIntersectionIterator; 00035 00036 public: 00037 00038 typedef Dune::Intersection<const GridImp, Dune::IdentityGridLeafIntersection> Intersection; 00039 00040 IdentityGridLeafIntersectionIterator(const GridImp* identityGrid, 00041 const HostLeafIntersectionIterator& hostIterator) 00042 : intersection_(IdentityGridLeafIntersection<GridImp>(identityGrid, hostIterator)) 00043 {} 00044 00046 ~IdentityGridLeafIntersectionIterator() {}; 00047 00049 bool equals(const IdentityGridLeafIntersectionIterator<GridImp>& other) const { 00050 return GridImp::getRealImplementation(intersection_).hostIterator_ 00051 == GridImp::getRealImplementation(other.intersection_).hostIterator_; 00052 } 00053 00054 00056 void increment() { 00057 ++GridImp::getRealImplementation(intersection_).hostIterator_; 00058 00059 // Delete intersection geometry objects, if present 00060 if (GridImp::getRealImplementation(intersection_).intersectionGlobal_ != NULL) { 00061 delete GridImp::getRealImplementation(intersection_).intersectionGlobal_; 00062 GridImp::getRealImplementation(intersection_).intersectionGlobal_ = NULL; 00063 } 00064 00065 if (GridImp::getRealImplementation(intersection_).selfLocal_ != NULL) { 00066 delete GridImp::getRealImplementation(intersection_).selfLocal_; 00067 GridImp::getRealImplementation(intersection_).selfLocal_ = NULL; 00068 } 00069 00070 if (GridImp::getRealImplementation(intersection_).neighborLocal_ != NULL) { 00071 delete GridImp::getRealImplementation(intersection_).neighborLocal_; 00072 GridImp::getRealImplementation(intersection_).neighborLocal_ = NULL; 00073 } 00074 } 00075 00077 const Intersection & dereference() const { 00078 return intersection_; 00079 } 00080 00081 private: 00082 //********************************************************** 00083 // private data 00084 //********************************************************** 00085 00088 mutable MakeableInterfaceObject<Intersection> intersection_; 00089 }; 00090 00091 00092 00093 00095 template<class GridImp> 00096 class IdentityGridLevelIntersectionIterator 00097 { 00098 enum {dim=GridImp::dimension}; 00099 00100 enum {dimworld=GridImp::dimensionworld}; 00101 00102 // The type used to store coordinates 00103 typedef typename GridImp::ctype ctype; 00104 00105 typedef typename GridImp::HostGridType::template Codim<0>::Entity::LevelIntersectionIterator HostLevelIntersectionIterator; 00106 00107 public: 00108 00109 typedef Dune::Intersection<const GridImp, Dune::IdentityGridLevelIntersection> Intersection; 00110 00111 IdentityGridLevelIntersectionIterator(const GridImp* identityGrid, 00112 const HostLevelIntersectionIterator& hostIterator) 00113 : intersection_(IdentityGridLevelIntersection<GridImp>(identityGrid,hostIterator)) 00114 {} 00115 00117 bool equals(const IdentityGridLevelIntersectionIterator<GridImp>& other) const { 00118 return GridImp::getRealImplementation(intersection_).hostIterator_ == GridImp::getRealImplementation(other.intersection_).hostIterator_; 00119 } 00120 00121 00123 void increment() { 00124 ++GridImp::getRealImplementation(intersection_).hostIterator_; 00125 00126 // Delete intersection geometry objects, if present 00127 if (GridImp::getRealImplementation(intersection_).intersectionGlobal_ != NULL) { 00128 delete GridImp::getRealImplementation(intersection_).intersectionGlobal_; 00129 GridImp::getRealImplementation(intersection_).intersectionGlobal_ = NULL; 00130 } 00131 00132 if (GridImp::getRealImplementation(intersection_).selfLocal_ != NULL) { 00133 delete GridImp::getRealImplementation(intersection_).selfLocal_; 00134 GridImp::getRealImplementation(intersection_).selfLocal_ = NULL; 00135 } 00136 00137 if (GridImp::getRealImplementation(intersection_).neighborLocal_ != NULL) { 00138 delete GridImp::getRealImplementation(intersection_).neighborLocal_; 00139 GridImp::getRealImplementation(intersection_).neighborLocal_ = NULL; 00140 } 00141 00142 } 00143 00145 const Intersection & dereference() const { 00146 return intersection_; 00147 } 00148 00149 private: 00150 00153 mutable MakeableInterfaceObject<Intersection> intersection_; 00154 00155 }; 00156 00157 00158 } // namespace Dune 00159 00160 #endif