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 {