Loading [MathJax]/extensions/tex2jax.js

DUNE MultiDomainGrid (2.9)

allsubdomaininterfacesiterator.hh
1#ifndef DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH
2#define DUNE_MULTIDOMAINGRID_ALLSUBDOMAININTERFACESITERATOR_HH
3
4#include <dune/common/fvector.hh>
5#include <dune/grid/multidomaingrid/hostgridaccessor.hh>
6#include <dune/grid/multidomaingrid/subdomaininterfaceiterator.hh>
7
8namespace Dune {
9
10namespace mdgrid {
11
12
13template<typename GridImp>
14class LeafAllSubDomainInterfacesIterator;
15
16template<typename GridImp>
17class LevelAllSubDomainInterfacesIterator;
18
19template<typename SubDomainSet>
20class AllInterfacesController
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 >
35 friend class SubDomainInterfaceIterator;
36
37 template<typename GridImp>
38 friend class LeafAllSubDomainInterfacesIterator;
39
40 template<typename GridImp>
41 friend class LevelAllSubDomainInterfacesIterator;
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>
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>
148 >
149{
150
151 template<typename, typename, typename, typename>
152 friend class SubDomainInterfaceIterator;
153
154 template<int, int, typename>
155 friend class EntityWrapper;
156
157 template<typename,typename>
158 friend class MultiDomainGrid;
159
160 typedef AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet> Controller;
161
162 typedef SubDomainInterfaceIterator<GridImp,
163 typename GridImp::LeafGridView,
164 typename GridImp::HostGrid::LeafGridView,
165 Controller
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>
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>
181 >
182{
183
184 template<typename, typename, typename, typename>
185 friend class SubDomainInterfaceIterator;
186
187 template<int, int, typename>
188 friend class EntityWrapper;
189
190 template<typename,typename>
191 friend class MultiDomainGrid;
192
193 typedef AllInterfacesController<typename GridImp::MDGridTraits::template Codim<0>::SubDomainSet> Controller;
194
195 typedef SubDomainInterfaceIterator<GridImp,
196 typename GridImp::LevelGridView,
197 typename GridImp::HostGrid::LevelGridView,
198 Controller
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
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Apr 7, 22:57, 2025)