OGS
BoreholeGeometry.cpp
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#include "BoreholeGeometry.h"
5
6#include "BHESectionUtils.h"
8#include "MeshLib/Node.h"
11
12namespace ProcessLib
13{
14namespace HeatTransportBHE
15{
16namespace BHE
17{
19 double borehole_length,
20 ParameterLib::Parameter<double> const& diameter_parameter,
21 std::vector<MeshLib::Node*> const& bhe_nodes)
22{
23 auto const distances = cumulativeDistances(bhe_nodes);
24
25 // Sample diameters at each node
26 std::vector<double> diameters;
27 diameters.reserve(bhe_nodes.size());
28 for (auto const* const node : bhe_nodes)
29 {
31 pos.setNodeID(node->getID());
32 pos.setCoordinates(*node);
33 auto const diameter = diameter_parameter(0.0 /*t*/, pos)[0];
34 if (diameter <= 0)
35 {
37 "Non-positive borehole diameter {:g} at node {:d} "
38 "(x={:g}, y={:g}, z={:g}).",
39 diameter, node->getID(), (*node)[0], (*node)[1], (*node)[2]);
40 }
41 diameters.push_back(diameter);
42 }
43
44 auto [section_boundaries, section_diameters] =
45 groupSections(distances, diameters);
46
47 return {borehole_length,
48 {std::move(section_boundaries), std::move(section_diameters)},
49 &diameter_parameter};
50}
51
53 std::vector<MeshLib::Node*> const& new_nodes) const
54{
55 if (!diameter_param)
56 {
58 "Cannot rebuild borehole geometry: no diameter parameter stored. "
59 "This geometry was not created from a parameter-based config.");
60 }
61 return buildBoreholeGeometry(length, *diameter_param, new_nodes);
62}
63
65 BaseLib::ConfigTree const& config,
66 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
67 std::vector<MeshLib::Node*> const& bhe_nodes)
68{
69 const auto borehole_length =
71 config.getConfigParameter<double>("length");
72 if (borehole_length <= 0)
73 {
74 OGS_FATAL("Borehole length must be positive, got {:g}.",
75 borehole_length);
76 }
77
78 auto const diameter_parameter_or_value =
80 config.getConfigParameter<std::string>("diameter");
81 auto const& diameter_parameter =
83 diameter_parameter_or_value, parameters, "borehole_diameter",
84 "borehole_diameter");
85
86 return buildBoreholeGeometry(borehole_length, diameter_parameter,
87 bhe_nodes);
88}
89} // namespace BHE
90} // namespace HeatTransportBHE
91} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
T getConfigParameter(std::string const &param) const
void setNodeID(std::size_t node_id)
void setCoordinates(MathLib::Point3d const &coordinates)
Parameter< double > & getNamedOrCreateInlineParameter(std::string const &parameter_or_value, std::vector< std::unique_ptr< ParameterBase > > &parameters, std::string const &property_name, std::string const &inline_suffix)
BoreholeGeometry createBoreholeGeometry(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::vector< MeshLib::Node * > const &bhe_nodes)
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.
static BoreholeGeometry buildBoreholeGeometry(double borehole_length, ParameterLib::Parameter< double > const &diameter_parameter, std::vector< MeshLib::Node * > const &bhe_nodes)
ParameterLib::Parameter< double > const * diameter_param
BoreholeGeometry rebuildForNodes(std::vector< MeshLib::Node * > const &new_nodes) const