dune-multidomaingrid 2.8
Loading...
Searching...
No Matches
allsubdomaininterfacesiterator.hh
Go to the documentation of this file.
1#ifndef DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH
2#define DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH
3
4#include <dune/common/fvector.hh>
7
8namespace Dune {
9
10namespace mdgrid {
11
12
13template<typename GridImp>
15
16template<typename GridImp>
18
19template<typename SubDomainSet>
21{
22
23 template<typename GridImp,
24 typename GridView,
25 typename HostGridView,
26 typename IntersectionController
27 >
28 friend class SubDomainInterface;
29
30 template<typename GridImp,
31 typename GridView,
32 typename HostGridView,
33 typename IntersectionController
34 >
36
37 template<typename GridImp>
39
40 template<typename GridImp>
42
43 typedef typename SubDomainSet::SubDomainIndex SubDomainIndex;
44 typedef typename SubDomainSet::Iterator SubDomainIterator;
45
46 template<typename Iterator>
47 bool calculateInterfacingSubDomains(Iterator& it)
48 {
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());
58 }
59
60 template<typename Iterator>
61 void incrementToNextValidPosition(Iterator& it) {
62 if (_subDomain2Iterator != _subDomain2End) {
63 return;
64 }
65 ++_subDomain1Iterator;
66 if (_subDomain1Iterator != _subDomain1End) {
67 _subDomain2Iterator = _interfacingSubDomains2.begin();
68 return;
69 }
70 incrementToNextValidIntersection(it);
71 }
72
73 template<typename Iterator>
74 bool incrementToNextValidIntersection(Iterator& it)
75 {
76 for (;;) {
77 for (;;) {
78 ++it._hostIntersectionIterator;
79 if (it._hostIntersectionIterator != it._hostIntersectionEnd)
80 break;
81 if (it._hostIntersectionIterator->neighbor() &&
82 calculateInterfacingSubDomains(it))
83 return true;
84 }
85 ++it._hostIterator;
86 if (it._hostIterator == it._hostEnd)
87 return false;
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))
94 return true;
95 }
96 }
97
98 template<typename Iterator>
99 void increment(Iterator& it) {
100 ++_subDomain2Iterator;
101 incrementToNextValidPosition(it);
102 }
103
104 template<typename Iterator>
105 void incrementToStartPosition(Iterator& it)
106 {
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);
112 }
113 }
114
115 AllInterfacesController()
116 : _subDomain1Iterator(_interfacingSubDomains1.end())
117 , _subDomain2Iterator(_interfacingSubDomains2.end())
118 , _subDomain1End(_subDomain1Iterator)
119 , _subDomain2End(_subDomain2Iterator)
120 {}
121
122 SubDomainIndex subDomain1() const
123 {
124 return *_subDomain1Iterator;
125 }
126
127 SubDomainIndex subDomain2() const
128 {
129 return *_subDomain2Iterator;
130 }
131
132 const SubDomainSet* _subDomains1;
133 SubDomainSet _interfacingSubDomains1;
134 SubDomainSet _interfacingSubDomains2;
135 SubDomainIterator _subDomain1Iterator;
136 SubDomainIterator _subDomain2Iterator;
137 SubDomainIterator _subDomain1End;
138 SubDomainIterator _subDomain2End;
139};
140
141
142template<typename GridImp>
144 public SubDomainInterfaceIterator<GridImp,
145 typename GridImp::LeafGridView,
146 typename detail::HostGridAccessor<GridImp>::Type::LeafGridView,
147 AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet>
148 >
149{
150
151 template<typename, typename, typename, typename>
153
154 template<int, int, typename>
155 friend class EntityWrapper;
156
157 template<typename,typename>
158 friend class MultiDomainGrid;
159
161
162 typedef SubDomainInterfaceIterator<GridImp,
163 typename GridImp::LeafGridView,
164 typename GridImp::HostGrid::LeafGridView,
166 > Base;
167
168 LeafAllSubDomainInterfacesIterator(const GridImp& grid, bool end=false) :
169 Base(grid.leafGridView(),grid._hostGrid.leafGridView(),Controller(),end)
170 {}
171
172};
173
174
175template<typename GridImp>
177 public SubDomainInterfaceIterator<GridImp,
178 typename GridImp::LevelGridView,
179 typename detail::HostGridAccessor<GridImp>::Type::LevelGridView,
180 AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet>
181 >
182{
183
184 template<typename, typename, typename, typename>
186
187 template<int, int, typename>
188 friend class EntityWrapper;
189
190 template<typename,typename>
191 friend class MultiDomainGrid;
192
194
195 typedef SubDomainInterfaceIterator<GridImp,
196 typename GridImp::LevelGridView,
197 typename GridImp::HostGrid::LevelGridView,
199 > Base;
200
201 LevelAllSubDomainInterfacesIterator(const GridImp& grid, int level, bool end=false) :
202 Base(grid.levelGridView(level),grid._hostGrid.levelGridView(level),Controller(),end)
203 {}
204
205};
206
207
208} // namespace mdgrid
209
210} // namespace Dune
211
212#endif // DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH
Definition: multidomaingrid.hh:8
Definition: allsubdomaininterfacesiterator.hh:149
Definition: allsubdomaininterfacesiterator.hh:182
Definition: allsubdomaininterfacesiterator.hh:21
Definition: entity.hh:144
A meta grid for dividing an existing DUNE grid into subdomains that can be accessed as a grid in thei...
Definition: multidomaingrid/multidomaingrid.hh:241
Definition: subdomaininterfaceiterator.hh:355
An intersection that forms part of the interface between two subdomains.
Definition: subdomaininterfaceiterator.hh:32