127 std::vector<std::size_t> idx(v.size());
128 std::iota(idx.begin(), idx.end(), 0);
131 std::sort(idx.begin(), idx.end(),
132 [&v](std::size_t i1, std::size_t i2) { return v[i1] < v[i2]; });
146 std::vector<double> distances;
159 std::vector<int> subcluster_ids;
161 std::vector<double> log_pcounts;
162 std::vector<double> log_diameters;
163 double last_dist = 0;
164 for (
auto const idx : particle_indices) {
165 subcluster_ids.push_back(
particles[idx]);
166 if (distances[idx] < last_dist +
dr)
169 last_dist = distances[idx];
170 if (subcluster_ids.size() == 1)
173 log_pcounts.push_back(log(
static_cast<double>(subcluster_ids.size())));
174 log_diameters.push_back(log(current_rg * 2.0));
176 double c0, c1, cov00, cov01, cov11, sumsq;
177 gsl_fit_linear(log_diameters.data(), 1, log_pcounts.data(), 1,
178 log_pcounts.size(), &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
179 double mean_sq_residual = sumsq /
static_cast<double>(log_diameters.size());
180 return {c1, mean_sq_residual};
182 runtimeErrorMsg() <<
"GSL (gnu scientific library) is required for fractal "
183 "dimension calculation.";