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)