intersectioniterator.hh

00001 #ifndef DUNE_GRID_INTERSECTIONITERATOR_HH
00002 #define DUNE_GRID_INTERSECTIONITERATOR_HH
00003 
00004 #include <dune/common/iteratorfacades.hh>
00005 
00006 namespace Dune
00007 {
00008 
00177 template<class GridImp, template<class> class IntersectionIteratorImp>
00178 class IntersectionIterator
00179 {
00180   IntersectionIteratorImp<const GridImp> realIterator;
00181 
00182   enum { dim=GridImp::dimension };
00183   enum { dimworld=GridImp::dimensionworld };
00184 
00185 public:
00186   
00187   // type of real implementation 
00188   typedef IntersectionIteratorImp<const GridImp> ImplementationType;
00189   
00191   typedef typename GridImp::template Codim<0>::Entity Entity;
00192 
00194   typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
00195 
00197   typedef typename GridImp::template Codim<1>::Geometry Geometry;
00198 
00201   typedef typename GridImp::template Codim<1>::LocalGeometry LocalGeometry;
00202 
00204   typedef IntersectionIterator<GridImp, IntersectionIteratorImp> Intersection;
00205 
00207   enum { dimension=dim  };
00208 
00210   enum { dimensionworld=dimworld  };
00211 
00213   typedef typename GridImp::ctype ctype;
00214 
00215   //=============================================================
00216   // Dereferencing to keep compatiblity with upcomming versions
00217   //=============================================================
00218     
00220   const Intersection & operator*() const { return *this; }
00221   
00223   const Intersection * operator->() const { return this; }
00224 
00225   //=============================================================
00226 
00228   IntersectionIterator& operator++()
00229     {
00230       this->realIterator.increment();
00231       return *this;
00232     }
00233   
00235   bool boundary () const
00236     {
00237       return this->realIterator.boundary();
00238     }
00239 
00254   int boundaryId () const
00255   {
00256     return this->realIterator.boundaryId();
00257   } 
00258 
00260   bool neighbor () const 
00261     {
00262       return this->realIterator.neighbor();
00263     }
00264 
00268   EntityPointer inside() const
00269     {
00270       return this->realIterator.inside();
00271     }
00272 
00279   EntityPointer outside() const
00280     {
00281       return this->realIterator.outside();
00282     }
00283   
00291   const LocalGeometry& intersectionSelfLocal () const
00292     {
00293       return this->realIterator.intersectionSelfLocal();
00294     }
00302   const LocalGeometry& intersectionNeighborLocal () const
00303     {
00304       return this->realIterator.intersectionNeighborLocal();
00305     }
00306 
00312   const Geometry& intersectionGlobal () const
00313     {
00314       return this->realIterator.intersectionGlobal();
00315     }
00316 
00318   int numberInSelf () const
00319     {
00320       return this->realIterator.numberInSelf ();
00321     }
00322 
00324   int numberInNeighbor () const
00325     {
00326       return this->realIterator.numberInNeighbor ();
00327     }
00328 
00333   FieldVector<ctype, dimworld> outerNormal (const FieldVector<ctype, dim-1>& local) const
00334     {
00335       return this->realIterator.outerNormal(local);
00336     }
00337 
00344   FieldVector<ctype, dimworld> integrationOuterNormal (const FieldVector<ctype, dim-1>& local) const
00345     {
00346       return this->realIterator.integrationOuterNormal(local);
00347     }
00348 
00354   FieldVector<ctype, dimworld> unitOuterNormal (const FieldVector<ctype, dim-1>& local) const
00355     {
00356       return this->realIterator.unitOuterNormal(local);
00357     }
00358 
00364   bool operator==(const IntersectionIterator& rhs) const
00365     {
00366       return rhs.equals(*this);
00367     }
00368 
00374   bool operator!=(const IntersectionIterator& rhs) const
00375     {
00376       return ! rhs.equals(*this);
00377     }
00378 
00379 
00380   //===========================================================
00384   //===========================================================
00385 
00387   bool equals(const IntersectionIterator& rhs) const
00388     {
00389       return this->realIterator.equals(rhs.realIterator);
00390     }
00391 
00393   IntersectionIterator(const IntersectionIteratorImp<const GridImp> & i) :
00394     realIterator(i) {};
00395 
00397   IntersectionIterator(const IntersectionIterator& i) :
00398     realIterator(i.realIterator) {}
00400 
00401   typedef typename remove_const<GridImp>::type mutableGridImp;
00402 protected:
00403   // give the GridDefaultImplementation class access to the realImp 
00404   friend class GridDefaultImplementation<
00405             GridImp::dimension, GridImp::dimensionworld,
00406             typename GridImp::ctype,
00407             typename GridImp::GridFamily> ;
00408 
00410   ImplementationType & getRealImp() { return realIterator; }
00412   const ImplementationType & getRealImp() const { return realIterator; }
00413 
00414 };
00415 
00416 //**********************************************************************
00422 template<class GridImp, template<class> class IntersectionIteratorImp>
00423 class IntersectionIteratorDefaultImplementation
00424 {
00425   enum { dim=GridImp::dimension };
00426   enum { dimworld=GridImp::dimensionworld };
00427   typedef typename GridImp::ctype ct;
00428 public:
00432   FieldVector<ct, dimworld> integrationOuterNormal (const FieldVector<ct, dim-1>& local) const
00433     {
00434         FieldVector<ct, dimworld> n = unitOuterNormal(local);
00435         n *= asImp().intersectionGlobal().integrationElement(local);
00436         return n;
00437     }
00439   FieldVector<ct, dimworld> unitOuterNormal (const FieldVector<ct, dim-1>& local) const
00440     {
00441       FieldVector<ct, dimworld> n = asImp().outerNormal(local);
00442       n /= n.two_norm();
00443       return n;
00444     }
00445 
00446 private:
00448   IntersectionIteratorImp<GridImp>& asImp ()
00449     {return static_cast<IntersectionIteratorImp<GridImp>&>(*this);}
00450   const IntersectionIteratorImp<GridImp>& asImp () const
00451     {return static_cast<const IntersectionIteratorImp<GridImp>&>(*this);}
00452 };
00453 
00454 }
00455 
00456 #endif // DUNE_GRID_INTERSECTIONITERATOR_HH

Generated on 9 Apr 2008 with Doxygen (ver 1.5.2) [logfile].