29 [&](
auto const& control)
42 double const specific_heat_capacity =
refrigerant.specific_heat_capacity;
43 double const rho_g =
grout.rho_g;
44 double const porosity_g =
grout.porosity_g;
45 double const heat_cap_g =
grout.heat_cap_g;
47 return {{ rho_r * specific_heat_capacity,
48 rho_r * specific_heat_capacity,
49 rho_r * specific_heat_capacity,
50 rho_r * specific_heat_capacity,
51 (1.0 - porosity_g) * rho_g * heat_cap_g,
52 (1.0 - porosity_g) * rho_g * heat_cap_g,
53 (1.0 - porosity_g) * rho_g * heat_cap_g,
54 (1.0 - porosity_g) * rho_g * heat_cap_g}};
58 int const section_index)
const
60 double const lambda_r =
refrigerant.thermal_conductivity;
62 double const Cp_r =
refrigerant.specific_heat_capacity;
63 double const alpha_L =
_pipes.longitudinal_dispersion_length;
64 double const porosity_g =
grout.porosity_g;
65 double const lambda_g =
grout.lambda_g;
67 double const velocity_norm =
74 auto const pipe_conduction =
75 lambda_r + rho_r * Cp_r * alpha_L * velocity_norm;
76 auto const grout_conduction = (1.0 - porosity_g) * lambda_g;
77 return {{pipe_conduction,
87std::array<Eigen::Vector3d, BHE_2U::number_of_unknowns>
89 int const section_index)
const
92 double const Cp_r =
refrigerant.specific_heat_capacity;
96 Eigen::Vector3d
const advection_downflow{0, 0, -rho_r * Cp_r * velocity};
97 Eigen::Vector3d
const advection_upflow{0, 0, rho_r * Cp_r * velocity};
98 return {{advection_downflow,
119 double R_gg_1 =
computeRgg(chi, R_gs, R_ar_1, R_g);
120 double R_gg_2 =
computeRgg(chi, R_gs, R_ar_2, R_g);
121 double chi_new = chi;
123 auto constraint = [&]()
124 {
return 1.0 / ((1.0 / R_gg_1) + (1.0 / (2.0 * R_gs))); };
126 std::array<double, 3>
const multiplier{chi * 2.0 / 3.0, chi * 1.0 / 3.0,
128 for (
double m_chi : multiplier)
130 if (constraint() >= 0)
135 "Warning! Correction procedure was applied due to negative thermal "
136 "resistance! Chi = {:f}.\n",
139 R_gg_1 =
computeRgg(m_chi, R_gs, R_ar_1, R_g);
140 R_gg_2 =
computeRgg(m_chi, R_gs, R_ar_2, R_g);
144 return {chi_new, R_gg_1, R_gg_2, R_gs};
163 double const Nu,
int const section_index)
const
165 constexpr double pi = std::numbers::pi;
167 double const lambda_r =
refrigerant.thermal_conductivity;
168 double const lambda_g =
grout.lambda_g;
169 double const lambda_p =
_pipes.inlet.wall_thermal_conductivity;
173 double const R_adv_i = 1.0 / (Nu * lambda_r * pi);
174 double const R_adv_o = 1.0 / (Nu * lambda_r * pi);
178 double const inlet_diameter =
_pipes.inlet.diameter;
179 double const inlet_outside_diameter =
_pipes.inlet.outsideDiameter();
180 double const R_con_a = std::log(inlet_outside_diameter / inlet_diameter) /
181 (2.0 * pi * lambda_p);
184 double const d0 =
_pipes.outlet.outsideDiameter();
189 std::log(std::sqrt(D * D + 4 * d0 * d0) / 2 / std::sqrt(2) / d0) /
190 std::log(D / 2 / d0);
194 std::acosh((D * D + d0 * d0 - 2 *
_pipes.distance *
_pipes.distance) /
196 (2 * pi * lambda_g) *
197 (3.098 - 4.432 * std::sqrt(2) *
_pipes.distance / D +
201 double const R_ar_1 =
202 std::acosh((2.0 *
_pipes.distance *
_pipes.distance - d0 * d0) / d0 /
204 (2.0 * pi * lambda_g);
206 double const R_ar_2 =
207 std::acosh((2.0 * 2.0 *
_pipes.distance *
_pipes.distance - d0 * d0) /
209 (2.0 * pi * lambda_g);
211 auto const [chi_new, R_gg_1, R_gg_2, R_gs] =
215 double const R_con_b = chi_new * R_g;
218 double const R_fig = R_adv_i + R_con_a + R_con_b;
219 double const R_fog = R_adv_o + R_con_a + R_con_b;
221 return {R_fig, R_fog, R_gg_1, R_gg_2, R_gs};
224std::array<std::pair<std::size_t ,
int >, 2>
226 std::size_t
const top_node_id,
228 int const in_component_id)
230 return {std::make_pair(top_node_id, in_component_id),
231 std::make_pair(top_node_id, in_component_id + 2)};
235 std::array<std::pair<std::size_t ,
int >, 2>>
237 std::size_t
const bottom_node_id,
238 int const in_component_id,
239 int const out_component_id)
241 return {{std::make_pair(bottom_node_id, in_component_id),
242 std::make_pair(bottom_node_id, out_component_id)}};
246 int const section_index)
const
250 double const quarter_borehole_area =
254 quarter_borehole_area,
_pipes.inlet.outsideArea(), section_index);
256 quarter_borehole_area,
_pipes.outlet.outsideArea(), section_index);
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
void recomputeSectionalResistances(Fn &&calcForSection)
Recompute _sectional_thermal_resistances for all sections.
std::vector< double > _flow_velocities
GroutParameters const grout
FlowAndTemperatureControl const flowAndTemperatureControl
double getClampedFlowVelocity(int const section_index) const
Get velocity for a section, clamping to last section if index exceeds the number of velocity entries....
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)
void updateHeatTransferCoefficients(double const flow_rate)
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
std::array< double, number_of_unknowns > pipeHeatCapacities() const
std::vector< double > calcThermalResistances(double const Nu, int const section_index=0) const
BHE_2U(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
std::array< double, number_of_unknowns > crossSectionAreas(int const section_index=0) const
std::array< double, number_of_unknowns > pipeHeatConductions(int const section_index=0) 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
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &, int const section_index=0) const
double checkedGroutArea(double const borehole_area_fraction, double const pipe_outside_area, int const section_index)
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.
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)