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   typedef typename GridImp::ctype ct;
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   enum { dimension=dim  };
00205 
00207   enum { dimensionworld=dimworld  };
00208 
00210   typedef ct ctype;
00211 
00213   IntersectionIterator& operator++()
00214     {
00215       this->realIterator.increment();
00216       return *this;
00217     }
00218   
00220   bool boundary () const
00221     {
00222       return this->realIterator.boundary();
00223     }
00224 
00239   int boundaryId () const
00240   {
00241     return this->realIterator.boundaryId();
00242   } 
00243 
00245   bool neighbor () const 
00246     {
00247       return this->realIterator.neighbor();
00248     }
00249 
00253   EntityPointer inside() const
00254     {
00255       return this->realIterator.inside();
00256     }
00257 
00264   EntityPointer outside() const
00265     {
00266       return this->realIterator.outside();
00267     }
00268   
00275   const LocalGeometry& intersectionSelfLocal () const
00276     {
00277       return this->realIterator.intersectionSelfLocal();
00278     }
00285   const LocalGeometry& intersectionNeighborLocal () const
00286     {
00287       return this->realIterator.intersectionNeighborLocal();
00288     }
00289 
00294   const Geometry& intersectionGlobal () const
00295     {
00296       return this->realIterator.intersectionGlobal();
00297     }
00298 
00300   int numberInSelf () const
00301     {
00302       return this->realIterator.numberInSelf ();
00303     }
00304 
00306   int numberInNeighbor () const
00307     {
00308       return this->realIterator.numberInNeighbor ();
00309     }
00310 
00317   FieldVector<ct, dimworld> outerNormal (const FieldVector<ct, dim-1>& local) const
00318     {
00319       return this->realIterator.outerNormal(local);
00320     }
00321 
00328   FieldVector<ct, dimworld> integrationOuterNormal (const FieldVector<ct, dim-1>& local) const
00329     {
00330       return this->realIterator.integrationOuterNormal(local);
00331     }
00332 
00338   FieldVector<ct, dimworld> unitOuterNormal (const FieldVector<ct, dim-1>& local) const
00339     {
00340       return this->realIterator.unitOuterNormal(local);
00341     }
00342 
00348   bool operator==(const IntersectionIterator& rhs) const
00349     {
00350       return rhs.equals(*this);
00351     }
00352 
00356   bool operator!=(const IntersectionIterator& rhs) const
00357     {
00358       return ! rhs.equals(*this);
00359     }
00360 
00361 
00362   //===========================================================
00366   //===========================================================
00367 
00369   bool equals(const IntersectionIterator& rhs) const
00370     {
00371       return this->realIterator.equals(rhs.realIterator);
00372     }
00373 
00375   IntersectionIterator(const IntersectionIteratorImp<const GridImp> & i) :
00376     realIterator(i) {};
00377 
00379   IntersectionIterator(const IntersectionIterator& i) :
00380     realIterator(i.realIterator) {}
00382 
00383   typedef typename RemoveConst<GridImp>::Type mutableGridImp;
00384 protected:
00385   // give the GridDefaultImplementation class access to the realImp 
00386   friend class GridDefaultImplementation<
00387             GridImp::dimension, GridImp::dimensionworld,
00388             typename GridImp::ctype,
00389             typename GridImp::GridFamily> ;
00390 
00392   ImplementationType & getRealImp() { return realIterator; }
00394   const ImplementationType & getRealImp() const { return realIterator; }
00395 
00396 };
00397 
00398 //**********************************************************************
00404 template<class GridImp, template<class> class IntersectionIteratorImp>
00405 class IntersectionIteratorDefaultImplementation
00406 {
00407   enum { dim=GridImp::dimension };
00408   enum { dimworld=GridImp::dimensionworld };
00409   typedef typename GridImp::ctype ct;
00410 public:
00414   FieldVector<ct, dimworld> integrationOuterNormal (const FieldVector<ct, dim-1>& local) const
00415     {
00416         FieldVector<ct, dimworld> n = unitOuterNormal(local);
00417         n *= asImp().intersectionGlobal().integrationElement(local);
00418         return n;
00419     }
00421   FieldVector<ct, dimworld> unitOuterNormal (const FieldVector<ct, dim-1>& local) const
00422     {
00423       FieldVector<ct, dimworld> n = asImp().outerNormal(local);
00424       n /= n.two_norm();
00425       return n;
00426     }
00427 
00428 private:
00430   IntersectionIteratorImp<GridImp>& asImp ()
00431     {return static_cast<IntersectionIteratorImp<GridImp>&>(*this);}
00432   const IntersectionIteratorImp<GridImp>& asImp () const
00433     {return static_cast<const IntersectionIteratorImp<GridImp>&>(*this);}
00434 };
00435 
00436 }
00437 
00438 #endif // DUNE_GRID_INTERSECTIONITERATOR_HH

Generated on 12 Dec 2007 with Doxygen (ver 1.5.1)