OGS
CreateBHEUType.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 "CreateBHEUType.h"
5
6#include <algorithm>
7#include <cmath>
8
9#include "BHE_1U.h"
10#include "BHE_2U.h"
11#include "BaseLib/ConfigTree.h"
12#include "BaseLib/Error.h"
14namespace ProcessLib
15{
16namespace HeatTransportBHE
17{
18namespace BHE
19{
23 BaseLib::ConfigTree const& config,
24 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
25 std::map<std::string,
26 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
27 curves,
28 std::vector<MeshLib::Node*> const& bhe_nodes)
29{
30 // if the BHE is using python boundary condition
31 auto const bhe_if_use_python_bc_conf =
33 config.getConfigParameter<bool>("use_bhe_pipe_network", false);
34 DBUG("If using python boundary condition : {:s}",
35 (bhe_if_use_python_bc_conf) ? "true" : "false");
36
37 auto const borehole_geometry =
39 createBoreholeGeometry(config.getConfigSubtree("borehole"), parameters,
40 bhe_nodes);
41
43 auto const& pipes_config = config.getConfigSubtree("pipes");
45 Pipe const inlet_pipe = createPipe(pipes_config.getConfigSubtree("inlet"));
46 Pipe const outlet_pipe =
48 createPipe(pipes_config.getConfigSubtree("outlet"));
49 const auto pipe_distance =
51 pipes_config.getConfigParameter<double>("distance_between_pipes");
52 const auto pipe_longitudinal_dispersion_length =
54 pipes_config.getConfigParameter<double>(
55 "longitudinal_dispersion_length");
56 PipeConfigurationUType const pipes{inlet_pipe, outlet_pipe, pipe_distance,
57 pipe_longitudinal_dispersion_length};
58
59 if (pipe_distance <= 0)
60 {
62 "distance_between_pipes must be positive for U-type BHEs, got "
63 "{:g}.",
64 pipe_distance);
65 }
66
67 double const d0 =
68 std::max(pipes.inlet.outsideDiameter(), pipes.outlet.outsideDiameter());
69 if (pipe_distance < d0)
70 {
72 "distance_between_pipes ({:g}) must be >= pipe outside diameter "
73 "({:g}) for valid U-type thermal resistance formulas.",
74 pipe_distance, d0);
75 }
76
77 for (int section_index = 0;
78 section_index < borehole_geometry.sections.getNumberOfSections();
79 ++section_index)
80 {
81 double const D =
82 borehole_geometry.sections.diameterAtSection(section_index);
83 if (D <= 2.0 * d0)
84 {
86 "Invalid U-type geometry at section {:d}: borehole diameter "
87 "{:g} must be greater than 2*pipe outside diameter {:g}.",
88 section_index, D, 2.0 * d0);
89 }
90
91 double const acosh_argument =
92 (D * D + d0 * d0 - pipe_distance * pipe_distance) / (2.0 * D * d0);
93 if (!std::isfinite(acosh_argument) || acosh_argument < 1.0)
94 {
96 "Invalid U-type geometry at section {:d}: acosh argument "
97 "for grout resistance is {:g}, must be >= 1. "
98 "(D={:g}, d0={:g}, distance_between_pipes={:g})",
99 section_index, acosh_argument, D, d0, pipe_distance);
100 }
101 }
102
104 auto const grout = createGroutParameters(config.getConfigSubtree("grout"));
105
106 auto const refrigerant =
108 createRefrigerantProperties(config.getConfigSubtree("refrigerant"));
109
110 auto const flowAndTemperatureControl = createFlowAndTemperatureControl(
112 config.getConfigSubtree("flow_and_temperature_control"),
113 parameters,
114 curves,
115 refrigerant);
116
117 return {borehole_geometry, refrigerant, grout,
118 flowAndTemperatureControl, pipes, bhe_if_use_python_bc_conf};
119}
120
121template <typename T_BHE>
123 BaseLib::ConfigTree const& config,
124 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
125 std::map<std::string,
126 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
127 curves,
128 std::vector<MeshLib::Node*> const& bhe_nodes)
129{
130 auto UType = parseBHEUTypeConfig(config, parameters, curves, bhe_nodes);
131 return {std::get<0>(UType), std::get<1>(UType), std::get<2>(UType),
132 std::get<3>(UType), std::get<4>(UType), std::get<5>(UType)};
133}
134
136 BaseLib::ConfigTree const& config,
137 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
138 std::map<std::string,
139 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
140 curves,
141 std::vector<MeshLib::Node*> const& bhe_nodes);
142
144 BaseLib::ConfigTree const& config,
145 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
146 std::map<std::string,
147 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
148 curves,
149 std::vector<MeshLib::Node*> const& bhe_nodes);
150} // namespace BHE
151} // namespace HeatTransportBHE
152} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
T getConfigParameter(std::string const &param) const
ConfigTree getConfigSubtree(std::string const &root) const
RefrigerantProperties createRefrigerantProperties(BaseLib::ConfigTree const &config)
BoreholeGeometry createBoreholeGeometry(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::vector< MeshLib::Node * > const &bhe_nodes)
Pipe createPipe(BaseLib::ConfigTree const &config)
Definition Pipe.cpp:15
T_BHE createBHEUType(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::vector< MeshLib::Node * > const &bhe_nodes)
FlowAndTemperatureControl createFlowAndTemperatureControl(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, RefrigerantProperties const &refrigerant)
template BHE_2U createBHEUType< BHE_2U >(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::vector< MeshLib::Node * > const &bhe_nodes)
static std::tuple< BoreholeGeometry, RefrigerantProperties, GroutParameters, FlowAndTemperatureControl, PipeConfigurationUType, bool > parseBHEUTypeConfig(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::vector< MeshLib::Node * > const &bhe_nodes)
template BHE_1U createBHEUType< BHE_1U >(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::vector< MeshLib::Node * > const &bhe_nodes)
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl
GroutParameters createGroutParameters(BaseLib::ConfigTree const &config)