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   // type of real implementation 
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   // give the GridDefaultImplementation class access to the realImp 
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 } // namespace Dune
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 } // namespace Dune
00395 
00396 #endif // DUNE_GRID_INTERSECTIONITERATOR_HH

Generated on Sun Nov 15 22:28:42 2009 for dune-grid by  doxygen 1.5.6