Loading [MathJax]/extensions/MathMenu.js

DUNE MultiDomainGrid (2.9)

subdomaintosubdomaininterfaceiterator.hh
1#ifndef DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH
2#define DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH
3
4#include <dune/grid/multidomaingrid/hostgridaccessor.hh>
5#include <dune/grid/multidomaingrid/subdomaininterfaceiterator.hh>
6
7namespace Dune {
8
9namespace mdgrid {
10
11template<typename GridImp>
12class LeafSubDomainInterfaceIterator;
13
14template<typename GridImp>
15class LevelSubDomainInterfaceIterator;
16
17template<typename SubDomainIndex>
18class SubDomainToSubDomainController
19{
20
21 template<typename GridImp,
22 typename GridView,
23 typename HostGridView,
24 typename IntersectionController
25 >
26 friend class SubDomainInterface;
27
28 template<typename GridImp,
29 typename GridView,
30 typename HostGridView,
31 typename IntersectionController
32 >
33 friend class SubDomainInterfaceIterator;
34
35 template<typename GridImp>
36 friend class LeafSubDomainInterfaceIterator;
37
38 template<typename GridImp>
39 friend class LevelSubDomainInterfaceIterator;
40
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);
48 return true;
49 }
50 ++it._hostIterator;
51 }
52 return false;
53 }
54
55 template<typename Iterator>
56 void incrementToNextValidPosition(Iterator& it) {
57 for (;;) {
58 while(it._hostIntersectionIterator != it._hostIntersectionEnd) {
59 auto hostIntersection = *it._hostIntersectionIterator;
60 if (hostIntersection.neighbor() && it._gridView.indexSet().containsForSubDomain(_subDomain2,hostIntersection.outside())) {
61 return;
62 }
63 ++it._hostIntersectionIterator;
64 }
65 ++it._hostIterator;
66 if (!incrementToNextValidEntity(it)) {
67 return;
68 }
69 }
70 }
71
72 template<typename Iterator>
73 void increment(Iterator& it) {
74 ++it._hostIntersectionIterator;
75 incrementToNextValidPosition(it);
76 }
77
78 template<typename Iterator>
79 void incrementToStartPosition(Iterator& it)
80 {
81 if (incrementToNextValidEntity(it)) {
82 incrementToNextValidPosition(it);
83 }
84 }
85
86 SubDomainToSubDomainController(SubDomainIndex subDomain1, SubDomainIndex subDomain2)
87 : _subDomain1(subDomain1)
88 , _subDomain2(subDomain2)
89 {}
90
91 SubDomainIndex subDomain1() const
92 {
93 return _subDomain1;
94 }
95
96 SubDomainIndex subDomain2() const
97 {
98 return _subDomain2;
99 }
100
101 const SubDomainIndex _subDomain1;
102 const SubDomainIndex _subDomain2;
103};
104
105
106template<typename GridImp>
107class LeafSubDomainInterfaceIterator :
108 public SubDomainInterfaceIterator<GridImp,
109 typename GridImp::LeafGridView,
110 typename detail::HostGridAccessor<GridImp>::Type::LeafGridView,
111 SubDomainToSubDomainController<typename GridImp::SubDomainIndex>
112 >
113{
114
115 template<typename, typename, typename, typename>
116 friend class SubDomainInterfaceIterator;
117
118 template<int, int, typename>
119 friend class EntityWrapper;
120
121 template<typename,typename>
122 friend class MultiDomainGrid;
123
124 typedef SubDomainToSubDomainController<typename GridImp::SubDomainIndex> Controller;
125
126 typedef SubDomainInterfaceIterator<GridImp,
127 typename GridImp::LeafGridView,
128 typename GridImp::HostGrid::LeafGridView,
129 Controller
130 > Base;
131
132 typedef typename Base::Intersection::SubDomainIndex SubDomainIndex;
133
134 LeafSubDomainInterfaceIterator(const GridImp& grid, SubDomainIndex subDomain1, SubDomainIndex subDomain2, bool end=false) :
135 Base(grid.leafGridView(),grid._hostGrid.leafGridView(),Controller(subDomain1,subDomain2),end)
136 {}
137
138};
139
140
141template<typename GridImp>
142class LevelSubDomainInterfaceIterator :
143 public SubDomainInterfaceIterator<GridImp,
144 typename GridImp::LevelGridView,
145 typename detail::HostGridAccessor<GridImp>::Type::LevelGridView,
146 SubDomainToSubDomainController<typename GridImp::SubDomainIndex>
147 >
148{
149
150 template<typename, typename, typename, typename>
151 friend class SubDomainInterfaceIterator;
152
153 template<int, int, typename>
154 friend class EntityWrapper;
155
156 template<typename,typename>
157 friend class MultiDomainGrid;
158
159 typedef SubDomainToSubDomainController<typename GridImp::SubDomainIndex> Controller;
160
161 typedef SubDomainInterfaceIterator<GridImp,
162 typename GridImp::LevelGridView,
163 typename GridImp::HostGrid::LevelGridView,
164 Controller
165 > Base;
166
167 typedef typename Base::Intersection::SubDomainIndex SubDomainIndex;
168
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)
171 {}
172
173};
174
175} // namespace mdgrid
176
177} // namespace Dune
178
179#endif // DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Apr 7, 22:57, 2025)