OGS
BHECommonCoaxial.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 "BHECommonCoaxial.h"
5
10
11namespace ProcessLib
12{
13namespace HeatTransportBHE
14{
15namespace BHE
16{
18 BoreholeGeometry const& borehole,
22 PipeConfigurationCoaxial const& pipes,
23 bool const use_python_bcs)
26 _pipes(pipes)
27{
28 cross_section_area_inner_pipe = _pipes.inner_pipe.area();
30 _pipes.outer_pipe.area() - _pipes.inner_pipe.outsideArea();
31}
32
33std::array<double, BHECommonCoaxial::number_of_unknowns>
35{
36 double const rho_r = refrigerant.density;
37 double const specific_heat_capacity = refrigerant.specific_heat_capacity;
38 double const rho_g = grout.rho_g;
39 double const porosity_g = grout.porosity_g;
40 double const heat_cap_g = grout.heat_cap_g;
41
42 return {{/*i*/ rho_r * specific_heat_capacity,
43 /*o*/ rho_r * specific_heat_capacity,
44 /*g*/ (1.0 - porosity_g) * rho_g * heat_cap_g}};
45}
46
48 double const current_time)
49{
50 auto values =
51 visit([&](auto const& control) { return control(T_out, current_time); },
53 updateHeatTransferCoefficients(values.flow_rate);
54 return values.temperature;
55}
56
57std::array<double, BHECommonCoaxial::number_of_unknowns>
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 = _pipes.longitudinal_dispersion_length;
64 double const porosity_g = grout.porosity_g;
65 double const lambda_g = grout.lambda_g;
66
67 auto const legs = flowLegs();
68 return {{(lambda_r + rho_r * Cp_r * alpha_L * std::abs(legs[0])),
69 (lambda_r + rho_r * Cp_r * alpha_L * std::abs(legs[1])),
70 (1.0 - porosity_g) * lambda_g}};
71}
72
73std::array<Eigen::Vector3d, BHECommonCoaxial::number_of_unknowns>
75 Eigen::Vector3d const& elem_direction) const
76{
77 double const rho_r = refrigerant.density;
78 double const Cp_r = refrigerant.specific_heat_capacity;
79
80 auto const legs = flowLegs();
81 auto leg_adv = [&](double const v_signed) -> Eigen::Vector3d
82 { return rho_r * Cp_r * v_signed * elem_direction; };
83
84 return {leg_adv(legs[0]), leg_adv(legs[1]), {0, 0, 0}};
85}
86
88 double const Nu_inner_pipe, double const Nu_annulus_pipe,
89 ParameterLib::SpatialPosition const& pos) const
90{
91 // thermal resistances due to advective flow of refrigerant in the pipes
92 auto const R_advective = calculateAdvectiveThermalResistance(
93 _pipes.inner_pipe, _pipes.outer_pipe, refrigerant, Nu_inner_pipe,
94 Nu_annulus_pipe);
95
96 // thermal resistance due to thermal conductivity of the pipe wall material
97 // t=0.0: borehole properties are physically time-invariant; genuinely
98 // time-varying parameter types are rejected in createPipe.
99 double const lambda_p_inner =
100 sampleStrictPositive(_pipes.inner_pipe.wall_thermal_conductivity, 0.0,
101 pos, "wall_thermal_conductivity (inner pipe)");
102 double const lambda_p_outer =
103 sampleStrictPositive(_pipes.outer_pipe.wall_thermal_conductivity, 0.0,
104 pos, "wall_thermal_conductivity (outer pipe)");
105 auto const R_conductive = calculatePipeWallThermalResistance(
106 _pipes.inner_pipe, lambda_p_inner, _pipes.outer_pipe, lambda_p_outer);
107
108 // thermal resistance due to the grout transition and grout-soil exchange.
109 double const D = sampleStrictPositive(borehole_geometry.diameter, 0.0, pos,
110 "borehole_diameter");
111 checkBoreholeVsPipeDiameter(D, _pipes.outer_pipe.outsideDiameter(), pos,
112 "coaxial grout resistance");
114 _pipes.outer_pipe, grout, D);
115
116 double const R_gs = R.grout_soil;
117
118 double const R_ff = R_advective.inner_pipe_coaxial + R_advective.a_annulus +
119 R_conductive.inner_pipe_coaxial;
120 double const R_fg =
121 R_advective.b_annulus + R_conductive.annulus + R.conductive_b;
122
123 return getThermalResistances(R_gs, R_ff, R_fg);
124}
125
131
132std::array<std::pair<std::size_t, int>, 2>
134 std::size_t const top_node_id,
135 std::size_t const /*bottom_node_id*/,
136 int const in_component_id)
137{
138 return {std::make_pair(top_node_id, in_component_id),
139 std::make_pair(top_node_id, in_component_id + 1)};
140}
141
142std::optional<std::array<std::pair<std::size_t, int>, 2>>
144 std::size_t const bottom_node_id, int const in_component_id,
145 int const out_component_id)
146{
147 return {{std::make_pair(bottom_node_id, in_component_id),
148 std::make_pair(bottom_node_id, out_component_id)}};
149}
150
152{
153 auto const tm_flow_inner = calculateThermoMechanicalFlowPropertiesPipe(
154 _pipes.inner_pipe, borehole_geometry.length, refrigerant, flow_rate);
155
156 auto const tm_flow_annulus = calculateThermoMechanicalFlowPropertiesAnnulus(
157 _pipes.inner_pipe, _pipes.outer_pipe, borehole_geometry.length,
158 refrigerant, flow_rate);
159
160 cached_nu_inner = tm_flow_inner.nusselt_number;
161 cached_nu_annulus = tm_flow_annulus.nusselt_number;
162 assignVelocities(tm_flow_inner.velocity, tm_flow_annulus.velocity);
163}
164} // namespace BHE
165} // namespace HeatTransportBHE
166} // namespace ProcessLib
std::array< double, number_of_flow_legs > flowLegs() const
double updateFlowRateAndTemperature(double T_out, double current_time)
BHECommonCoaxial(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationCoaxial const &pipes, bool const use_python_bcs)
std::vector< double > calcThermalResistances(double const Nu_inner_pipe, double const Nu_annulus_pipe, ParameterLib::SpatialPosition const &pos) const
std::array< double, number_of_unknowns > pipeHeatConductions() const
std::array< double, number_of_unknowns > pipeHeatCapacities() const
virtual void assignVelocities(double inner_vel, double annulus_vel)=0
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 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)
virtual std::vector< double > getThermalResistances(double const &R_gs, double const &R_ff, double const &R_fg) const =0
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &elem_direction) const
std::vector< double > thermalResistances(ParameterLib::SpatialPosition const &pos) const
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
ThermoMechanicalFlowProperties calculateThermoMechanicalFlowPropertiesAnnulus(Pipe const &inner_pipe, Pipe const &outer_pipe, double const length, RefrigerantProperties const &fluid, double const flow_rate)
AdvectiveThermalResistanceCoaxial calculateAdvectiveThermalResistance(Pipe const &inner_pipe, Pipe const &outer_pipe, RefrigerantProperties const &fluid, double const Nu_inner_pipe, double const Nu_annulus)
double sampleStrictPositive(ParameterLib::Parameter< double > const &param, double const t, ParameterLib::SpatialPosition const &pos, std::string_view const param_role)
PipeWallThermalResistanceCoaxial calculatePipeWallThermalResistance(Pipe const &inner_pipe, double const lambda_p_inner, Pipe const &outer_pipe, double const lambda_p_outer)
void checkBoreholeVsPipeDiameter(double const D, double const min_diameter, ParameterLib::SpatialPosition const &pos, std::string_view const context)
GroutAndGroutSoilExchangeThermalResistanceCoaxial calculateGroutAndGroutSoilExchangeThermalResistance(Pipe const &outer_pipe, GroutParameters const &grout_parameters, double const borehole_diameter)
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl
ThermoMechanicalFlowProperties calculateThermoMechanicalFlowPropertiesPipe(Pipe const &pipe, double const length, RefrigerantProperties const &fluid, double const flow_rate)