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