32 [&](
auto const& control)
45 double const specific_heat_capacity =
refrigerant.specific_heat_capacity;
46 double const rho_g =
grout.rho_g;
47 double const porosity_g =
grout.porosity_g;
48 double const heat_cap_g =
grout.heat_cap_g;
50 return {{ rho_r * specific_heat_capacity,
51 rho_r * specific_heat_capacity,
52 rho_r * specific_heat_capacity,
53 rho_r * specific_heat_capacity,
54 (1.0 - porosity_g) * rho_g * heat_cap_g,
55 (1.0 - porosity_g) * rho_g * heat_cap_g,
56 (1.0 - porosity_g) * rho_g * heat_cap_g,
57 (1.0 - porosity_g) * rho_g * heat_cap_g}};
63 double const lambda_r =
refrigerant.thermal_conductivity;
65 double const Cp_r =
refrigerant.specific_heat_capacity;
66 double const alpha_L =
_pipes.longitudinal_dispersion_length;
67 double const porosity_g =
grout.porosity_g;
68 double const lambda_g =
grout.lambda_g;
72 auto const pipe_conduction =
73 lambda_r + rho_r * Cp_r * alpha_L * velocity_norm;
74 auto const grout_conduction = (1.0 - porosity_g) * lambda_g;
75 return {{pipe_conduction,
85std::array<Eigen::Vector3d, BHE_2U::number_of_unknowns>
89 double const Cp_r =
refrigerant.specific_heat_capacity;
92 auto leg_adv = [&](
double const v_signed) -> Eigen::Vector3d
93 {
return rho_r * Cp_r * v_signed * elem_direction; };
95 return {{leg_adv(legs[0]),
112 double R_gg_1 =
computeRgg(chi, R_gs, R_ar_1, R_g);
113 double R_gg_2 =
computeRgg(chi, R_gs, R_ar_2, R_g);
114 double chi_new = chi;
116 auto constraint = [&]()
117 {
return 1.0 / ((1.0 / R_gg_1) + (1.0 / (2.0 * R_gs))); };
119 std::array<double, 3>
const multiplier{chi * 2.0 / 3.0, chi * 1.0 / 3.0,
121 for (
double m_chi : multiplier)
123 if (constraint() >= 0)
128 "Warning! Correction procedure was applied due to negative thermal "
129 "resistance! Chi = {:f}.\n",
132 R_gg_1 =
computeRgg(m_chi, R_gs, R_ar_1, R_g);
133 R_gg_2 =
computeRgg(m_chi, R_gs, R_ar_2, R_g);
137 return {chi_new, R_gg_1, R_gg_2, R_gs};
158 constexpr double pi = std::numbers::pi;
160 double const lambda_r =
refrigerant.thermal_conductivity;
161 double const lambda_g =
grout.lambda_g;
164 double const lambda_p_inlet =
166 "inlet wall_thermal_conductivity");
167 double const lambda_p_outlet =
169 "outlet wall_thermal_conductivity");
172 double const R_adv_i = 1.0 / (Nu * lambda_r * pi);
173 double const R_adv_o = 1.0 / (Nu * lambda_r * pi);
176 double const R_con_a_inlet =
178 double const R_con_a_outlet =
183 double const d0 =
_pipes.inlet.outsideDiameter();
185 "borehole_diameter");
189 auto const geometry_context =
190 [&](std::string_view
const equation, std::string_view
const cause)
197 "BHE 2U chi formula (Eq. 38)");
199 std::log(std::sqrt(D * D + 4 * d0 * d0) / 2 / std::sqrt(2) / d0) /
200 std::log(D / 2 / d0);
202 double const acosh_arg_R_g =
203 (D * D + d0 * d0 - 2 *
_pipes.distance *
_pipes.distance) /
208 "BHE 2U R_g (Eq. 39)",
209 "The argument drops to <= 1 when a pipe reaches the borehole wall, "
210 "giving a zero grout resistance R_g and an infinite (1/R) assembly "
212 double const R_g = std::acosh(acosh_arg_R_g) / (2 * pi * lambda_g) *
213 (3.098 - 4.432 * std::sqrt(2) *
_pipes.distance / D +
216 double const acosh_arg_R_ar_1 =
217 (2.0 *
_pipes.distance *
_pipes.distance - d0 * d0) / d0 / d0;
222 "The argument drops to <= 1 when the pipes are too close, giving a "
223 "zero inter-grout resistance R_ar and an infinite (1/R) assembly "
225 double const R_ar_1 = std::acosh(acosh_arg_R_ar_1) / (2.0 * pi * lambda_g);
227 double const acosh_arg_R_ar_2 =
228 (2.0 * 2.0 *
_pipes.distance *
_pipes.distance - d0 * d0) / d0 / d0;
233 "The argument drops to <= 1 when the pipes are too close, giving a "
234 "zero inter-grout resistance R_ar and an infinite (1/R) assembly "
236 double const R_ar_2 = std::acosh(acosh_arg_R_ar_2) / (2.0 * pi * lambda_g);
238 auto const [chi_new, R_gg_1, R_gg_2, R_gs] =
241 double const R_con_b = chi_new * R_g;
243 double const R_fig = R_adv_i + R_con_a_inlet + R_con_b;
244 double const R_fog = R_adv_o + R_con_a_outlet + R_con_b;
246 return {R_fig, R_fog, R_gg_1, R_gg_2, R_gs};
249std::array<std::pair<std::size_t, int>, 2>
251 std::size_t
const top_node_id,
253 int const in_component_id)
255 return {std::make_pair(top_node_id, in_component_id),
256 std::make_pair(top_node_id, in_component_id + 2)};
259std::optional<std::array<std::pair<std::size_t, int>, 2>>
261 std::size_t
const bottom_node_id,
262 int const in_component_id,
263 int const out_component_id)
265 return {{std::make_pair(bottom_node_id, in_component_id),
266 std::make_pair(bottom_node_id, out_component_id)}};
273 "borehole_diameter");
277 quarter_borehole_area,
_pipes.inlet.outsideArea(), pos);
279 quarter_borehole_area,
_pipes.outlet.outsideArea(), pos);
294 double const current_time)
297 visit([&](
auto const& control) {
return control(T_out, current_time); },
300 return values.temperature;
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
BHECommonUType(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
PipeConfigurationUType const _pipes
bool const use_python_bcs
RefrigerantProperties const refrigerant
GroutParameters const grout
FlowAndTemperatureControl const flowAndTemperatureControl
BoreholeGeometry const borehole_geometry
static std::array< std::pair< std::size_t, int >, 2 > getBHEInflowDirichletBCNodesAndComponents(std::size_t const top_node_id, std::size_t const, int const in_component_id)
std::array< double, number_of_flow_legs > flowLegs() const
std::array< double, number_of_unknowns > crossSectionAreas(ParameterLib::SpatialPosition const &pos) const
void updateHeatTransferCoefficients(double const flow_rate)
std::array< double, number_of_unknowns > pipeHeatConductions() const
std::vector< double > calcThermalResistances(double const Nu, ParameterLib::SpatialPosition const &pos) const
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &elem_direction) const
std::array< double, number_of_unknowns > pipeHeatCapacities() const
BHE_2U(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
std::vector< double > thermalResistances(ParameterLib::SpatialPosition const &pos) const
static std::optional< std::array< std::pair< std::size_t, int >, 2 > > getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id, int const in_component_id, int const out_component_id)
static constexpr int number_of_grout_zones
void checkAcoshArg(double const arg, std::string_view const context)
double sampleStrictPositive(ParameterLib::Parameter< double > const ¶m, 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)
std::string uTypeGeometryContext(ParameterLib::SpatialPosition const &pos, double const D, double const d0, double const distance, std::string_view const equation, std::string_view const cause)
double checkedGroutArea(double const borehole_area_fraction, double const pipe_outside_area, ParameterLib::SpatialPosition const &pos)
double computeRgg(double const chi, double const R_gs, double const R_ar, double const R_g)
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.
void checkEqualPipeOutsideDiameters(Pipe const &inlet, Pipe const &outlet, std::string_view const context)
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)
std::array< double, 4 > thermalResistancesGroutSoil2U(double const chi, double const R_ar_1, double const R_ar_2, double const R_g)
Thermal resistances due to grout-soil exchange.
static double circleArea(double const d)