Loading [MathJax]/extensions/tex2jax.js

dune-mmesh (1.4)

interfaceiterator.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_GRID_MMESHINTERFACEITERATOR_HH
4#define DUNE_GRID_MMESHINTERFACEITERATOR_HH
5
10// Dune includes
11#include <dune/grid/common/gridenums.hh>
12
13namespace Dune
14{
16 template<int codim, class GridImp, int dim>
18
20 template<int codim, class Grid>
21 using MMeshInterfaceIterator = EntityIterator<codim, Grid, MMeshInterfaceIteratorImp<codim, Grid, Grid::dimension>>;
22
28 template<class GridImp>
29 class MMeshInterfaceIteratorImp<1, GridImp, 2>
30 {
31 private:
33 using EdgeIterator = typename GridImp::HostGridType::Finite_edges_iterator;
34
35 public:
36 typedef typename GridImp::template Codim<1>::Entity Entity;
37
38 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool includeBoundary)
39 : mMesh_(mMesh),
40 edgeIterator_(mMesh_->getHostGrid().finite_edges_begin()),
41 includeBoundary_(includeBoundary)
42 {
43 while( edgeIterator_ != mMesh_->getHostGrid().finite_edges_end() )
44 {
45 if (isInterface_())
46 break;
47 else
48 edgeIterator_++;
49 }
50 }
51
56 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool endDummy, bool includeBoundary)
57 : mMesh_(mMesh),
58 edgeIterator_(mMesh_->getHostGrid().finite_edges_end()),
59 includeBoundary_(includeBoundary)
60 {}
61
63 void increment()
64 {
65 edgeIterator_++;
66 while( edgeIterator_ != mMesh_->getHostGrid().finite_edges_end() )
67 {
68 if (isInterface_())
69 break;
70 else
71 edgeIterator_++;
72 }
73 }
74
76 Entity dereference() const {
77 return Entity {{ mMesh_, *edgeIterator_ }};
78 }
79
81 bool equals(const MMeshInterfaceIteratorImp& iter) const {
82 return edgeIterator_ == iter.edgeIterator_;
83 }
84
85 private:
86 bool isInterface_() const
87 {
88 if ( includeBoundary_ )
89 return mMesh_->isInterface( dereference() );
90 else
91 {
92 return mMesh_->isInterface( dereference() )
93 && !mMesh_->getHostGrid().is_infinite(edgeIterator_->first) // exclude boundary segments
94 && !mMesh_->getHostGrid().is_infinite(edgeIterator_->first->neighbor(edgeIterator_->second));
95 }
96 }
97
98 const GridImp* mMesh_;
99 EdgeIterator edgeIterator_;
100 bool includeBoundary_;
101 };
102
103
105 template<class GridImp>
106 class MMeshInterfaceIteratorImp<1, GridImp, 3>
107 {
108 private:
110 using FacetIterator = typename GridImp::HostGridType::Finite_facets_iterator;
111
112 public:
113 typedef typename GridImp::template Codim<1>::Entity Entity;
114
115 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool includeBoundary)
116 : mMesh_(mMesh),
117 facetIterator_(mMesh_->getHostGrid().finite_facets_begin()),
118 includeBoundary_(includeBoundary)
119 {
120 while( facetIterator_ != mMesh_->getHostGrid().finite_facets_end() )
121 {
122 if (isInterface_())
123 break;
124 else
125 facetIterator_++;
126 }
127 }
128
133 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool endDummy, bool includeBoundary)
134 : mMesh_(mMesh),
135 facetIterator_(mMesh_->getHostGrid().finite_facets_end()),
136 includeBoundary_(includeBoundary)
137 {}
138
141 {
142 facetIterator_++;
143 while( facetIterator_ != mMesh_->getHostGrid().finite_facets_end() )
144 {
145 if (isInterface_())
146 break;
147 else
148 facetIterator_++;
149 }
150 }
151
153 Entity dereference() const {
154 return Entity {{ mMesh_, *facetIterator_ }};
155 }
156
158 bool equals(const MMeshInterfaceIteratorImp& iter) const {
159 return facetIterator_ == iter.facetIterator_;
160 }
161
162 private:
163 bool isInterface_() const
164 {
165 if ( includeBoundary_ )
166 return mMesh_->isInterface( dereference() );
167 else
168 {
169 return mMesh_->isInterface( dereference() )
170 && !mMesh_->getHostGrid().is_infinite(facetIterator_->first) // exclude boundary segments
171 && !mMesh_->getHostGrid().is_infinite(facetIterator_->first->neighbor(facetIterator_->second));
172 }
173 }
174
175 const GridImp* mMesh_;
176 FacetIterator facetIterator_;
177 bool includeBoundary_;
178 };
179
180
181
183 template<class GridImp, int dim>
184 class MMeshInterfaceVertexIteratorImp;
185
187 template<class Grid>
188 using MMeshInterfaceVertexIterator = EntityIterator<Grid::dimension, Grid, MMeshInterfaceVertexIteratorImp<Grid, Grid::dimension>>;
189
195 template<class GridImp, int dim>
197 {
198 private:
200 using InterfaceIterator = MMeshInterfaceIterator<1, GridImp>;
201 using InterfaceIteratorImpl = typename InterfaceIterator::Implementation;
202
203 public:
204 typedef typename GridImp::template Codim<dim>::Entity Vertex;
205
206 explicit MMeshInterfaceVertexIteratorImp(const GridImp* mMesh, bool includeBoundary)
207 : mMesh_(mMesh),
208 interfaceIterator_( InterfaceIteratorImpl(mMesh_, includeBoundary) ),
209 interfaceEnd_( InterfaceIteratorImpl(mMesh_, true, includeBoundary) ),
210 i_(0)
211 {
212 if( interfaceIterator_ != interfaceEnd_ )
213 {
214 // add first vertex to visited
215 std::size_t id = dereference().impl().hostEntity()->info().id;
216 visited.insert( id );
217 }
218 }
219
224 explicit MMeshInterfaceVertexIteratorImp(const GridImp* mMesh, bool endDummy, bool includeBoundary)
225 : mMesh_(mMesh),
226 interfaceIterator_( InterfaceIteratorImpl(mMesh_, true, includeBoundary) ),
227 interfaceEnd_( InterfaceIteratorImpl(mMesh_, true, includeBoundary) ),
228 i_(0)
229 {}
230
233 {
234 i_++;
235
236 if ( i_ == dim )
237 {
238 i_ = 0;
239 interfaceIterator_++;
240 }
241
242 if ( interfaceIterator_ != interfaceEnd_ )
243 {
244 // check if already visited
245 std::size_t id = dereference().impl().hostEntity()->info().id;
246 int count = visited.count( id );
247 assert( count <= 1 );
248 if ( count > 0 )
249 increment();
250 else
251 visited.insert( id );
252 }
253 }
254
256 Vertex dereference() const {
257 const auto host = interfaceIterator_->impl().hostEntity();
258 return Vertex {{ mMesh_, host.first->vertex((host.second+i_+1)%(dim+1)) }};
259 }
260
262 bool equals(const MMeshInterfaceVertexIteratorImp& iter) const {
263 return interfaceIterator_ == iter.interfaceIterator_ && i_ == iter.i_;
264 }
265
266 private:
267 const GridImp* mMesh_;
268 InterfaceIterator interfaceIterator_, interfaceEnd_;
269 std::unordered_set<std::size_t> visited;
270 int i_;
271 };
272
273} // namespace Dune
274
275#endif
MMeshInterfaceIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:56
bool equals(const MMeshInterfaceIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:81
Entity dereference() const
dereferencing
Definition: interfaceiterator.hh:76
void increment()
prefix increment
Definition: interfaceiterator.hh:63
bool equals(const MMeshInterfaceIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:158
Entity dereference() const
dereferencing
Definition: interfaceiterator.hh:153
void increment()
prefix increment
Definition: interfaceiterator.hh:140
MMeshInterfaceIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:133
Forward declarations.
Definition: interfaceiterator.hh:17
Forward declarations.
Definition: interfaceiterator.hh:197
void increment()
prefix increment
Definition: interfaceiterator.hh:232
MMeshInterfaceVertexIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:224
Vertex dereference() const
dereferencing
Definition: interfaceiterator.hh:256
bool equals(const MMeshInterfaceVertexIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:262
EntityIterator< Grid::dimension, Grid, MMeshInterfaceVertexIteratorImp< Grid, Grid::dimension > > MMeshInterfaceVertexIterator
The Entity Iterator alias.
Definition: interfaceiterator.hh:188
EntityIterator< codim, Grid, MMeshInterfaceIteratorImp< codim, Grid, Grid::dimension > > MMeshInterfaceIterator
The Entity Iterator alias.
Definition: interfaceiterator.hh:21
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Apr 13, 22:42, 2025)