Source code for bhr.coaxial_borehole

from math import log, pi

from bhr.fluid import get_fluid
from bhr.pipe import Pipe
from bhr.utilities import coth, smoothing_function


[docs] class Coaxial: def __init__( self, borehole_diameter: float, outer_pipe_outer_diameter: float, outer_pipe_dimension_ratio: float, outer_pipe_conductivity: float, inner_pipe_outer_diameter: float, inner_pipe_dimension_ratio: float, inner_pipe_conductivity: float, length: float, grout_conductivity: float, soil_conductivity: float, fluid_type: str, fluid_concentration: float, ): """ Implementation for computing borehole thermal resistance for a grouted coaxial borehole. :param borehole_diameter: borehole diameter, in m. :param outer_pipe_outer_diameter: outer diameter of outer pipe, in m. :param outer_pipe_dimension_ratio: non-dimensional ratio of outer pipe diameter to thickness. :param outer_pipe_conductivity: outer pipe thermal conductivity, in W/m-K. :param inner_pipe_outer_diameter: inner diameter of outer pipe, in m. :param inner_pipe_dimension_ratio: non-dimensional ratio of inner pipe diameter to thickness. :param inner_pipe_conductivity: inner pipe thermal conductivity, in W/m-K. :param length: length of borehole from top to bottom, in m. :param grout_conductivity: grout thermal conductivity, in W/m-K. :param soil_conductivity: pipe thermal conductivity, in W/m-K. :param fluid_type: fluid type. "ETHYLALCOHOL", "ETHYLENEGLYCOL", "METHYLALCOHOL", "PROPYLENEGLYCOL", or "WATER" :param fluid_concentration: fractional concentration of antifreeze mixture, from 0-0.6. """ self.borehole_diameter = borehole_diameter self.grout_conductivity = grout_conductivity self.soil_conductivity = soil_conductivity self.fluid = get_fluid(fluid_type, fluid_concentration) self.length = length self.outer_pipe = Pipe( outer_pipe_outer_diameter, outer_pipe_dimension_ratio, length, outer_pipe_conductivity, fluid_type, fluid_concentration, ) self.inner_pipe = Pipe( inner_pipe_outer_diameter, inner_pipe_dimension_ratio, length, inner_pipe_conductivity, fluid_type, fluid_concentration, ) self.annular_hydraulic_diameter = self.outer_pipe.pipe_inner_diameter - self.inner_pipe.pipe_outer_diameter self.annular_wetted_perimeter = pi * (self.outer_pipe.pipe_inner_diameter + self.inner_pipe.pipe_outer_diameter)
[docs] def re_annulus(self, m_dot, temp): """ Reynolds number for annulus flow :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: Reynolds number """ return 4 * m_dot / (self.fluid.mu(temp) * self.annular_wetted_perimeter)
[docs] def laminar_nusselt_annulus(self): """ Laminar Nusselt numbers for annulus flow Hellström, G. 1991. Ground Heat Storage: Thermal Analyses of Duct Storage Systems. Department of Mathematical Physics, University of Lund, Sweden. pp 67-71 :return: nu_ii: Laminar Nusselt number for inner surface of annulus pipe :return: nu_oo: Laminar Nusselt number for outer annulus pipe surface """ nu_ii = 3.66 + 1.2 * (self.inner_pipe.pipe_outer_diameter / self.outer_pipe.pipe_inner_diameter) ** -0.8 nu_oo = 3.66 + 1.2 * (self.inner_pipe.pipe_outer_diameter / self.outer_pipe.pipe_inner_diameter) ** 0.5 return nu_ii, nu_oo
[docs] def turbulent_nusselt_annulus(self, re, temp): """ Turbulent Nusselt numbers for annulus flow Grundmann, Rachel Marie. "Improved design methods for ground heat exchangers." Master's thesis, Oklahoma State University, 2016. Eqns 4.10 and 4.11 based on the Dittus-Boelter equation :param re: Reynolds number :param temp: temperature, C :return: nu_ii: Turbulent Nusselt number for inner surface of annulus pipe :return: nu_oo: Turbulent Nusselt number for outer annulus pipe surface """ pr = self.fluid.prandtl(temp) nu_ii = 0.023 * re**0.8 * pr**0.35 nu_oo = nu_ii return nu_ii, nu_oo
[docs] def calc_conv_resist_annulus(self, m_dot, temp): """ Grundmann, Rachel Marie. "Improved design methods for ground heat exchangers." Master's thesis, Oklahoma State University, 2016. Eqns 4.4 - 4.11 :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: r_conv_outside_inner_pipe: convective resistances along the outer wall of the inner pipe, K/(W/m) :return: r_conv_inside_outer_pipe: convective resistance along the inside wall of the outer pipe, K/(W/m) """ # limit determined from Hellström, G. 1991. Ground Heat Storage: Thermal Analyses of # Duct Storage Systems. Department of Mathematical Physics, University of Lund, Sweden. low_reynolds = 2300 # limit based on Dittus-Boelter equation high_reynolds = 10000 re = self.re_annulus(m_dot, temp) if re < low_reynolds: # use this Nusselt number when the flow is laminar nu_ii, nu_oo = self.laminar_nusselt_annulus() elif low_reynolds <= re < high_reynolds: # in between nu_ii_low, nu_oo_low = self.laminar_nusselt_annulus() nu_ii_high, nu_oo_high = self.turbulent_nusselt_annulus(high_reynolds, temp) nu_ii = smoothing_function(re, low_reynolds, high_reynolds, nu_ii_low, nu_ii_high) nu_oo = smoothing_function(re, low_reynolds, high_reynolds, nu_oo_low, nu_oo_high) else: # use this Nusselt number when the flow is fully turbulent nu_ii, nu_oo = self.turbulent_nusselt_annulus(re, temp) r_conv_outside_inner_pipe = self.annular_hydraulic_diameter / ( nu_ii * self.fluid.k(temp) * self.inner_pipe.pipe_outer_diameter * pi ) r_conv_inside_outer_pipe = self.annular_hydraulic_diameter / ( nu_oo * self.fluid.k(temp) * self.outer_pipe.pipe_inner_diameter * pi ) return r_conv_outside_inner_pipe, r_conv_inside_outer_pipe
[docs] def calc_local_bh_resistance(self, m_dot, temp): """ Grundmann, Rachel Marie. "Improved design methods for ground heat exchangers." Master's thesis, Oklahoma State University, 2016. Eqns 4.4 and 4.5 :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: local_bh_resist: total local borehole resistance K /(W/m) :return: r_internal_resist: local internal borehole resistance K /(W/m) :return: r_borehole_resist: local borehole resistance K /(W/m) """ # resistances progressing from inside to outside r_conv_inner_pipe = self.inner_pipe.calc_conv_resist(m_dot, temp) r_cond_inner_pipe, r_cond_outer_pipe = self.calc_cond_resist() r_conv_outside_inner_pipe = self.calc_conv_resist_annulus(m_dot, temp)[0] r_conv_inside_outer_pipe = self.calc_conv_resist_annulus(m_dot, temp)[1] r_cond_grout = log(self.borehole_diameter / self.outer_pipe.pipe_outer_diameter) / ( 2 * pi * self.grout_conductivity ) r_internal_resist = sum([r_conv_inner_pipe, r_cond_inner_pipe, r_conv_outside_inner_pipe]) r_borehole_resist = sum([r_conv_inside_outer_pipe, r_cond_outer_pipe, r_cond_grout]) local_bh_resist = r_internal_resist + r_borehole_resist return [local_bh_resist, r_internal_resist, r_borehole_resist]
[docs] def calc_effective_bh_resistance_uhf(self, m_dot, temp): """ Grundmann, Rachel Marie. "Improved design methods for ground heat exchangers." Master's thesis, Oklahoma State University, 2016. Eqn 4.33 :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: effective_bhr_uhf: effective borehole resistance for uniform heat flux boundary condition, K/(W/m) """ _, r_a, r_b = self.calc_local_bh_resistance(m_dot, temp) rv = self.length / (m_dot * self.fluid.cp(temp)) # (K/(w/m)) thermal resistance factor effective_bhr_uhf = r_b + 1 / (3 * r_a) * rv**2 return effective_bhr_uhf
[docs] def calc_effective_bh_resistance_ubwt(self, m_dot, temp): """ Grundmann, Rachel Marie. "Improved design methods for ground heat exchangers." Master's thesis, Oklahoma State University, 2016. Eqns 4.28 & 4.29 :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: effective_bhr_ubwt: effective borehole resistance for uniform borehole wall temperature boundary condition, K/(W/m) """ _, r_a, r_b = self.calc_local_bh_resistance(m_dot, temp) rv = self.length / (m_dot * self.fluid.cp(temp)) # (K/(w/m)) thermal resistance factor n = rv / (2 * r_b) * (1 + 4 * r_b / r_a) ** (1 / 2) effective_bhr_ubwt = r_b * n * coth(n) return effective_bhr_ubwt
[docs] def calc_cond_resist(self) -> tuple[float, float]: """ Computes the pipe conduction resistance for the inner and outer pipes. :return: pipe conduction resistance, K/(W/m) """ return self.inner_pipe.calc_cond_resist(), self.outer_pipe.calc_cond_resist()
[docs] def calc_conv_resist(self, m_dot, temp) -> tuple[float, float]: """ Computes the convection resistance for the inner pipe and annular space between inner and outer pipes. :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: convection resistance, K/(W/m) """ return self.inner_pipe.calc_conv_resist(m_dot, temp), sum(self.calc_conv_resist_annulus(m_dot, temp))
[docs] def calc_fluid_pipe_resist(self, m_dot, temp): """ Calculates the combined convection resistance of the annular space and the conduction resistance of the outer pipe. :param m_dot: mass flow rate, kg/s :param temp: temperature, C :return: annular convection resistance and outer pipe conduction resistance, K/(W/m) """ _, r_cond_outer_pipe = self.calc_cond_resist() r_conv_outside_inner_pipe = self.calc_conv_resist_annulus(m_dot, temp)[0] r_conv_inside_outer_pipe = self.calc_conv_resist_annulus(m_dot, temp)[1] return r_cond_outer_pipe + r_conv_outside_inner_pipe + r_conv_inside_outer_pipe