intersectioniterator.hh
00001 #ifndef DUNE_GRID_INTERSECTIONITERATOR_HH
00002 #define DUNE_GRID_INTERSECTIONITERATOR_HH
00003
00004 #include <dune/common/iteratorfacades.hh>
00005
00006 #include <dune/grid/common/intersection.hh>
00007
00008 namespace Dune
00009 {
00010
00087 template<class GridImp, template<class> class IntersectionIteratorImp, template<class> class IntersectionImp>
00088 class IntersectionIterator
00089 {
00090 IntersectionIteratorImp<const GridImp> realIterator;
00091
00092 enum { dim=GridImp::dimension };
00093 enum { dimworld=GridImp::dimensionworld };
00094
00095 public:
00096
00097
00098 typedef IntersectionIteratorImp<const GridImp> ImplementationType;
00099
00101 typedef typename GridImp::template Codim<0>::Entity Entity;
00102
00104 typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
00105
00107 typedef Dune::Intersection< const GridImp, IntersectionImp > Intersection;
00108
00110 typedef typename GridImp::template Codim<1>::Geometry Geometry;
00111
00114 typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
00115
00117 enum { dimension=dim };
00118
00120 enum { dimensionworld=dimworld };
00121
00123 typedef typename GridImp::ctype ctype;
00124
00125
00129
00130
00132 const Intersection & operator*() const
00133 {
00134 return this->realIterator.dereference();
00135 }
00136
00138 const Intersection * operator->() const
00139 {
00140 return & this->realIterator.dereference();
00141 }
00143
00144
00145
00149
00150
00156 bool operator==(const IntersectionIterator& rhs) const
00157 {
00158 return rhs.equals(*this);
00159 }
00160
00166 bool operator!=(const IntersectionIterator& rhs) const
00167 {
00168 return ! rhs.equals(*this);
00169 }
00171
00173 IntersectionIterator& operator++()
00174 {
00175 this->realIterator.increment();
00176 return *this;
00177 }
00178
00179
00183
00184
00186 bool boundary () const DUNE_DEPRECATED
00187 {
00188 return (*this)->boundary();
00189 }
00190
00205 int boundaryId () const DUNE_DEPRECATED
00206 {
00207 return (*this)->boundaryId();
00208 }
00209
00211 bool neighbor () const DUNE_DEPRECATED
00212 {
00213 return (*this)->neighbor();
00214 }
00215
00219 EntityPointer inside() const DUNE_DEPRECATED
00220 {
00221 return (*this)->inside();
00222 }
00223
00230 EntityPointer outside() const DUNE_DEPRECATED
00231 {
00232 return (*this)->outside();
00233 }
00234
00242 const LocalGeometry& intersectionSelfLocal () const DUNE_DEPRECATED
00243 {
00244 return (*this)->intersectionSelfLocal();
00245 }
00253 const LocalGeometry& intersectionNeighborLocal () const DUNE_DEPRECATED
00254 {
00255 return (*this)->intersectionNeighborLocal();
00256 }
00257
00263 const Geometry& intersectionGlobal () const DUNE_DEPRECATED
00264 {
00265 return (*this)->intersectionGlobal();
00266 }
00267
00269 int numberInSelf () const DUNE_DEPRECATED
00270 {
00271 return (*this)->numberInSelf();
00272 }
00273
00275 int numberInNeighbor () const DUNE_DEPRECATED
00276 {
00277 return (*this)->numberInNeighbor();
00278 }
00279
00284 FieldVector<ctype, dimworld> outerNormal (const FieldVector<ctype, dim-1>& local) const DUNE_DEPRECATED
00285 {
00286 return (*this)->outerNormal( local );
00287 }
00288
00295 FieldVector<ctype, dimworld> integrationOuterNormal (const FieldVector<ctype, dim-1>& local) const DUNE_DEPRECATED
00296 {
00297 return (*this)->integrationOuterNormal( local );
00298 }
00299
00305 FieldVector<ctype, dimworld> unitOuterNormal (const FieldVector<ctype, dim-1>& local) const DUNE_DEPRECATED
00306 {
00307 return (*this)->unitOuterNormal( local );
00308 }
00310
00311
00315
00316
00318 bool equals(const IntersectionIterator& rhs) const
00319 {
00320 return this->realIterator.equals(rhs.realIterator);
00321 }
00322
00324 IntersectionIterator(const IntersectionIteratorImp<const GridImp> & i) :
00325 realIterator(i) {};
00326
00328 IntersectionIterator(const IntersectionIterator& i) :
00329 realIterator(i.realIterator) {}
00331
00332 typedef typename remove_const<GridImp>::type mutableGridImp;
00333 protected:
00334
00335 friend class GridDefaultImplementation<
00336 GridImp::dimension, GridImp::dimensionworld,
00337 typename GridImp::ctype,
00338 typename GridImp::GridFamily> ;
00339
00341 ImplementationType & getRealImp() { return realIterator; }
00343 const ImplementationType & getRealImp() const { return realIterator; }
00344
00345 };
00346
00347 }
00348
00349 #include "intersection.hh"
00350
00351 namespace Dune {
00352
00353 template<class GridImp, template<class> class IntersectionAndIteratorImp>
00354 class IntersectionIteratorDefaultImplementation
00355 {
00356 enum { dim=GridImp::dimension };
00357 enum { dimworld=GridImp::dimensionworld };
00358 typedef typename GridImp::ctype ct;
00359 public:
00361 IntersectionIteratorDefaultImplementation() DUNE_DEPRECATED {}
00362
00363 typedef Dune::Intersection<const GridImp, IntersectionAndIteratorImp> Intersection;
00364 typedef IntersectionAndIteratorImp<const GridImp> ImplementationType;
00368 FieldVector<ct, dimworld> integrationOuterNormal (const FieldVector<ct, dim-1>& local) const
00369 {
00370 FieldVector<ct, dimworld> n = unitOuterNormal(local);
00371 n *= asImp().intersectionGlobal().integrationElement(local);
00372 return n;
00373 }
00375 FieldVector<ct, dimworld> unitOuterNormal (const FieldVector<ct, dim-1>& local) const
00376 {
00377 FieldVector<ct, dimworld> n = asImp().outerNormal(local);
00378 n /= n.two_norm();
00379 return n;
00380 }
00382 const Intersection & dereference() const
00383 {
00384 return reinterpret_cast<const Intersection&>(*this);
00385 }
00386 private:
00388 ImplementationType& asImp ()
00389 {return static_cast<ImplementationType&>(*this);}
00390 const ImplementationType& asImp () const
00391 {return static_cast<const ImplementationType&>(*this);}
00392 } DUNE_DEPRECATED;
00393
00394 }
00395
00396 #endif // DUNE_GRID_INTERSECTIONITERATOR_HH