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 (1.0 - porosity_g) * rho_g * heat_cap_g,
53 (1.0 - porosity_g) * rho_g * heat_cap_g}};
59 double const lambda_r =
refrigerant.thermal_conductivity;
61 double const Cp_r =
refrigerant.specific_heat_capacity;
62 double const alpha_L =
_pipes.longitudinal_dispersion_length;
63 double const porosity_g =
grout.porosity_g;
64 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,
81std::array<Eigen::Vector3d, BHE_1U::number_of_unknowns>
85 double const& Cp_r =
refrigerant.specific_heat_capacity;
88 auto leg_adv = [&](
double const v_signed) -> Eigen::Vector3d
89 {
return rho_r * Cp_r * v_signed * elem_direction; };
91 return {{leg_adv(legs[0]),
107 double R_gg =
computeRgg(chi, R_gs, R_ar, R_g);
108 double new_chi = chi;
110 auto constraint = [&]()
111 {
return 1.0 / ((1.0 / R_gg) + (1.0 / (2.0 * R_gs))); };
113 std::array<double, 3>
const multiplier{chi * 2.0 / 3.0, chi * 1.0 / 3.0,
115 for (
double m_chi : multiplier)
117 if (constraint() >= 0)
122 "Warning! Correction procedure was applied due to negative thermal "
123 "resistance! Chi = {:f}.\n",
131 return {new_chi, R_gg, R_gs};
153 constexpr double pi = std::numbers::pi;
155 double const lambda_r =
refrigerant.thermal_conductivity;
156 double const lambda_g =
grout.lambda_g;
159 double const lambda_p_inlet =
161 "inlet wall_thermal_conductivity");
162 double const lambda_p_outlet =
164 "outlet wall_thermal_conductivity");
168 double const R_adv_i1 = 1.0 / (Nu * lambda_r * pi);
169 double const R_adv_o1 = 1.0 / (Nu * lambda_r * pi);
173 double const inlet_outside_diameter =
_pipes.inlet.outsideDiameter();
174 double const R_con_a_inlet =
176 double const R_con_a_outlet =
180 double const d0 = inlet_outside_diameter;
182 "borehole_diameter");
186 auto const geometry_context =
187 [&](std::string_view
const equation, std::string_view
const cause)
194 "BHE 1U chi formula (Eq. 51)");
195 double const chi = std::log(std::sqrt(D * D + 2 * d0 * d0) / 2 / d0) /
196 std::log(D / std::sqrt(2) / d0);
199 double const acosh_arg_R_g =
200 (D * D + d0 * d0 -
_pipes.distance *
_pipes.distance) / (2 * D * d0);
204 "BHE 1U R_g (Eq. 52)",
205 "The argument drops to <= 1 when a pipe reaches the borehole wall "
206 "(distance >= D - d0), giving a zero grout resistance R_g and an "
207 "infinite (1/R) assembly coefficient."));
208 double const R_g = std::acosh(acosh_arg_R_g) / (2 * pi * lambda_g) *
209 (1.601 - 0.888 *
_pipes.distance / D);
212 double const acosh_arg_R_ar =
213 (2.0 *
_pipes.distance *
_pipes.distance - d0 * d0) / d0 / d0;
218 "The argument drops to <= 1 when the pipes touch (distance <= d0), "
219 "giving a zero inter-grout resistance R_ar and an infinite (1/R) "
220 "assembly coefficient."));
221 double const R_ar = std::acosh(acosh_arg_R_ar) / (2.0 * pi * lambda_g);
223 auto const [chi_new, R_gg, R_gs] =
227 double const R_con_b = chi_new * R_g;
229 double const R_fig = R_adv_i1 + R_con_a_inlet + R_con_b;
230 double const R_fog = R_adv_o1 + R_con_a_outlet + R_con_b;
232 return {R_fig, R_fog, R_gg, R_gs};
235std::array<std::pair<std::size_t ,
int >, 2>
237 std::size_t
const top_node_id,
239 int const in_component_id)
241 return {std::make_pair(top_node_id, in_component_id),
242 std::make_pair(top_node_id, in_component_id + 1)};
246 std::array<std::pair<std::size_t ,
int >, 2>>
248 std::size_t
const bottom_node_id,
249 int const in_component_id,
250 int const out_component_id)
252 return {{std::make_pair(bottom_node_id, in_component_id),
253 std::make_pair(bottom_node_id, out_component_id)}};
260 "borehole_diameter");
271 double const current_time)
274 visit([&](
auto const& control) {
return control(T_out, current_time); },
277 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
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
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)
std::array< double, number_of_unknowns > pipeHeatConductions() const
std::vector< double > calcThermalResistances(double const Nu, ParameterLib::SpatialPosition const &pos) const
Nu is the Nusselt number.
static constexpr int number_of_grout_zones
void updateHeatTransferCoefficients(double const flow_rate)
BHE_1U(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
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< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &elem_direction) const
std::array< double, number_of_flow_legs > flowLegs() const
std::array< double, number_of_unknowns > pipeHeatCapacities() const
std::array< double, number_of_unknowns > crossSectionAreas(ParameterLib::SpatialPosition const &pos) const
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)
std::array< double, 3 > thermalResistancesGroutSoil(double const chi, double const R_ar, double const R_g)
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)
static double circleArea(double const d)