22 std::vector<MeshLib::Node*>
const& sorted_nodes)
24 std::vector<double> distances;
25 distances.reserve(sorted_nodes.size());
26 distances.push_back(0.0);
28 double cumulative_distance = 0.0;
29 for (std::size_t i = 1; i < sorted_nodes.size(); ++i)
31 cumulative_distance +=
33 distances.push_back(cumulative_distance);
42inline std::pair<std::vector<double>, std::vector<double>>
groupSections(
43 std::vector<double>
const& distances, std::vector<double>
const& diameters)
45 if (distances.empty() || diameters.empty() ||
46 distances.size() != diameters.size())
49 "Invalid sampled diameter profile. Distances and diameters "
50 "must be non-empty and have the same size.");
53 if (std::any_of(diameters.begin(), diameters.end(),
54 [](
double d) { return d <= 0.0; }))
56 OGS_FATAL(
"All borehole diameters must be positive.");
59 std::vector<double> section_boundaries;
60 std::vector<double> section_diameters;
61 section_boundaries.push_back(distances[0]);
62 section_diameters.push_back(diameters[0]);
64 for (std::size_t i = 1; i < diameters.size(); ++i)
66 constexpr double grouping_tolerance = 1e-12;
67 if (std::abs(diameters[i] - section_diameters.back()) >
70 section_boundaries.push_back(distances[i]);
71 section_diameters.push_back(diameters[i]);
75 return {section_boundaries, section_diameters};