SPH
Distribution.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "math/rng/Rng.h"
10 #include "objects/wrappers/Flags.h"
12 
14 
15 class IDomain;
16 class IScheduler;
17 
21 class IDistribution : public Polymorphic {
22 public:
34  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const = 0;
35 };
36 
39 private:
40  AutoPtr<IRng> rng;
41 
42 public:
44  explicit RandomDistribution(AutoPtr<IRng>&& rng);
45 
49  explicit RandomDistribution(const Size seed);
50 
51  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
52 };
53 
56 private:
57  AutoPtr<IRng> rng;
58 
59 public:
60  explicit StratifiedDistribution(const Size seed);
61 
62  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
63 };
64 
66 class CubicPacking : public IDistribution {
67 public:
68  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
69 };
70 
73 public:
74  enum class Options {
79  SORTED = 1 << 0,
80 
85  CENTER = 1 << 1,
86 
91  SPH5_COMPATIBILITY = 1 << 2
92  };
93 
94 private:
95  Flags<Options> flags;
96 
97  Function<bool(Float)> progressCallback;
98 
99 public:
100  explicit HexagonalPacking(const Flags<Options> flags = Options::CENTER);
101 
102  HexagonalPacking(const Flags<Options> flags, Function<bool(Float)> progressCallback);
103 
104  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
105 };
106 
108 struct DiehlParams {
110 
115  DensityFunc particleDensity = [](const Vector&) { return 1._f; };
116 
121 
127 
131  Float strength = 0.1_f;
132 
136  Float small = 0.1_f;
137 
144 };
145 
150 private:
151  DiehlParams params;
152 
153 public:
155  explicit DiehlDistribution(const DiehlParams& params);
156 
160  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
161 };
162 
167 private:
168  Size seed;
169 
170 public:
171  explicit ParametrizedSpiralingDistribution(const Size seed);
172 
173  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
174 };
175 
180 public:
181  virtual Array<Vector> generate(IScheduler& scheduler, const Size n, const IDomain& domain) const override;
182 };
183 
Generic dynamically allocated resizable storage.
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Wrapper over enum allowing setting (and querying) individual bits of the stored value.
Generic wrappers of lambdas, functors and other callables.
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
#define NAMESPACE_SPH_END
Definition: Object.h:12
Random number generators.
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
Generic dynamically allocated resizable storage.
Definition: Array.h:43
Cubic close packing.
Definition: Distribution.h:66
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
Distribution with given particle density.
Definition: Distribution.h:149
DiehlDistribution(const DiehlParams &params)
Constructs the distribution.
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Returns generated particle distribution.
Hexagonal close packing.
Definition: Distribution.h:72
HexagonalPacking(const Flags< Options > flags=Options::CENTER)
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
@ SORTED
Particles are sorted using its Morton code.
@ SPH5_COMPATIBILITY
Generates the grid to match code SPH5 for 1-1 comparison.
@ CENTER
Move particle lattice so that their center of mass matches center of domain.
Base class for generating vertices with specific distribution.
Definition: Distribution.h:21
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const =0
Generates the requested number of particles in the domain.
Base class for computational domains.
Definition: Domain.h:29
Interface that allows unified implementation of sequential and parallelized versions of algorithms.
Definition: Scheduler.h:27
Generates particles uniformly on a line in x direction, for testing purposes.
Definition: Distribution.h:179
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
Parametrized spiraling scheme by Saff & Kuijlaars (1997).
Definition: Distribution.h:166
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
ParametrizedSpiralingDistribution(const Size seed)
Generating random positions withing the domain.
Definition: Distribution.h:38
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
RandomDistribution(AutoPtr< IRng > &&rng)
Creates a random distribution given random number generator.
Generates random positions using stratified sampling.
Definition: Distribution.h:55
virtual Array< Vector > generate(IScheduler &scheduler, const Size n, const IDomain &domain) const override
Generates the requested number of particles in the domain.
StratifiedDistribution(const Size seed)
Vector position(const Float a, const Float e, const Float u)
Computes the position on the elliptic trajectory.
Definition: TwoBody.cpp:82
Parameters of DiehlDistribution.
Definition: Distribution.h:108
Float small
Normalization value to prevent division by zero for overlapping particles.
Definition: Distribution.h:136
DensityFunc particleDensity
Function specifies the particle density in space.
Definition: Distribution.h:115
Size numOfIters
Number of iterations.
Definition: Distribution.h:126
Float strength
Magnitude of a repulsive force between particles that moves them to their final locations.
Definition: Distribution.h:131
Function< bool(Size iter, ArrayView< const Vector > r)> onIteration
Optional callback executed once every iteration.
Definition: Distribution.h:143
Size maxDifference
Allowed difference between the expected and actual number of particles.
Definition: Distribution.h:120
Base class for all polymorphic objects.
Definition: Object.h:88