dune-multidomaingrid 2.8
Loading...
Searching...
No Matches
subdomaintosubdomaininterfaceiterator.hh
Go to the documentation of this file.
1#ifndef DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH
2#define DUNE_MULTIDOMAINGRID_SUBDOMAINTOSUBDOMAININTERFACEITERATOR_HH
3
6
7namespace Dune {
8
9namespace mdgrid {
10
11template<typename GridImp>
12class LeafSubDomainInterfaceIterator;
13
14template<typename GridImp>
15class LevelSubDomainInterfaceIterator;
16
17template<typename SubDomainIndex>
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 >
34
35 template<typename GridImp>
37
38 template<typename GridImp>
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>
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>
117
118 template<int, int, typename>
119 friend class EntityWrapper;
120
121 template<typename,typename>
122 friend class MultiDomainGrid;
123
125
126 typedef SubDomainInterfaceIterator<GridImp,
127 typename GridImp::LeafGridView,
128 typename GridImp::HostGrid::LeafGridView,
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>
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>
152
153 template<int, int, typename>
154 friend class EntityWrapper;
155
156 template<typename,typename>
157 friend class MultiDomainGrid;
158
160
161 typedef SubDomainInterfaceIterator<GridImp,
162 typename GridImp::LevelGridView,
163 typename GridImp::HostGrid::LevelGridView,
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
Definition: multidomaingrid.hh:8
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
Definition: subdomaintosubdomaininterfaceiterator.hh:19
An intersection that forms part of the interface between two subdomains.
Definition: subdomaininterfaceiterator.hh:32
Definition: subdomaintosubdomaininterfaceiterator.hh:113
Definition: subdomaintosubdomaininterfaceiterator.hh:148