From cfbcf4050b7876d96b0ca900fa8636348e5bb4ae Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Tue, 19 Feb 2019 17:53:24 +0100 Subject: [PATCH] Use position variance to perturb positions in IPositionBuilder --- .../Views/RealSpaceWidgets/IPositionBuilder.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp index 57ad6d11dd9..be7b71a0f82 100644 --- a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp +++ b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp @@ -31,6 +31,17 @@ std::vector<std::vector<double>> IPositionBuilder::generatePositions(double laye double density) const { std::vector<std::vector<double>> positions = generatePositionsImpl(layer_size, density); + double pos_var = positionVariance(); + if (pos_var > 0.0) { + // random generator and distribution + std::random_device rd; // Will be used to obtain a seed for the random number engine + std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() + std::normal_distribution<double> dis(0.0, std::sqrt(pos_var)); + for (auto& position : positions) { + for (auto& coordinate : position) + coordinate += dis(gen); + } + } return positions; } @@ -66,7 +77,7 @@ std::vector<std::vector<double>> RandomPositionBuilder::generatePositionsImpl(do // random generator and distribution std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() - std::uniform_real_distribution<> dis(0.0, 1.0); + std::uniform_real_distribution<double> dis(0.0, 1.0); for (int i = 1; i <= num_particles; ++i) { // generate random x and y coordinates @@ -100,7 +111,8 @@ std::vector<std::vector<double>> Lattice1DPositionBuilder::generatePositionsImpl // Take the maximum possible integer multiple of the lattice vector required // for populating particles correctly within the 3D model's boundaries - unsigned n1 = length == 0.0 ? 2 : static_cast<unsigned>(layer_size * std::sqrt(2.0) / length); + unsigned n1 = + length == 0.0 ? 2 : static_cast<unsigned>(2.0 * layer_size * std::sqrt(2.0) / length); return Generate2DLatticePoints(length, 0.0, 0.0, xi, n1, 1u); } -- GitLab