OGS
ProcessLib::HeatTransportBHE::BHE::DiameterProfile Struct Reference

Detailed Description

Definition at line 19 of file DiameterProfile.h.

#include <DiameterProfile.h>

Public Member Functions

 DiameterProfile (std::vector< double > bounds, std::vector< double > diams)
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.
double diameterAtDistance (double distance_from_wellhead) const
 Get diameter at a given distance from wellhead.
double areaAtDistance (double distance_from_wellhead) const
 Get cross-sectional area at a given distance from wellhead.
double diameterAtSection (int const section_index) const
 Get diameter for a specific section.
double areaAtSection (int const section_index) const
 Get cross-sectional area for a specific section.
int getNumberOfSections () const
 Get the number of sections.

Public Attributes

std::vector< double > const section_boundaries
std::vector< double > const section_diameters

Static Private Member Functions

static double circleArea (double const diameter)

Constructor & Destructor Documentation

◆ DiameterProfile()

ProcessLib::HeatTransportBHE::BHE::DiameterProfile::DiameterProfile ( std::vector< double > bounds,
std::vector< double > diams )
inline

Definition at line 21 of file DiameterProfile.h.

22 : section_boundaries(std::move(bounds)),
23 section_diameters(std::move(diams))
24 {
25 if (section_boundaries.empty() || section_diameters.empty())
26 {
27 OGS_FATAL("DiameterProfile: vectors must be non-empty.");
28 }
29 if (section_boundaries.size() != section_diameters.size())
30 {
32 "DiameterProfile: section_boundaries (size {:d}) and "
33 "section_diameters (size {:d}) must have the same size.",
35 }
36 if (std::any_of(section_diameters.begin(), section_diameters.end(),
37 [](double d) { return d <= 0.0; }))
38 {
39 OGS_FATAL("DiameterProfile: all diameters must be positive.");
40 }
41 if (std::adjacent_find(section_boundaries.begin(),
43 std::greater_equal<>{}) !=
45 {
47 "DiameterProfile: section_boundaries must be strictly "
48 "increasing.");
49 }
50 }
#define OGS_FATAL(...)
Definition Error.h:19

References section_boundaries, and section_diameters.

Member Function Documentation

◆ areaAtDistance()

double ProcessLib::HeatTransportBHE::BHE::DiameterProfile::areaAtDistance ( double distance_from_wellhead) const
inline

Get cross-sectional area at a given distance from wellhead.

Parameters
distance_from_wellheadDistance from wellhead [m].
Returns
Cross-sectional area [m^2] for the corresponding section.

Definition at line 80 of file DiameterProfile.h.

81 {
82 return circleArea(diameterAtDistance(distance_from_wellhead));
83 }
double diameterAtDistance(double distance_from_wellhead) const
Get diameter at a given distance from wellhead.
static double circleArea(double const diameter)

References circleArea(), and diameterAtDistance().

◆ areaAtSection()

double ProcessLib::HeatTransportBHE::BHE::DiameterProfile::areaAtSection ( int const section_index) const
inline

Get cross-sectional area for a specific section.

Parameters
section_indexSection index (0-based).
Returns
Cross-sectional area [m²].

Definition at line 101 of file DiameterProfile.h.

102 {
103 return circleArea(diameterAtSection(section_index));
104 }
double diameterAtSection(int const section_index) const
Get diameter for a specific section.

References circleArea(), and diameterAtSection().

◆ circleArea()

double ProcessLib::HeatTransportBHE::BHE::DiameterProfile::circleArea ( double const diameter)
inlinestaticprivate

Definition at line 114 of file DiameterProfile.h.

115 {
116 return std::numbers::pi * diameter * diameter / 4;
117 }

Referenced by areaAtDistance(), and areaAtSection().

◆ diameterAtDistance()

double ProcessLib::HeatTransportBHE::BHE::DiameterProfile::diameterAtDistance ( double distance_from_wellhead) const
inline

Get diameter at a given distance from wellhead.

Parameters
distance_from_wellheadDistance from wellhead [m].
Returns
Diameter [m] for the corresponding section.

Definition at line 72 of file DiameterProfile.h.

73 {
74 return section_diameters[getSectionIndex(distance_from_wellhead)];
75 }
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.

References getSectionIndex(), and section_diameters.

Referenced by areaAtDistance().

◆ diameterAtSection()

double ProcessLib::HeatTransportBHE::BHE::DiameterProfile::diameterAtSection ( int const section_index) const
inline

Get diameter for a specific section.

Parameters
section_indexSection index (0-based).
Returns
Diameter [m].

Definition at line 88 of file DiameterProfile.h.

89 {
90 if (section_index < 0 ||
91 section_index >= static_cast<int>(section_diameters.size()))
92 {
93 OGS_FATAL("Invalid section index: {:d}", section_index);
94 }
95 return section_diameters[section_index];
96 }

References OGS_FATAL, and section_diameters.

Referenced by areaAtSection().

◆ getNumberOfSections()

int ProcessLib::HeatTransportBHE::BHE::DiameterProfile::getNumberOfSections ( ) const
inline

Get the number of sections.

Returns
Number of sections.

Definition at line 108 of file DiameterProfile.h.

109 {
110 return static_cast<int>(section_diameters.size());
111 }

References section_diameters.

◆ getSectionIndex()

int ProcessLib::HeatTransportBHE::BHE::DiameterProfile::getSectionIndex ( double distance_from_wellhead) const
inline

Find the section index for a given distance from wellhead. Uses binary search for O(log n) lookup.

Parameters
distance_from_wellheadDistance from wellhead [m].
Returns
Section index (0-based). Returns last section if distance exceeds last boundary.

Definition at line 120 of file DiameterProfile.h.

121{
122 if (distance_from_wellhead < section_boundaries.front())
123 {
124 OGS_FATAL(
125 "Distance from wellhead is negative or before first section: "
126 "{:g}",
127 distance_from_wellhead);
128 }
129
130 // Binary search to find the section.
131 // Find the first boundary that is greater than distance_from_wellhead.
132 auto it = std::upper_bound(section_boundaries.begin(),
133 section_boundaries.end(),
134 distance_from_wellhead);
135
136 // Move back one position to get the section containing this distance.
137 if (it != section_boundaries.begin())
138 {
139 --it;
140 }
141
142 return static_cast<int>(std::distance(section_boundaries.begin(), it));
143}

References OGS_FATAL, and section_boundaries.

Referenced by diameterAtDistance().

Member Data Documentation

◆ section_boundaries

std::vector<double> const ProcessLib::HeatTransportBHE::BHE::DiameterProfile::section_boundaries

Cumulative distances from wellhead [m] marking section boundaries. section_boundaries[i] marks the start of section i. Length = number of sections.

Definition at line 55 of file DiameterProfile.h.

Referenced by DiameterProfile(), and getSectionIndex().

◆ section_diameters

std::vector<double> const ProcessLib::HeatTransportBHE::BHE::DiameterProfile::section_diameters

Diameters [m] for each section. section_diameters[i] is the diameter for section i. Length = number of sections.

Definition at line 60 of file DiameterProfile.h.

Referenced by DiameterProfile(), diameterAtDistance(), diameterAtSection(), and getNumberOfSections().


The documentation for this struct was generated from the following file: