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)