Loading [MathJax]/extensions/tex2jax.js

dune-mmesh (unstable)

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 {
15template <int codim, class GridImp, int dim>
17
19template <int codim, class Grid>
21 EntityIterator<codim, Grid,
23
29template <class GridImp>
30class MMeshInterfaceIteratorImp<1, GridImp, 2> {
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 while (edgeIterator_ != mMesh_->getHostGrid().finite_edges_end()) {
43 if (isInterface_())
44 break;
45 else
46 edgeIterator_++;
47 }
48 }
49
54 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool endDummy,
55 bool includeBoundary)
56 : mMesh_(mMesh),
57 edgeIterator_(mMesh_->getHostGrid().finite_edges_end()),
58 includeBoundary_(includeBoundary) {}
59
61 void increment() {
62 edgeIterator_++;
63 while (edgeIterator_ != mMesh_->getHostGrid().finite_edges_end()) {
64 if (isInterface_())
65 break;
66 else
67 edgeIterator_++;
68 }
69 }
70
72 Entity dereference() const { return Entity{{mMesh_, *edgeIterator_}}; }
73
75 bool equals(const MMeshInterfaceIteratorImp& iter) const {
76 return edgeIterator_ == iter.edgeIterator_;
77 }
78
79 private:
80 bool isInterface_() const {
81 if (includeBoundary_)
82 return mMesh_->isInterface(dereference());
83 else {
84 return mMesh_->isInterface(dereference()) &&
85 !mMesh_->getHostGrid().is_infinite(
86 edgeIterator_->first) // exclude boundary segments
87 && !mMesh_->getHostGrid().is_infinite(
88 edgeIterator_->first->neighbor(edgeIterator_->second));
89 }
90 }
91
92 const GridImp* mMesh_;
93 EdgeIterator edgeIterator_;
94 bool includeBoundary_;
95};
96
98template <class GridImp>
99class MMeshInterfaceIteratorImp<1, GridImp, 3> {
100 private:
102 using FacetIterator = typename GridImp::HostGridType::Finite_facets_iterator;
103
104 public:
105 typedef typename GridImp::template Codim<1>::Entity Entity;
106
107 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool includeBoundary)
108 : mMesh_(mMesh),
109 facetIterator_(mMesh_->getHostGrid().finite_facets_begin()),
110 includeBoundary_(includeBoundary) {
111 while (facetIterator_ != mMesh_->getHostGrid().finite_facets_end()) {
112 if (isInterface_())
113 break;
114 else
115 facetIterator_++;
116 }
117 }
118
123 explicit MMeshInterfaceIteratorImp(const GridImp* mMesh, bool endDummy,
124 bool includeBoundary)
125 : mMesh_(mMesh),
126 facetIterator_(mMesh_->getHostGrid().finite_facets_end()),
127 includeBoundary_(includeBoundary) {}
128
130 void increment() {
131 facetIterator_++;
132 while (facetIterator_ != mMesh_->getHostGrid().finite_facets_end()) {
133 if (isInterface_())
134 break;
135 else
136 facetIterator_++;
137 }
138 }
139
141 Entity dereference() const { return Entity{{mMesh_, *facetIterator_}}; }
142
144 bool equals(const MMeshInterfaceIteratorImp& iter) const {
145 return facetIterator_ == iter.facetIterator_;
146 }
147
148 private:
149 bool isInterface_() const {
150 if (includeBoundary_)
151 return mMesh_->isInterface(dereference());
152 else {
153 return mMesh_->isInterface(dereference()) &&
154 !mMesh_->getHostGrid().is_infinite(
155 facetIterator_->first) // exclude boundary segments
156 && !mMesh_->getHostGrid().is_infinite(
157 facetIterator_->first->neighbor(facetIterator_->second));
158 }
159 }
160
161 const GridImp* mMesh_;
162 FacetIterator facetIterator_;
163 bool includeBoundary_;
164};
165
167template <class GridImp, int dim>
168class MMeshInterfaceVertexIteratorImp;
169
171template <class Grid>
173 EntityIterator<Grid::dimension, Grid,
175
181template <class GridImp, int dim>
183 private:
185 using InterfaceIterator = MMeshInterfaceIterator<1, GridImp>;
186 using InterfaceIteratorImpl = typename InterfaceIterator::Implementation;
187
188 public:
189 typedef typename GridImp::template Codim<dim>::Entity Vertex;
190
191 explicit MMeshInterfaceVertexIteratorImp(const GridImp* mMesh,
192 bool includeBoundary)
193 : mMesh_(mMesh),
194 interfaceIterator_(InterfaceIteratorImpl(mMesh_, includeBoundary)),
195 interfaceEnd_(InterfaceIteratorImpl(mMesh_, true, includeBoundary)),
196 i_(0) {
197 if (interfaceIterator_ != interfaceEnd_) {
198 // add first vertex to visited
199 std::size_t id = dereference().impl().hostEntity()->info().id;
200 visited.insert(id);
201 }
202 }
203
208 explicit MMeshInterfaceVertexIteratorImp(const GridImp* mMesh, bool endDummy,
209 bool includeBoundary)
210 : mMesh_(mMesh),
211 interfaceIterator_(
212 InterfaceIteratorImpl(mMesh_, true, includeBoundary)),
213 interfaceEnd_(InterfaceIteratorImpl(mMesh_, true, includeBoundary)),
214 i_(0) {}
215
217 void increment() {
218 i_++;
219
220 if (i_ == dim) {
221 i_ = 0;
222 interfaceIterator_++;
223 }
224
225 if (interfaceIterator_ != interfaceEnd_) {
226 // check if already visited
227 std::size_t id = dereference().impl().hostEntity()->info().id;
228 int count = visited.count(id);
229 assert(count <= 1);
230 if (count > 0)
231 increment();
232 else
233 visited.insert(id);
234 }
235 }
236
238 Vertex dereference() const {
239 const auto host = interfaceIterator_->impl().hostEntity();
240 return Vertex{
241 {mMesh_, host.first->vertex((host.second + i_ + 1) % (dim + 1))}};
242 }
243
245 bool equals(const MMeshInterfaceVertexIteratorImp& iter) const {
246 return interfaceIterator_ == iter.interfaceIterator_ && i_ == iter.i_;
247 }
248
249 private:
250 const GridImp* mMesh_;
251 InterfaceIterator interfaceIterator_, interfaceEnd_;
252 std::unordered_set<std::size_t> visited;
253 int i_;
254};
255
256} // namespace Dune
257
258#endif
MMeshInterfaceIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:54
bool equals(const MMeshInterfaceIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:75
Entity dereference() const
dereferencing
Definition: interfaceiterator.hh:72
void increment()
prefix increment
Definition: interfaceiterator.hh:61
bool equals(const MMeshInterfaceIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:144
Entity dereference() const
dereferencing
Definition: interfaceiterator.hh:141
void increment()
prefix increment
Definition: interfaceiterator.hh:130
MMeshInterfaceIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:123
Forward declarations.
Definition: interfaceiterator.hh:16
Forward declarations.
Definition: interfaceiterator.hh:182
void increment()
prefix increment
Definition: interfaceiterator.hh:217
MMeshInterfaceVertexIteratorImp(const GridImp *mMesh, bool endDummy, bool includeBoundary)
Constructor which creates the end iterator.
Definition: interfaceiterator.hh:208
Vertex dereference() const
dereferencing
Definition: interfaceiterator.hh:238
bool equals(const MMeshInterfaceVertexIteratorImp &iter) const
equality
Definition: interfaceiterator.hh:245
EntityIterator< Grid::dimension, Grid, MMeshInterfaceVertexIteratorImp< Grid, Grid::dimension > > MMeshInterfaceVertexIterator
The Entity Iterator alias.
Definition: interfaceiterator.hh:174
EntityIterator< codim, Grid, MMeshInterfaceIteratorImp< codim, Grid, Grid::dimension > > MMeshInterfaceIterator
The Entity Iterator alias.
Definition: interfaceiterator.hh:22
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 16, 23:47, 2025)