46template <
typename Particle>
48 using namespace autopas::utils::ArrayMath::literals;
52 const auto domainVolume = domainDimensions[0] * domainDimensions[1] * domainDimensions[2];
56 const auto targetNumberOfBins = std::ceil(numberOfParticles / 10.);
57 const auto targetNumberOfBinsPerDim = std::cbrt(
static_cast<double>(targetNumberOfBins));
59 const auto numberOfBinsPerDim =
static_cast<int>(std::floor(targetNumberOfBinsPerDim));
60 const auto binDimensions = domainDimensions /
static_cast<double>(numberOfBinsPerDim);
62 const auto numberOfBins = numberOfBinsPerDim * numberOfBinsPerDim * numberOfBinsPerDim;
63 const auto binVolume = domainVolume /
static_cast<double>(numberOfBins);
65 std::vector<size_t> particlesPerBin(numberOfBins, 0);
68 for (
auto particleItr = container.
begin(autopas::IteratorBehavior::owned); particleItr.isValid(); ++particleItr) {
69 const auto &particleLocation = particleItr->getR();
71 const auto binIndex3dUnsafe =
82 const auto binIndex3DSafe = [&]() {
83 auto newBinIndex3D = binIndex3dUnsafe;
84 for (
int dim = 0; dim < 3; ++dim) {
85 if (particleLocation[dim] > container.
getBoxMin()[dim] or particleLocation[dim] < container.
getBoxMax()[dim]) {
86 newBinIndex3D[dim] = std::clamp(binIndex3dUnsafe[dim], 0, numberOfBinsPerDim - 1);
89 "calculateHomogeneityAndMaxDensity: Particle is outside the container!");
96 binIndex3DSafe, {numberOfBinsPerDim, numberOfBinsPerDim, numberOfBinsPerDim});
98 particlesPerBin[binIndex1d] += 1;
102 double maxDensity{0.};
103 std::vector<double> densityPerBin{};
104 densityPerBin.reserve(numberOfBins);
105 for (
auto i = 0; i < numberOfBins; i++) {
106 densityPerBin.push_back(
static_cast<double>(particlesPerBin[i]) / binVolume);
107 maxDensity = std::max(maxDensity, densityPerBin[i]);
110 if (maxDensity < 0.0) {
112 "calculateHomogeneityAndMaxDensity(): maxDensity can never be smaller than 0.0, but is: {}", maxDensity);
115 const double densityMean = numberOfParticles / domainVolume;
117 const double densityDifferenceSquaredSum = std::transform_reduce(densityPerBin.begin(), densityPerBin.end(), 0.0,
118 std::plus<>(), [densityMean](
double density) {
119 double densityDifference = density - densityMean;
120 return densityDifference * densityDifference;
123 const auto densityVariance = densityDifferenceSquaredSum / numberOfBins;
127 const double homogeneity = numberOfParticles == 0 ? 0. : std::sqrt(densityVariance);
129 if (homogeneity < 0.0) {
131 "calculateHomogeneityAndMaxDensity(): homogeneity can never be smaller than 0.0, but is: {}", homogeneity);
133 return {homogeneity, maxDensity};
The ParticleContainerInterface class provides a basic interface for all Containers within AutoPas.
Definition: ParticleContainerInterface.h:37
virtual const std::array< double, 3 > & getBoxMin() const =0
Get the lower corner of the container without halo.
virtual const std::array< double, 3 > & getBoxMax() const =0
Get the upper corner of the container without halo.
virtual ContainerIterator< ParticleType, true, false > begin(IteratorBehavior behavior=autopas::IteratorBehavior::ownedOrHalo, typename ContainerIterator< ParticleType, true, false >::ParticleVecType *additionalVectors=nullptr)=0
Iterate over all particles using for(auto iter = container.begin(); iter.isValid(); ++iter) .
virtual size_t getNumberOfParticles(IteratorBehavior behavior=IteratorBehavior::owned) const =0
Get the number of particles with respect to the specified IteratorBehavior.
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:63
constexpr std::array< int, SIZE > floorToInt(const std::array< T, SIZE > &a)
Floors all array elements and converts them to integers.
Definition: ArrayMath.h:332
constexpr T threeToOneD(T x, T y, T z, const std::array< T, 3 > &dims)
Convert a 3d index to a 1d index.
Definition: ThreeDimensionalMapping.h:29
In this namespace some helper classes and functions can be found used inside of AutoPas.
Definition: namespaces.h:44
std::pair< double, double > calculateHomogeneityAndMaxDensity(const ParticleContainerInterface< Particle > &container)
Calculates homogeneity and max density of given AutoPas container.
Definition: SimilarityFunctions.h:47