27 OGS_FATAL(
"DiameterProfile: vectors must be non-empty.");
32 "DiameterProfile: section_boundaries (size {:d}) and "
33 "section_diameters (size {:d}) must have the same size.",
34 section_boundaries.size(), section_diameters.size());
37 [](
double d) { return d <= 0.0; }))
39 OGS_FATAL(
"DiameterProfile: all diameters must be positive.");
43 std::greater_equal<>{}) !=
47 "DiameterProfile: section_boundaries must be strictly "
90 if (section_index < 0 ||
93 OGS_FATAL(
"Invalid section index: {:d}", section_index);
116 return std::numbers::pi * diameter * diameter / 4;
125 "Distance from wellhead is negative or before first section: "
127 distance_from_wellhead);
134 distance_from_wellhead);
double diameterAtDistance(double distance_from_wellhead) const
Get diameter at a given distance from wellhead.
double diameterAtSection(int const section_index) const
Get diameter for a specific section.
std::vector< double > const section_boundaries
double areaAtDistance(double distance_from_wellhead) const
Get cross-sectional area at a given distance from wellhead.
double areaAtSection(int const section_index) const
Get cross-sectional area for a specific section.
int getSectionIndex(double distance_from_wellhead) const
Find the section index for a given distance from wellhead. Uses binary search for O(log n) lookup.
int getNumberOfSections() const
Get the number of sections.
std::vector< double > const section_diameters
DiameterProfile(std::vector< double > bounds, std::vector< double > diams)
static double circleArea(double const diameter)