include/meltpooldg/particles/particle_iterator.hpp Source File

Developer Documentation: include/meltpooldg/particles/particle_iterator.hpp Source File
Developer Documentation
particle_iterator.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include <deal.II/base/exception_macros.h>
5#include <deal.II/base/exceptions.h>
6#include <deal.II/base/types.h>
7
8#include <deal.II/particles/particle_accessor.h>
9#include <deal.II/particles/property_pool.h>
10
14
15#include <cstddef>
16#include <iterator>
17#include <memory>
18#include <optional>
19#include <type_traits>
20#include <variant>
21
22namespace MeltPoolDG
23{
35 template <int dim, typename number>
37 {
38 public:
39 using iterator_category = std::bidirectional_iterator_tag;
40 using difference_type = std::ptrdiff_t;
44
48 ParticleIterator() = default;
49
55 ParticleIterator(dealii::Particles::ParticleIterator<dim> particle);
56
64 ParticleIterator(dealii::Particles::PropertyPool<dim> &property_pool,
65 const typename dealii::Particles::PropertyPool<dim>::Handle handle);
66
73 operator*();
74
79 operator*() const;
80
87 operator->();
88
93 operator->() const;
94
95 [[nodiscard]] bool
96 operator!=(const ParticleIterator &c) const;
97
98 [[nodiscard]] bool
99 operator==(const ParticleIterator &c) const;
100
105 operator++();
106
111 operator++(int);
112
117 operator--();
118
123 operator--(int);
124
125 private:
128 std::optional<DEMParticleAccessor<dim, number>> particle_accessor;
129
136 {
137 dealii::Particles::PropertyPool<dim> *dealii_property_pool = nullptr;
138 typename dealii::Particles::PropertyPool<dim>::Handle handle =
139 dealii::numbers::invalid_unsigned_int;
140
141 void
142 operator++() noexcept
143 {
144 ++handle;
145 }
146
147 void
148 operator--() noexcept
149 {
150 --handle;
151 }
152
153 [[nodiscard]] bool
154 operator==(const PropertyPoolIteratorData &c) const noexcept
155 {
156 return handle == c.handle and dealii_property_pool == c.dealii_property_pool;
157 }
158
159 [[nodiscard]] bool
160 operator!=(const PropertyPoolIteratorData &c) const noexcept
161 {
162 return handle != c.handle or dealii_property_pool != c.dealii_property_pool;
163 }
164
165 dealii::IteratorState::IteratorStates
166 state() const noexcept
167 {
168 if (dealii_property_pool == nullptr or handle >= dealii_property_pool->n_registered_slots())
169 return dealii::IteratorState::IteratorStates::invalid;
170 else
171 return dealii::IteratorState::IteratorStates::valid;
172 }
173 };
174
176 std::variant<dealii::Particles::ParticleIterator<dim>, PropertyPoolIteratorData>
178
184 void
186
191 void
193 };
194
195
196 template <int dim, typename number>
197 ParticleIterator<dim, number>::ParticleIterator(dealii::Particles::ParticleIterator<dim> particle)
198 : deal_ii_iterator(particle)
199 {
201 }
202
203 template <int dim, typename number>
205 dealii::Particles::PropertyPool<dim> &property_pool,
206 const typename dealii::Particles::PropertyPool<dim>::Handle handle)
207 : deal_ii_iterator(PropertyPoolIteratorData{&property_pool, handle})
208 {
210 }
211
212 template <int dim, typename number>
215 {
216 Assert(particle_accessor.has_value(),
217 dealii::ExcMessage("Dereferencing invalid ParticleIterator"));
218 return *particle_accessor;
219 }
220
221 template <int dim, typename number>
224 {
225 Assert(particle_accessor.has_value(),
226 dealii::ExcMessage("Dereferencing invalid ParticleIterator"));
227 return *particle_accessor;
228 }
229
230 template <int dim, typename number>
233 {
234 Assert(particle_accessor.has_value(),
235 dealii::ExcMessage("Dereferencing invalid ParticleIterator"));
236 return std::addressof(**this);
237 }
238
239 template <int dim, typename number>
242 {
243 Assert(particle_accessor.has_value(),
244 dealii::ExcMessage("Dereferencing invalid ParticleIterator"));
245 return std::addressof(**this);
246 }
247
248 template <int dim, typename number>
249 [[nodiscard]] bool
251 {
252 return deal_ii_iterator == c.deal_ii_iterator;
253 }
254
255 template <int dim, typename number>
256 [[nodiscard]] bool
258 {
259 return deal_ii_iterator != c.deal_ii_iterator;
260 }
261
262 template <int dim, typename number>
265 {
266 std::visit([&](auto &it) { ++it; }, deal_ii_iterator);
267 refresh_accessor();
268 return *this;
269 }
270
271 template <int dim, typename number>
274 {
275 ParticleIterator tmp(*this);
276 operator++();
277 return tmp;
278 }
279
280 template <int dim, typename number>
283 {
284 std::visit([&](auto &it) { --it; }, deal_ii_iterator);
285 refresh_accessor();
286 return *this;
287 }
288
289 template <int dim, typename number>
292 {
293 ParticleIterator tmp(*this);
294 operator--();
295 return tmp;
296 }
297
298 template <int dim, typename number>
299 void
301 {
302 std::visit(
303 [&](auto &it) {
304 using T = std::decay_t<decltype(it)>;
305
306 if constexpr (std::is_same_v<T, dealii::Particles::ParticleIterator<dim>>)
307 particle_accessor.emplace(*it);
308 else if constexpr (std::is_same_v<T, PropertyPoolIteratorData>)
309 particle_accessor.emplace(*it.dealii_property_pool, it.handle);
310 else
311 AssertThrow(false, dealii::ExcInternalError());
312 },
313 deal_ii_iterator);
314 }
315
316 template <int dim, typename number>
317 void
319 {
320 std::visit(
321 [&](auto &it) {
322 if (it.state() == dealii::IteratorState::IteratorStates::valid)
323 make_accessor();
324 else
325 particle_accessor = std::nullopt;
326 },
327 deal_ii_iterator);
328 }
329} // namespace MeltPoolDG
Definition particle_accessor.hpp:20
STL-style bidirectional iterator over particles.
Definition particle_iterator.hpp:37
bool operator!=(const ParticleIterator &c) const
Definition particle_iterator.hpp:257
std::variant< dealii::Particles::ParticleIterator< dim >, PropertyPoolIteratorData > deal_ii_iterator
Variant type for the underlying iterator.
Definition particle_iterator.hpp:177
ParticleIterator & operator--()
Definition particle_iterator.hpp:282
DEMParticleAccessor< dim, number > * operator->()
Definition particle_iterator.hpp:232
void refresh_accessor()
Definition particle_iterator.hpp:318
std::ptrdiff_t difference_type
Definition particle_iterator.hpp:40
void make_accessor()
Definition particle_iterator.hpp:300
std::optional< DEMParticleAccessor< dim, number > > particle_accessor
Definition particle_iterator.hpp:128
std::bidirectional_iterator_tag iterator_category
Definition particle_iterator.hpp:39
ParticleIterator & operator++()
Definition particle_iterator.hpp:264
DEMParticleAccessor< dim, number > & operator*()
Definition particle_iterator.hpp:214
bool operator==(const ParticleIterator &c) const
Definition particle_iterator.hpp:250
DEMParticleAccessor< dim, number > & reference
Definition particle_iterator.hpp:42
DEMParticleAccessor< dim, number > * pointer
Definition particle_iterator.hpp:43
DEMParticleAccessor< dim, number > value_type
Definition particle_iterator.hpp:41
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
Definition particle_iterator.hpp:136
bool operator==(const PropertyPoolIteratorData &c) const noexcept
Definition particle_iterator.hpp:154
void operator++() noexcept
Definition particle_iterator.hpp:142
void operator--() noexcept
Definition particle_iterator.hpp:148
dealii::IteratorState::IteratorStates state() const noexcept
Definition particle_iterator.hpp:166
bool operator!=(const PropertyPoolIteratorData &c) const noexcept
Definition particle_iterator.hpp:160
dealii::Particles::PropertyPool< dim > * dealii_property_pool
Definition particle_iterator.hpp:137
dealii::Particles::PropertyPool< dim >::Handle handle
Definition particle_iterator.hpp:138