OGS
BHESectionUtils.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <algorithm>
7#include <cmath>
8#include <vector>
9
10#include "BaseLib/Error.h"
11#include "MathLib/Point3d.h"
12#include "MeshLib/Node.h"
13
14namespace ProcessLib
15{
16namespace HeatTransportBHE
17{
18namespace BHE
19{
21inline std::vector<double> cumulativeDistances(
22 std::vector<MeshLib::Node*> const& sorted_nodes)
23{
24 std::vector<double> distances;
25 distances.reserve(sorted_nodes.size());
26 distances.push_back(0.0);
27
28 double cumulative_distance = 0.0;
29 for (std::size_t i = 1; i < sorted_nodes.size(); ++i)
30 {
31 cumulative_distance +=
32 std::sqrt(MathLib::sqrDist(*sorted_nodes[i - 1], *sorted_nodes[i]));
33 distances.push_back(cumulative_distance);
34 }
35
36 return distances;
37}
38
42inline std::pair<std::vector<double>, std::vector<double>> groupSections(
43 std::vector<double> const& distances, std::vector<double> const& diameters)
44{
45 if (distances.empty() || diameters.empty() ||
46 distances.size() != diameters.size())
47 {
49 "Invalid sampled diameter profile. Distances and diameters "
50 "must be non-empty and have the same size.");
51 }
52
53 if (std::any_of(diameters.begin(), diameters.end(),
54 [](double d) { return d <= 0.0; }))
55 {
56 OGS_FATAL("All borehole diameters must be positive.");
57 }
58
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]);
63
64 for (std::size_t i = 1; i < diameters.size(); ++i)
65 {
66 constexpr double grouping_tolerance = 1e-12;
67 if (std::abs(diameters[i] - section_diameters.back()) >
68 grouping_tolerance)
69 {
70 section_boundaries.push_back(distances[i]);
71 section_diameters.push_back(diameters[i]);
72 }
73 }
74
75 return {section_boundaries, section_diameters};
76}
77} // namespace BHE
78} // namespace HeatTransportBHE
79} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
double sqrDist(MathLib::Point3d const &p0, MathLib::Point3d const &p1)
Definition Point3d.cpp:19
std::pair< std::vector< double >, std::vector< double > > groupSections(std::vector< double > const &distances, std::vector< double > const &diameters)
std::vector< double > cumulativeDistances(std::vector< MeshLib::Node * > const &sorted_nodes)
Compute cumulative arc-length distances from the first node.