From 46fe2af677c84137b4d127ce647140623275c96d Mon Sep 17 00:00:00 2001 From: Mikael Lund Date: Thu, 29 Jun 2023 15:13:22 +0200 Subject: [PATCH] Stop after max trials in electric potential calc. Sampling in dense environments could cause an infinite loop of no free space is found. This break after a certain (hardcoded) number of attempts and gives a warning. --- src/analysis.cpp | 13 +++++++++++++ src/analysis.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/analysis.cpp b/src/analysis.cpp index 4c0a75774..fa80b4627 100644 --- a/src/analysis.cpp +++ b/src/analysis.cpp @@ -2263,13 +2263,26 @@ void ElectricPotential::setPolicy(const json& j) { stride = j.at("stride").get(); output_information["stride"] = stride; applyPolicy = [&, stride] { + unsigned int cnt = 0; auto origin = targets.begin(); do { spc.geometry.randompos(origin->position, random); + cnt++; + if (cnt > max_overlap_trials) { + faunus_logger->warn("{}: Max number of overlaps reached. Using overlapping point", name); + break; + } } while (overlapWithParticles(origin->position)); + + cnt = 0; std::for_each(std::next(origin), targets.end(), [&](Target& target) { do { target.position = origin->position + stride * randomUnitVector(random); + cnt++; + if (cnt > max_overlap_trials) { + faunus_logger->warn("{}: Max number of overlaps reached. Using overlapping point", name); + break; + } } while (overlapWithParticles(target.position)); std::advance(origin, 1); }); diff --git a/src/analysis.h b/src/analysis.h index 98c25cd6d..09f5ad1ef 100644 --- a/src/analysis.h +++ b/src/analysis.h @@ -228,6 +228,7 @@ class ElectricPotential : public Analysis { enum class Policies { FIXED, RANDOM_WALK, RANDOM_WALK_NO_OVERLAP, INVALID }; private: + unsigned int max_overlap_trials = 100; //!< Maximum number of overlap checks before bailing out double histogram_resolution = 0.01; //!< Potential resolution unsigned int calculations_per_sample_event = 1; struct Target {