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
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
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