SPH
Domain.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "math/AffineMatrix.h"
9 #include "objects/geometry/Box.h"
12 
14 
16 enum class SubsetType {
17  INSIDE,
18  OUTSIDE,
19 };
20 
21 
22 struct Ghost {
25 };
26 
27 
29 class IDomain : public Polymorphic {
30 public:
32  virtual Vector getCenter() const = 0;
33 
35  virtual Box getBoundingBox() const = 0;
36 
41  virtual Float getVolume() const = 0;
42 
44  virtual Float getSurfaceArea() const = 0;
45 
49  virtual bool contains(const Vector& v) const = 0;
50 
57  virtual void getSubset(ArrayView<const Vector> vs, Array<Size>& output, const SubsetType type) const = 0;
58 
67  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const = 0;
68 
75  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const = 0;
76 
93  Array<Ghost>& ghosts,
94  const Float eta = 2._f,
95  const Float eps = 0.05_f) const = 0;
96 
98 };
99 
100 
102 class SphericalDomain : public IDomain {
103 private:
104  Vector center;
105  Float radius;
106 
107 public:
108  SphericalDomain(const Vector& center, const Float& radius);
109 
110  virtual Vector getCenter() const override;
111 
112  virtual Float getVolume() const override;
113 
114  virtual Float getSurfaceArea() const override;
115 
116  virtual Box getBoundingBox() const override;
117 
118  virtual bool contains(const Vector& v) const override;
119 
120  virtual void getSubset(ArrayView<const Vector> vs,
121  Array<Size>& output,
122  const SubsetType type) const override;
123 
124  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
125 
126  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
127 
128  virtual void addGhosts(ArrayView<const Vector> vs,
129  Array<Ghost>& ghosts,
130  const Float eta,
131  const Float eps) const override;
132 
133 private:
134  INLINE bool isInsideImpl(const Vector& v) const {
135  return getSqrLength(v - this->center) <= sqr(radius);
136  }
137 };
138 
140 class EllipsoidalDomain : public IDomain {
141 private:
142  Vector center;
143 
145  Vector radii;
146 
148  Float effectiveRadius;
149 
150 public:
151  EllipsoidalDomain(const Vector& center, const Vector& axes);
152 
153  virtual Vector getCenter() const override;
154 
155  virtual Float getVolume() const override;
156 
157  virtual Float getSurfaceArea() const override;
158 
159  virtual Box getBoundingBox() const override;
160 
161  virtual bool contains(const Vector& v) const override;
162 
163  virtual void getSubset(ArrayView<const Vector> vs,
164  Array<Size>& output,
165  const SubsetType type) const override;
166 
167  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
168 
169  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
170 
171  virtual void addGhosts(ArrayView<const Vector> vs,
172  Array<Ghost>& ghosts,
173  const Float eta,
174  const Float eps) const override;
175 
176 private:
177  INLINE bool isInsideImpl(const Vector& v) const {
178  return getSqrLength((v - center) / radii) <= 1._f;
179  }
180 };
181 
182 
185 class BlockDomain : public IDomain {
186 private:
187  Box box;
188 
189 public:
190  BlockDomain(const Vector& center, const Vector& edges);
191 
192  virtual Vector getCenter() const override;
193 
194  virtual Float getVolume() const override;
195 
196  virtual Float getSurfaceArea() const override;
197 
198  virtual Box getBoundingBox() const override;
199 
200  virtual bool contains(const Vector& v) const override;
201 
202  virtual void getSubset(ArrayView<const Vector> vs,
203  Array<Size>& output,
204  const SubsetType type) const override;
205 
206  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
207 
208  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
209 
210  virtual void addGhosts(ArrayView<const Vector> vs,
211  Array<Ghost>& ghosts,
212  const Float eta,
213  const Float eps) const override;
214 };
215 
216 
218 class CylindricalDomain : public IDomain {
219 private:
220  Vector center;
221  Float radius;
222  Float height;
223  bool includeBases;
224 
225 public:
226  CylindricalDomain(const Vector& center, const Float radius, const Float height, const bool includeBases);
227 
228  virtual Vector getCenter() const override;
229 
230  virtual Float getVolume() const override;
231 
232  virtual Float getSurfaceArea() const override;
233 
234  virtual Box getBoundingBox() const override;
235 
236  virtual bool contains(const Vector& v) const override;
237 
238  virtual void getSubset(ArrayView<const Vector> vs,
239  Array<Size>& output,
240  const SubsetType type) const override;
241 
242  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
243 
244  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
245 
246  virtual void addGhosts(ArrayView<const Vector> vs,
247  Array<Ghost>& ghosts,
248  const Float eta,
249  const Float eps) const override;
250 
251 private:
252  INLINE bool isInsideImpl(const Vector& v) const {
253  return getSqrLength(Vector(v[X], v[Y], center[Z]) - center) <= sqr(radius) &&
254  sqr(v[Z] - center[Z]) <= sqr(0.5_f * height);
255  }
256 };
257 
258 
263 class HexagonalDomain : public IDomain {
264 private:
265  Vector center;
266  Float outerRadius; // bounding radius of the base
267  Float innerRadius;
268  Float height;
269  bool includeBases;
270 
271 public:
272  HexagonalDomain(const Vector& center, const Float radius, const Float height, const bool includeBases);
273 
274  virtual Vector getCenter() const override;
275 
276  virtual Float getVolume() const override;
277 
278  virtual Float getSurfaceArea() const override;
279 
280  virtual Box getBoundingBox() const override;
281 
282  virtual bool contains(const Vector& v) const override;
283 
284  virtual void getSubset(ArrayView<const Vector> vs,
285  Array<Size>& output,
286  const SubsetType type) const override;
287 
288  virtual void getDistanceToBoundary(ArrayView<const Vector>, Array<Float>&) const override;
289 
290  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
291 
292  virtual void addGhosts(ArrayView<const Vector> vs,
293  Array<Ghost>& ghosts,
294  const Float eta,
295  const Float eps) const override;
296 
297 private:
298  INLINE bool isInsideImpl(const Vector& v) const {
299  if (sqr(v[Z] - center[Z]) > sqr(0.5_f * height)) {
300  return false;
301  }
302  const Float sqrLength = getSqrLength(v);
303  if (sqrLength > sqr(outerRadius)) {
304  return false;
305  }
306  if (sqrLength <= sqr(innerRadius)) {
307  return true;
308  }
309  const Float phi = atan2(v[Y], v[X]);
310  return getSqrLength(Vector(v[X], v[Y], 0._f)) <= sqr(hexagon(phi));
311  }
312 
314  INLINE Float hexagon(const Float phi) const {
315  return 0.5_f * SQRT_3 * 1._f / sin(phi - PI / 3._f * (floor(phi / (PI / 3._f)) - 1._f));
316  }
317 };
318 
321 private:
322  Vector center;
323  Float a;
324  Float beta;
325 
326 public:
327  GaussianRandomSphere(const Vector& center, const Float radius, const Float beta, const Size seed);
328 
329  virtual Vector getCenter() const override;
330 
331  virtual Float getVolume() const override;
332 
333  virtual Float getSurfaceArea() const override;
334 
335  virtual Box getBoundingBox() const override;
336 
337  virtual bool contains(const Vector& v) const override;
338 
339  virtual void getSubset(ArrayView<const Vector> vs,
340  Array<Size>& output,
341  const SubsetType type) const override;
342 
343  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
344 
345  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
346 
347  virtual void addGhosts(ArrayView<const Vector> vs,
348  Array<Ghost>& ghosts,
349  const Float eta,
350  const Float eps) const override;
351 
352 private:
353  Float sphericalHarmonic(const Float theta, const Float phi) const;
354 };
355 
360 class HalfSpaceDomain : public IDomain {
361 public:
362  virtual Vector getCenter() const override;
363 
364  virtual Float getVolume() const override;
365 
366  virtual Float getSurfaceArea() const override;
367 
368  virtual Box getBoundingBox() const override;
369 
370  virtual bool contains(const Vector& v) const override;
371 
372  virtual void getSubset(ArrayView<const Vector> vs,
373  Array<Size>& output,
374  const SubsetType type) const override;
375 
376  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
377 
378  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
379 
380  virtual void addGhosts(ArrayView<const Vector> vs,
381  Array<Ghost>& ghosts,
382  const Float eta,
383  const Float eps) const override;
384 };
388 class TransformedDomain : public IDomain {
389 private:
390  SharedPtr<IDomain> domain;
391  AffineMatrix tm, tmInv;
392 
393 public:
394  TransformedDomain(SharedPtr<IDomain> domain, const AffineMatrix& matrix);
395 
396  virtual Vector getCenter() const override;
397 
398  virtual Float getVolume() const override;
399 
400  virtual Float getSurfaceArea() const override;
401 
402  virtual Box getBoundingBox() const override;
403 
404  virtual bool contains(const Vector& v) const override;
405 
406  virtual void getSubset(ArrayView<const Vector> vs,
407  Array<Size>& output,
408  const SubsetType type) const override;
409 
410  virtual void getDistanceToBoundary(ArrayView<const Vector> vs, Array<Float>& distances) const override;
411 
412  virtual void project(ArrayView<Vector> vs, Optional<ArrayView<Size>> indices = NOTHING) const override;
413 
414  virtual void addGhosts(ArrayView<const Vector> vs,
415  Array<Ghost>& ghosts,
416  const Float eta,
417  const Float eps) const override;
418 
419 private:
420  Array<Vector> untransform(ArrayView<const Vector> vs) const;
421 };
422 
Three-dimensional affine matrix.
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Object representing a three-dimensional axis-aligned box.
const float radius
Definition: CurveDialog.cpp:18
SubsetType
Definition: Domain.h:16
@ INSIDE
Marks all vectors inside of the domain.
@ OUTSIDE
Marks all vectors outside of the domain.
uint32_t Size
Integral type used to index arrays (by default).
Definition: Globals.h:16
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
Definition: Globals.h:13
constexpr INLINE T sqr(const T &f) noexcept
Return a squared value.
Definition: MathUtils.h:67
INLINE T sin(const T f)
Definition: MathUtils.h:296
INLINE auto floor(const T &f)
Definition: MathUtils.h:346
INLINE T atan2(const T y, const T x)
Definition: MathUtils.h:321
constexpr Float SQRT_3
Definition: MathUtils.h:367
constexpr Float PI
Mathematical constants.
Definition: MathUtils.h:361
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define NAMESPACE_SPH_END
Definition: Object.h:12
Wrapper of type value of which may or may not be present.
const NothingType NOTHING
Definition: Optional.h:16
INLINE Float getSqrLength(const Vector &v)
Definition: Vector.h:574
BasicVector< Float > Vector
Definition: Vector.h:539
@ Y
Definition: Vector.h:23
@ X
Definition: Vector.h:22
@ Z
Definition: Vector.h:24
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
Block aligned with coordinate axes, defined by its center and length of each side.
Definition: Domain.h:185
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:230
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:217
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:252
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:296
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:276
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:234
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:226
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:213
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:221
BlockDomain(const Vector &center, const Vector &edges)
Definition: Domain.cpp:210
Helper object defining three-dimensional interval (box).
Definition: Box.h:17
Cylinder aligned with z-axis, optionally including bases (can be either open or close cylinder).
Definition: Domain.h:218
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:368
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:425
CylindricalDomain(const Vector &center, const Float radius, const Float height, const bool includeBases)
Definition: Domain.cpp:338
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:351
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:347
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:355
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:364
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:400
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:388
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:359
Axis aligned ellipsoidal domain, defined by the center of sphere and lengths of three axes.
Definition: Domain.h:140
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:121
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:197
EllipsoidalDomain(const Vector &center, const Vector &axes)
Definition: Domain.cpp:114
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:125
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:129
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:140
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:167
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:144
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:136
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:176
See Muinonen 1998.
Definition: Domain.h:320
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:603
GaussianRandomSphere(const Vector &center, const Float radius, const Float beta, const Size seed)
Definition: Domain.cpp:588
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:629
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:625
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:599
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:612
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:619
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:637
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:633
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:607
Domain representing a half-space, given by z>0.
Definition: Domain.h:360
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:687
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:666
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:683
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:671
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:675
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:679
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:714
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:730
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:707
Similar to cylindrical domain, but bases are hexagons instead of circles.
Definition: Domain.h:263
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:487
virtual void getDistanceToBoundary(ArrayView< const Vector >, Array< Float > &) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:516
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:478
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:496
HexagonalDomain(const Vector &center, const Float radius, const Float height, const bool includeBases)
Definition: Domain.cpp:464
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:483
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:474
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:520
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:546
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:492
Base class for computational domains.
Definition: Domain.h:29
virtual Float getSurfaceArea() const =0
Returns the surface area of the domain.
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const =0
Returns an array of indices, marking vectors with given property by their index.
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const =0
Returns distances of particles lying close to the boundary.
virtual Box getBoundingBox() const =0
Returns the bounding box of the domain.
virtual Float getVolume() const =0
Returns the total volume of the domain.
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const =0
Projects vectors outside of the domain onto its boundary.
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta=2._f, const Float eps=0.05_f) const =0
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
virtual bool contains(const Vector &v) const =0
Checks if the given point lies inside the domain.
virtual Vector getCenter() const =0
Returns the center of the domain.
Wrapper of type value of which may or may not be present.
Definition: Optional.h:23
Spherical domain, defined by the center of sphere and its radius.
Definition: Domain.h:102
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:22
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:26
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:58
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:86
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:35
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:18
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:14
SphericalDomain(const Vector &center, const Float &radius)
Definition: Domain.cpp:10
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:31
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:66
Transform another domain by given transformation matrix.
Definition: Domain.h:388
virtual void getSubset(ArrayView< const Vector > vs, Array< Size > &output, const SubsetType type) const override
Returns an array of indices, marking vectors with given property by their index.
Definition: Domain.cpp:793
virtual Float getVolume() const override
Returns the total volume of the domain.
Definition: Domain.cpp:765
virtual void getDistanceToBoundary(ArrayView< const Vector > vs, Array< Float > &distances) const override
Returns distances of particles lying close to the boundary.
Definition: Domain.cpp:799
virtual void project(ArrayView< Vector > vs, Optional< ArrayView< Size >> indices=NOTHING) const override
Projects vectors outside of the domain onto its boundary.
Definition: Domain.cpp:803
virtual Float getSurfaceArea() const override
Returns the surface area of the domain.
Definition: Domain.cpp:769
virtual void addGhosts(ArrayView< const Vector > vs, Array< Ghost > &ghosts, const Float eta, const Float eps) const override
Duplicates positions located close to the boundary, placing copies ("ghosts") symmetrically to the ot...
Definition: Domain.cpp:807
TransformedDomain(SharedPtr< IDomain > domain, const AffineMatrix &matrix)
Definition: Domain.cpp:755
virtual Vector getCenter() const override
Returns the center of the domain.
Definition: Domain.cpp:761
virtual bool contains(const Vector &v) const override
Checks if the given point lies inside the domain.
Definition: Domain.cpp:789
virtual Box getBoundingBox() const override
Returns the bounding box of the domain.
Definition: Domain.cpp:774
Definition: Domain.h:22
Size index
Index into the original array of vectors.
Definition: Domain.h:24
Vector position
Position of the ghost.
Definition: Domain.h:23
Base class for all polymorphic objects.
Definition: Object.h:88