1#ifndef DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH 
    2#define DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH 
    4#include <dune/grid/multidomaingrid/hostgridaccessor.hh> 
    5#include <dune/grid/multidomaingrid/subdomaininterfaceiterator.hh> 
   11template<
typename Gr
idImp>
 
   12class LeafSubDomainInterfaceIterator;
 
   14template<
typename Gr
idImp>
 
   15class LevelSubDomainInterfaceIterator;
 
   17template<
typename SubDomainIndex>
 
   18class SubDomainToSubDomainController
 
   21  template<
typename GridImp,
 
   23           typename HostGridView,
 
   24           typename IntersectionController
 
   26  friend class SubDomainInterface;
 
   28  template<
typename GridImp,
 
   30           typename HostGridView,
 
   31           typename IntersectionController
 
   33  friend class SubDomainInterfaceIterator;
 
   35  template<
typename Gr
idImp>
 
   36  friend class LeafSubDomainInterfaceIterator;
 
   38  template<
typename Gr
idImp>
 
   39  friend class LevelSubDomainInterfaceIterator;
 
   41  template<
typename Iterator>
 
   42  bool incrementToNextValidEntity(Iterator& it) {
 
   43    while (it._hostIterator != it._hostEnd) {
 
   44      it._hostCell = *it._hostIterator;
 
   45      if (it._gridView.indexSet().containsForSubDomain(_subDomain1,it._hostCell)) {
 
   46        it._hostIntersectionIterator = it._hostGridView.ibegin(it._hostCell);
 
   47        it._hostIntersectionEnd = it._hostGridView.iend(it._hostCell);
 
   55  template<
typename Iterator>
 
   56  void incrementToNextValidPosition(Iterator& it) {
 
   58      while(it._hostIntersectionIterator != it._hostIntersectionEnd) {
 
   59        auto hostIntersection = *it._hostIntersectionIterator;
 
   60        if (hostIntersection.neighbor() && it._gridView.indexSet().containsForSubDomain(_subDomain2,hostIntersection.outside())) {
 
   63        ++it._hostIntersectionIterator;
 
   66      if (!incrementToNextValidEntity(it)) {
 
   72  template<
typename Iterator>
 
   73  void increment(Iterator& it) {
 
   74    ++it._hostIntersectionIterator;
 
   75    incrementToNextValidPosition(it);
 
   78  template<
typename Iterator>
 
   79  void incrementToStartPosition(Iterator& it)
 
   81    if (incrementToNextValidEntity(it)) {
 
   82      incrementToNextValidPosition(it);
 
   86  SubDomainToSubDomainController(SubDomainIndex subDomain1, SubDomainIndex subDomain2)
 
   87    : _subDomain1(subDomain1)
 
   88    , _subDomain2(subDomain2)
 
   91  SubDomainIndex subDomain1()
 const 
   96  SubDomainIndex subDomain2()
 const 
  101  const SubDomainIndex _subDomain1;
 
  102  const SubDomainIndex _subDomain2;
 
  106template<
typename Gr
idImp>
 
  107class LeafSubDomainInterfaceIterator :
 
  108    public SubDomainInterfaceIterator<GridImp,
 
  109                                      typename GridImp::LeafGridView,
 
  110                                      typename detail::HostGridAccessor<GridImp>::Type::LeafGridView,
 
  111                                      SubDomainToSubDomainController<typename GridImp::SubDomainIndex>
 
  115  template<
typename, 
typename, 
typename, 
typename>
 
  116  friend class SubDomainInterfaceIterator;
 
  118  template<
int, 
int, 
typename>
 
  119  friend class EntityWrapper;
 
  121  template<
typename,
typename>
 
  122  friend class MultiDomainGrid;
 
  124  typedef SubDomainToSubDomainController<typename GridImp::SubDomainIndex> Controller;
 
  126  typedef SubDomainInterfaceIterator<GridImp,
 
  127                                     typename GridImp::LeafGridView,
 
  128                                     typename GridImp::HostGrid::LeafGridView,
 
  132  typedef typename Base::Intersection::SubDomainIndex SubDomainIndex;
 
  134  LeafSubDomainInterfaceIterator(
const GridImp& grid, SubDomainIndex subDomain1, SubDomainIndex subDomain2, 
bool end=
false) :
 
  135    Base(grid.leafGridView(),grid.hostGrid().leafGridView(),Controller(subDomain1,subDomain2),end)
 
  141template<
typename Gr
idImp>
 
  142class LevelSubDomainInterfaceIterator :
 
  143    public SubDomainInterfaceIterator<GridImp,
 
  144                                      typename GridImp::LevelGridView,
 
  145                                      typename detail::HostGridAccessor<GridImp>::Type::LevelGridView,
 
  146                                      SubDomainToSubDomainController<typename GridImp::SubDomainIndex>
 
  150  template<
typename, 
typename, 
typename, 
typename>
 
  151  friend class SubDomainInterfaceIterator;
 
  153  template<
int, 
int, 
typename>
 
  154  friend class EntityWrapper;
 
  156  template<
typename,
typename>
 
  157  friend class MultiDomainGrid;
 
  159  typedef SubDomainToSubDomainController<typename GridImp::SubDomainIndex> Controller;
 
  161  typedef SubDomainInterfaceIterator<GridImp,
 
  162                                     typename GridImp::LevelGridView,
 
  163                                     typename GridImp::HostGrid::LevelGridView,
 
  167  typedef typename Base::Intersection::SubDomainIndex SubDomainIndex;
 
  169  LevelSubDomainInterfaceIterator(
const GridImp& grid, SubDomainIndex subDomain1, SubDomainIndex subDomain2, 
int level, 
bool end=
false) :
 
  170    Base(grid.levelGridView(level),grid.hostGrid().levelGridView(level),Controller(subDomain1,subDomain2),end)