9 std::uniform_real_distribution<> randomDist(0, 1);
16 particle.setDebugX(x);
17 particle.setDebugH(0.0);
21 particle.setSearchRadius(searchRadius);
23 particle.setParallelState(T::ParallelState::Virtual);
34 std::vector<T*> result;
36 double continuousParticlesPerAxis = voxelH(0) / spacing;
37 int particlesPerAxis =
static_cast<int>(std::floor(continuousParticlesPerAxis));
38 continuousParticlesPerAxis -= particlesPerAxis;
39 assertion4(continuousParticlesPerAxis >= 0.0, continuousParticlesPerAxis, particlesPerAxis, voxelH(0), spacing);
40 assertion4(continuousParticlesPerAxis <= 1.0, continuousParticlesPerAxis, particlesPerAxis, voxelH(0), spacing);
42 const double areaOfGridSpannedByCellLocalCartesianGridAlongOneAxis = particlesPerAxis * spacing;
45 if (particlesPerAxis > 0) {
46 const double particleSpacing = voxelH(0) / particlesPerAxis;
49 offset = voxelX - 0.5 * areaOfGridSpannedByCellLocalCartesianGridAlongOneAxis;
51 dfor(k, particlesPerAxis) {
53 T* newParticle =
new T();
56 for (
int d = 0; d < Dimensions; d++) {
57 x(d) += (randomDist(e2) - 0.5) * particleSpacing;
62 result.push_back(newParticle);
81 "createParticlesAlignedWithGlobalCartesianMesh(...)", spacing, voxelX, domainOffset, addNoise
83 std::vector<T*> result;
89 for (
int d = 0; d < Dimensions; d++) {
90 int leftParticleNumberAlongAxis =
static_cast<int>(
91 std::round((voxelX(d) - 0.5 * voxelH(d) - biasedOffset(d)) / spacing)
93 int rightParticleNumberAlongAxis =
static_cast<int>(
94 std::round((voxelX(d) + 0.5 * voxelH(d) - biasedOffset(d)) / spacing)
97 double leftX = biasedOffset(d) + spacing * leftParticleNumberAlongAxis;
98 double rightX = biasedOffset(d) + spacing * rightParticleNumberAlongAxis;
102 leftParticleNumberAlongAxis++;
104 rightParticleNumberAlongAxis--;
106 particlesPerAxis(d) = std::max(0, rightParticleNumberAlongAxis - leftParticleNumberAlongAxis + 1);
107 firstParticleX(d) = biasedOffset(d) + spacing * leftParticleNumberAlongAxis;
110 const double RelativeAccuracyForGeometricChecks = 0.01 * voxelH(0);
112 dfor(k, particlesPerAxis) {
115 T* newParticle =
new T();
118 for (
int d = 0; d < Dimensions; d++) {
119 x(d) += (randomDist(e2) - 0.5) * spacing;
124 result.push_back(newParticle);
#define assertion4(expr, param0, param1, param2, param3)
#define logTraceOutWith1Argument(methodName, argument0)
#define logTraceInWith4Arguments(methodName, argument0, argument1, argument2, argument3)
#define dfor(counter, max)
d-dimensional Loop
tarch::logging::Log _log("exahype2::fv")
Vector< Size, Scalar > remainder(const Vector< Size, Scalar > &vector, double h)
Return the remainder of a division.
static bool smaller(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE) InlineMethod
Smaller operator for floating point values.
bool greater(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE)
bool smallerEquals(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE)
bool equals(const Matrix< Rows, Cols, Scalar > &lhs, const Matrix< Rows, Cols, Scalar > &rhs, const Scalar &tolerance=NUMERICAL_ZERO_DIFFERENCE)
Compares to matrices on equality by means of a numerical accuracy.
Scalar min(const Vector< Size, Scalar > &vector)
Returns the element with minimal value (NOT absolute value).
std::vector< T * > createParticlesAlignedWithGlobalCartesianMesh(double spacingH, const tarch::la::Vector< Dimensions, double > &voxelX, const tarch::la::Vector< Dimensions, double > &voxelH, const tarch::la::Vector< Dimensions, double > &domainOffset, const tarch::la::Vector< Dimensions, double > &domainSize, bool addNoise)
Insert particles that are aligned along a Cartesian grid globally.
std::vector< T * > createEquallySpacedParticles(double spacingH, const tarch::la::Vector< Dimensions, double > &voxelX, const tarch::la::Vector< Dimensions, double > &voxelH, bool addNoise)
Create equally spaced particles for one cell.
void init(T &particle, const tarch::la::Vector< Dimensions, double > &x, double searchRadius)
Init particle.