1#ifndef DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH 
    2#define DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH 
    4#include <dune/common/fvector.hh> 
    5#include <dune/grid/multidomaingrid/hostgridaccessor.hh> 
    6#include <dune/grid/multidomaingrid/subdomaininterfaceiterator.hh> 
   13template<
typename Gr
idImp>
 
   14class LeafAllSubDomainInterfacesIterator;
 
   16template<
typename Gr
idImp>
 
   17class LevelAllSubDomainInterfacesIterator;
 
   19template<
typename SubDomainSet>
 
   20class AllInterfacesController
 
   23  template<
typename GridImp,
 
   25           typename HostGridView,
 
   26           typename IntersectionController
 
   28  friend class SubDomainInterface;
 
   30  template<
typename GridImp,
 
   32           typename HostGridView,
 
   33           typename IntersectionController
 
   35  friend class SubDomainInterfaceIterator;
 
   37  template<
typename Gr
idImp>
 
   38  friend class LeafAllSubDomainInterfacesIterator;
 
   40  template<
typename Gr
idImp>
 
   41  friend class LevelAllSubDomainInterfacesIterator;
 
   43  typedef typename SubDomainSet::SubDomainIndex SubDomainIndex;
 
   44  typedef typename SubDomainSet::Iterator SubDomainIterator;
 
   46  template<
typename Iterator>
 
   47  bool calculateInterfacingSubDomains(Iterator& it)
 
   49    const typename Iterator::HostIntersectionIterator::Intersection::Entity outside = it._hostIntersectionIterator->outside();
 
   50    const SubDomainSet& subDomains2 = it._gridView.indexSet().subDomainsForHostEntity(outside);
 
   51    _interfacingSubDomains1.difference(*_subDomains1,subDomains2);
 
   52    _interfacingSubDomains2.difference(subDomains2,*_subDomains1);
 
   53    _subDomain1Iterator = _interfacingSubDomains1.begin();
 
   54    _subDomain1End = _interfacingSubDomains1.end();
 
   55    _subDomain2Iterator = _interfacingSubDomains2.begin();
 
   56    _subDomain2End = _interfacingSubDomains2.end();
 
   57    return !(_interfacingSubDomains1.empty() || _interfacingSubDomains2.empty());
 
   60  template<
typename Iterator>
 
   61  void incrementToNextValidPosition(Iterator& it) {
 
   62    if (_subDomain2Iterator != _subDomain2End) {
 
   65    ++_subDomain1Iterator;
 
   66    if (_subDomain1Iterator != _subDomain1End) {
 
   67      _subDomain2Iterator = _interfacingSubDomains2.begin();
 
   70    incrementToNextValidIntersection(it);
 
   73  template<
typename Iterator>
 
   74  bool incrementToNextValidIntersection(Iterator& it)
 
   78        ++it._hostIntersectionIterator;
 
   79        if (it._hostIntersectionIterator != it._hostIntersectionEnd)
 
   81        if (it._hostIntersectionIterator->neighbor() &&
 
   82            calculateInterfacingSubDomains(it))
 
   86      if (it._hostIterator == it._hostEnd)
 
   88      it._hostCell = *it._hostIterator;
 
   89      _subDomains1 = &it._gridView.indexSet().subDomainsForHostEntity(it._hostCell);
 
   90      it._hostIntersectionIterator = it._hostGridView.ibegin(it._hostCell);
 
   91      it._hostIntersectionEnd = it._hostGridView.iend(it._hostCell);
 
   92      if (it._hostIntersectionIterator->neighbor() &&
 
   93          calculateInterfacingSubDomains(it))
 
   98  template<
typename Iterator>
 
   99  void increment(Iterator& it) {
 
  100    ++_subDomain2Iterator;
 
  101    incrementToNextValidPosition(it);
 
  104  template<
typename Iterator>
 
  105  void incrementToStartPosition(Iterator& it)
 
  107    if (it._hostIterator != it._hostEnd) {
 
  108      it._hostCell = *it._hostIterator;
 
  109      _subDomains1 = &it._gridView.indexSet().subDomainsForHostEntity(it._hostCell);
 
  110      if (!it._hostIntersectionIterator->neighbor() || !calculateInterfacingSubDomains(it))
 
  111        incrementToNextValidIntersection(it);
 
  115  AllInterfacesController()
 
  116    : _subDomain1Iterator(_interfacingSubDomains1.end())
 
  117    , _subDomain2Iterator(_interfacingSubDomains2.end())
 
  118    , _subDomain1End(_subDomain1Iterator)
 
  119    , _subDomain2End(_subDomain2Iterator)
 
  122  SubDomainIndex subDomain1()
 const 
  124    return *_subDomain1Iterator;
 
  127  SubDomainIndex subDomain2()
 const 
  129    return *_subDomain2Iterator;
 
  132  const SubDomainSet* _subDomains1;
 
  133  SubDomainSet _interfacingSubDomains1;
 
  134  SubDomainSet _interfacingSubDomains2;
 
  135  SubDomainIterator _subDomain1Iterator;
 
  136  SubDomainIterator _subDomain2Iterator;
 
  137  SubDomainIterator _subDomain1End;
 
  138  SubDomainIterator _subDomain2End;
 
  142template<
typename Gr
idImp>
 
  143class LeafAllSubDomainInterfacesIterator :
 
  144    public SubDomainInterfaceIterator<GridImp,
 
  145                                      typename GridImp::LeafGridView,
 
  146                                      typename detail::HostGridAccessor<GridImp>::Type::LeafGridView,
 
  147                                      AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet>
 
  151  template<
typename, 
typename, 
typename, 
typename>
 
  152  friend class SubDomainInterfaceIterator;
 
  154  template<
int, 
int, 
typename>
 
  155  friend class EntityWrapper;
 
  157  template<
typename,
typename>
 
  158  friend class MultiDomainGrid;
 
  160  typedef AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet> Controller;
 
  162  typedef SubDomainInterfaceIterator<GridImp,
 
  163                                     typename GridImp::LeafGridView,
 
  164                                     typename GridImp::HostGrid::LeafGridView,
 
  168  LeafAllSubDomainInterfacesIterator(
const GridImp& grid, 
bool end=
false) :
 
  169    Base(grid.leafGridView(),grid.hostGrid().leafGridView(),Controller(),end)
 
  175template<
typename Gr
idImp>
 
  176class LevelAllSubDomainInterfacesIterator :
 
  177    public SubDomainInterfaceIterator<GridImp,
 
  178                                      typename GridImp::LevelGridView,
 
  179                                      typename detail::HostGridAccessor<GridImp>::Type::LevelGridView,
 
  180                                      AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet>
 
  184  template<
typename, 
typename, 
typename, 
typename>
 
  185  friend class SubDomainInterfaceIterator;
 
  187  template<
int, 
int, 
typename>
 
  188  friend class EntityWrapper;
 
  190  template<
typename,
typename>
 
  191  friend class MultiDomainGrid;
 
  193  typedef AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet> Controller;
 
  195  typedef SubDomainInterfaceIterator<GridImp,
 
  196                                     typename GridImp::LevelGridView,
 
  197                                     typename GridImp::HostGrid::LevelGridView,
 
  201  LevelAllSubDomainInterfacesIterator(
const GridImp& grid, 
int level, 
bool end=
false) :
 
  202    Base(grid.levelGridView(level),grid.hostGrid().levelGridView(level),Controller(),end)