OGS
BHE_1P.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 "BHE_1P.h"
5
6#include <numbers>
7
11#include "Physics.h"
14
15namespace ProcessLib
16{
18{
19namespace BHE
20{
25 PipeConfiguration1PType const& pipes,
26 bool const use_python_bcs)
29 _pipe(pipes)
30{
31 // Initialize thermal resistances.
32 auto values = visit(
33 [&](auto const& control)
34 {
35 return control(refrigerant.reference_temperature,
36 0. /* initial time */);
37 },
39 updateHeatTransferCoefficients(values.flow_rate);
40}
41
42std::array<double, BHE_1P::number_of_unknowns> BHE_1P::pipeHeatCapacities()
43 const
44{
45 double const rho_r = refrigerant.density;
46 double const specific_heat_capacity = refrigerant.specific_heat_capacity;
47 double const rho_g = grout.rho_g;
48 double const porosity_g = grout.porosity_g;
49 double const heat_cap_g = grout.heat_cap_g;
50
51 return {{
52 /*pipe*/ rho_r * specific_heat_capacity,
53 /*grout*/ (1.0 - porosity_g) * rho_g * heat_cap_g,
54 }};
55}
56
57std::array<double, BHE_1P::number_of_unknowns> BHE_1P::pipeHeatConductions()
58 const
59{
60 double const lambda_r = refrigerant.thermal_conductivity;
61 double const rho_r = refrigerant.density;
62 double const Cp_r = refrigerant.specific_heat_capacity;
63 double const alpha_L = _pipe.longitudinal_dispersion_length;
64 double const porosity_g = grout.porosity_g;
65 double const lambda_g = grout.lambda_g;
66
67 double const velocity_norm = std::abs(flow_velocity_);
68
69 return {{
70 // pipe
71 (lambda_r + rho_r * Cp_r * alpha_L * velocity_norm),
72 // grout
73 (1.0 - porosity_g) * lambda_g,
74 }};
75}
76
77std::array<Eigen::Vector3d, BHE_1P::number_of_unknowns>
78BHE_1P::pipeAdvectionVectors(Eigen::Vector3d const& elem_direction) const
79{
80 double const& rho_r = refrigerant.density;
81 double const& Cp_r = refrigerant.specific_heat_capacity;
82
83 double const velocity = flow_velocity_;
84 Eigen::Vector3d adv_vector = rho_r * Cp_r * velocity * elem_direction;
85
86 return {// pipe
87 adv_vector,
88 // grout
89 {0, 0, 0}};
90}
91
92void BHE_1P::updateHeatTransferCoefficients(double const flow_rate)
93{
95 _pipe.single_pipe, borehole_geometry.length, refrigerant, flow_rate);
96
97 flow_velocity_ = tm_flow.velocity;
98 cached_nu_ = tm_flow.nusselt_number;
99}
100
101std::vector<double> BHE_1P::thermalResistances(
102 ParameterLib::SpatialPosition const& pos) const
103{
105}
106
108 double const Nu, ParameterLib::SpatialPosition const& pos) const
109{
110 constexpr double pi = std::numbers::pi;
111
112 double const lambda_r = refrigerant.thermal_conductivity;
113 double const lambda_g = grout.lambda_g;
114 // t=0.0: borehole properties are physically time-invariant (fixed at
115 // drilling/installation); genuinely time-varying parameter types are
116 // rejected in createPipe / createBoreholeGeometry.
117 double const lambda_p =
118 sampleStrictPositive(_pipe.single_pipe.wall_thermal_conductivity, 0.0,
119 pos, "wall_thermal_conductivity");
120
121 // thermal resistances due to advective flow of refrigerant in the pipe
122 double const R_adv_i1 = 1.0 / (Nu * lambda_r * pi);
123
124 // thermal resistance due to thermal conductivity of the pipe wall material
125 double const pipe_outside_diameter = _pipe.single_pipe.outsideDiameter();
126 double const R_con_a =
127 pipeWallThermalResistance(_pipe.single_pipe, lambda_p);
128
129 // thermal resistances of the grout
130 double const D = sampleStrictPositive(borehole_geometry.diameter, 0.0, pos,
131 "borehole_diameter");
132 checkBoreholeVsPipeDiameter(D, pipe_outside_diameter, pos,
133 "BHE 1P grout resistance");
134
135 double const chi = std::log(std::sqrt(D * D + pipe_outside_diameter *
136 pipe_outside_diameter) /
137 std::sqrt(2) / pipe_outside_diameter) /
138 std::log(D / pipe_outside_diameter);
139 double const R_g =
140 std::log(D / pipe_outside_diameter) / 2 / (pi * lambda_g);
141
142 double const R_con_b = chi * R_g;
143
144 // thermal resistances due to grout-soil exchange
145 double const R_gs = computeRgs(chi, R_g);
146
147 double const R_fg = R_adv_i1 + R_con_a + R_con_b;
148
149 return {R_fg, R_gs};
150}
151
152std::array<std::pair<std::size_t, int>, 2>
154 std::size_t const top_node_id,
155 std::size_t const bottom_node_id,
156 int const in_component_id)
157{
158 return {std::make_pair(top_node_id, in_component_id),
159 std::make_pair(bottom_node_id, in_component_id)};
160}
161
162std::optional<std::array<std::pair<std::size_t, int>, 2>>
164 std::size_t const /*bottom_node_id*/,
165 int const /*in_component_id*/,
166 int const /*out_component_id*/)
167{
168 return {};
169}
170
171std::array<double, BHE_1P::number_of_unknowns> BHE_1P::crossSectionAreas(
172 ParameterLib::SpatialPosition const& pos) const
173{
174 double const D = sampleStrictPositive(borehole_geometry.diameter, 0.0, pos,
175 "borehole_diameter");
176 double const borehole_area = Pipe::circleArea(D);
177 return {{_pipe.single_pipe.area(),
178 checkedGroutArea(borehole_area, _pipe.single_pipe.outsideArea(),
179 pos)}};
180}
181
182double BHE_1P::updateFlowRateAndTemperature(double const T_out,
183 double const current_time)
184{
185 auto values =
186 visit([&](auto const& control) { return control(T_out, current_time); },
188 updateHeatTransferCoefficients(values.flow_rate);
189 return values.temperature;
190}
191} // namespace BHE
192} // namespace HeatTransportBHE
193} // namespace ProcessLib
RefrigerantProperties const refrigerant
Definition BHECommon.h:51
BHECommon(BoreholeGeometry const &borehole_geometry_, RefrigerantProperties const &refrigerant_, GroutParameters const &grout_, FlowAndTemperatureControl const &flowAndTemperatureControl_, bool const use_python_bcs_)
Definition BHECommon.h:37
FlowAndTemperatureControl const flowAndTemperatureControl
Definition BHECommon.h:53
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_1P.cpp:92
std::array< double, number_of_unknowns > pipeHeatConductions() const
Definition BHE_1P.cpp:57
static std::optional< std::array< std::pair< std::size_t, int >, 2 > > getBHEBottomDirichletBCNodesAndComponents(std::size_t const, int const, int const)
Definition BHE_1P.cpp:163
PipeConfiguration1PType const _pipe
Definition BHE_1P.h:142
std::array< double, number_of_unknowns > crossSectionAreas(ParameterLib::SpatialPosition const &pos) const
Definition BHE_1P.cpp:171
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_1P.cpp:42
BHE_1P(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfiguration1PType const &pipes, bool const use_python_bcs)
Definition BHE_1P.cpp:21
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_1P.cpp:182
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &elem_direction) const
Definition BHE_1P.cpp:78
std::vector< double > calcThermalResistances(double const Nu, ParameterLib::SpatialPosition const &pos) const
Definition BHE_1P.cpp:107
std::vector< double > thermalResistances(ParameterLib::SpatialPosition const &pos) const
Definition BHE_1P.cpp:101
static std::array< std::pair< std::size_t, int >, 2 > getBHEInflowDirichletBCNodesAndComponents(std::size_t const top_node_id, std::size_t const bottom_node_id, int const in_component_id)
Definition BHE_1P.cpp:153
double sampleStrictPositive(ParameterLib::Parameter< double > const &param, double const t, ParameterLib::SpatialPosition const &pos, std::string_view const param_role)
void checkBoreholeVsPipeDiameter(double const D, double const min_diameter, ParameterLib::SpatialPosition const &pos, std::string_view const context)
double checkedGroutArea(double const borehole_area_fraction, double const pipe_outside_area, ParameterLib::SpatialPosition const &pos)
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl
double computeRgs(double const chi, double const R_g)
Grout-soil thermal resistance: R_gs = (1 - chi) * R_g.
double pipeWallThermalResistance(Pipe const &pipe, double const wall_thermal_conductivity)
ThermoMechanicalFlowProperties calculateThermoMechanicalFlowPropertiesPipe(Pipe const &pipe, double const length, RefrigerantProperties const &fluid, double const flow_rate)
static double circleArea(double const d)
Definition Pipe.h:46