DOLFIN
DOLFIN C++ interface
Loading...
Searching...
No Matches
MeshEntityIterator.h
1// Copyright (C) 2006-2008 Anders Logg
2//
3// This file is part of DOLFIN.
4//
5// DOLFIN is free software: you can redistribute it and/or modify
6// it under the terms of the GNU Lesser General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// DOLFIN is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU Lesser General Public License for more details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
17//
18// Modified by Andre Massing 2009
19//
20// First added: 2006-05-09
21// Last changed: 2014-07-02
22
23#ifndef __MESH_ENTITY_ITERATOR_H
24#define __MESH_ENTITY_ITERATOR_H
25
26#include "Mesh.h"
27#include "MeshEntity.h"
28
29namespace dolfin
30{
31
63
65 {
66 public:
67
69 MeshEntityIterator() : _pos(0), pos_end(0), index(0) {}
70
72 MeshEntityIterator(const Mesh& mesh, std::size_t dim)
73 : _entity(), _pos(0), pos_end(0), index(0)
74 {
75 // Check if mesh is empty
76 if (mesh.num_vertices() == 0)
77 return;
78
79 // Initialize mesh entity
80 _entity.init(mesh, dim, 0);
81
82 mesh.init(dim);
83 // End at ghost cells for normal iterator
84 pos_end = mesh.topology().ghost_offset(dim);
85 }
86
89 MeshEntityIterator(const Mesh& mesh, std::size_t dim, std::string opt)
90 : _entity(), _pos(0), pos_end(0), index(0)
91 {
92 // Check if mesh is empty
93 if (mesh.num_vertices() == 0)
94 return;
95
96 // Initialize mesh entity
97 _entity.init(mesh, dim, 0);
98 mesh.init(dim);
99
100 pos_end = mesh.topology().size(dim);
101 if (opt == "regular")
102 pos_end = mesh.topology().ghost_offset(dim);
103 else if (opt == "ghost")
104 _pos = mesh.topology().ghost_offset(dim);
105 else if (opt != "all")
106 dolfin_error("MeshEntityIterator.h",
107 "initialize MeshEntityIterator",
108 "unknown opt=\"%s\", choose from "
109 "opt=[\"regular\", \"ghost\", \"all\"]", opt.c_str());
110 }
111
114 MeshEntityIterator(const MeshEntity& entity, std::size_t dim)
115 : _entity(entity.mesh(), dim, 0), _pos(0), index(0)
116 {
117 // Get connectivity
118 const MeshConnectivity& c = entity.mesh().topology()(entity.dim(), dim);
119
120 // Compute connectivity if empty
121 if (c.empty())
122 entity.mesh().init(entity.dim(), dim);
123
124 // Get size and index map
125 if (c.empty())
126 {
127 pos_end = 0;
128 index = 0;
129 }
130 else
131 {
132 pos_end = c.size(entity.index());
133 index = c(entity.index());
134 }
135 }
136
139 : _entity(it._entity), _pos(it._pos), pos_end(it.pos_end),
140 index(it.index) {}
141
144
147 {
148 ++_pos;
149 return *this;
150 }
151
154 {
155 --_pos;
156 return *this;
157 }
158
160 std::size_t pos() const
161 { return _pos; }
162
164 bool operator==(const MeshEntityIterator& it) const
165 {
166 // Use const_cast to use operator* inside comparison, which
167 // automatically updates the entity index corresponding to pos
168 // *before* comparison (since update of entity delays until
169 // request for entity)
170 return ((const_cast<MeshEntityIterator *>(this))->operator*()
171 == (const_cast<MeshEntityIterator *>(&it))->operator*()
172 && _pos == it._pos && index == it.index);
173 }
174
176 bool operator!=(const MeshEntityIterator & it) const
177 { return !operator==(it); }
178
181 { return *operator->(); }
182
185 { _entity._local_index = (index ? index[_pos] : _pos); return &_entity; }
186
188 bool end() const
189 { return _pos >= pos_end; }
190
196 {
198 sg(*this);
199 sg.set_end();
200 return sg;
201 }
202
203 // Note: Not a subclass of Variable for efficiency!
204 // Commented out to avoid warning about shadowing str() for MeshEntity
205 // Return informal string representation (pretty-print)
206 // std::string str(bool verbose) const;
207
208 private:
209
210 // Set pos to end position. To create a kind of mesh.end() iterator.
211 void set_end()
212 { _pos = pos_end; }
213
214 // Mesh entity
215 MeshEntity _entity;
216
217 // Current position
218 std::size_t _pos;
219
220 // End position
221 std::size_t pos_end;
222
223 // Mapping from pos to index (if any)
224 const unsigned int* index;
225
226 };
227
228}
229
230#endif
Definition MeshConnectivity.h:42
bool empty() const
Return true if the total number of connections is equal to zero.
Definition MeshConnectivity.h:58
Definition MeshEntityIterator.h:65
MeshEntityIterator(const MeshEntity &entity, std::size_t dim)
Definition MeshEntityIterator.h:114
MeshEntityIterator()
Default constructor.
Definition MeshEntityIterator.h:69
MeshEntityIterator(const MeshEntityIterator &it)
Copy constructor.
Definition MeshEntityIterator.h:138
MeshEntityIterator & operator++()
Step to next mesh entity (prefix increment)
Definition MeshEntityIterator.h:146
MeshEntityIterator end_iterator()
Definition MeshEntityIterator.h:195
bool operator==(const MeshEntityIterator &it) const
Comparison operator.
Definition MeshEntityIterator.h:164
MeshEntityIterator(const Mesh &mesh, std::size_t dim)
Create iterator for mesh entities over given topological dimension.
Definition MeshEntityIterator.h:72
bool end() const
Check if iterator has reached the end.
Definition MeshEntityIterator.h:188
MeshEntity & operator*()
Dereference operator.
Definition MeshEntityIterator.h:180
virtual ~MeshEntityIterator()
Destructor.
Definition MeshEntityIterator.h:143
MeshEntityIterator(const Mesh &mesh, std::size_t dim, std::string opt)
Definition MeshEntityIterator.h:89
MeshEntity * operator->()
Member access operator.
Definition MeshEntityIterator.h:184
std::size_t pos() const
Return current position.
Definition MeshEntityIterator.h:160
bool operator!=(const MeshEntityIterator &it) const
Comparison operator.
Definition MeshEntityIterator.h:176
MeshEntityIterator & operator--()
Step to the previous mesh entity (prefix decrease)
Definition MeshEntityIterator.h:153
Definition MeshEntity.h:43
const Mesh & mesh() const
Definition MeshEntity.h:99
void init(const Mesh &mesh, std::size_t dim, std::size_t index)
Definition MeshEntity.cpp:39
std::size_t dim() const
Definition MeshEntity.h:106
std::size_t size(std::size_t dim) const
Return number of entities for given dimension.
Definition MeshTopology.cpp:79
std::size_t ghost_offset(std::size_t dim) const
Definition MeshTopology.cpp:97
Definition Mesh.h:84
std::size_t init(std::size_t dim) const
Definition Mesh.cpp:139
MeshTopology & topology()
Definition Mesh.h:220
std::size_t num_vertices() const
Definition Mesh.h:135
Definition adapt.h:30
void dolfin_error(std::string location, std::string task, std::string reason,...)
Definition log.cpp:129