Coverage for pyrc \ core \ heat_transfer.py: 26%
43 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-13 16:59 +0200
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-13 16:59 +0200
1# -------------------------------------------------------------------------------
2# Copyright (C) 2026 Joel Kimmich, Tim Jourdan
3# ------------------------------------------------------------------------------
4# License
5# This file is part of PyRC, distributed under GPL-3.0-or-later.
6# ------------------------------------------------------------------------------
8import numpy as np
10import sympy as sp
12from pyrc.core.components.templates import Fluid
14characteristic_length_pipe = 12 # used in alpha_gnielinski_forced_tube_flow_laminar for each ChannelNode
17# noinspection PyPep8Naming
18def alpha_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material: Fluid) -> float:
19 """
20 Return the alpha.
22 Parameters
23 ----------
24 diameter
25 velocity
26 fluid_material
28 Returns
29 -------
31 """
32 Nu = nusselt_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material)
34 return Nu * fluid_material.thermal_conductivity / diameter
37# noinspection PyPep8Naming
38def nusselt_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material: Fluid) -> float:
39 """
40 Return the alpha.
42 Parameters
43 ----------
44 diameter
45 velocity
46 fluid_material
48 Returns
49 -------
51 """
52 Re = diameter * velocity / fluid_material.kin_viscosity
53 Pr = fluid_material.Pr
55 zeta = (1.8 * np.log10(Re) - 1.5) ** -2
57 return (zeta / 8 * Re * Pr) / (1 + 12.7 * (zeta / 8) ** 0.5 * (Pr ** (2 / 3) - 1))
60# noinspection PyPep8Naming
61def alpha_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material: Fluid) -> float:
62 Nu = nusselt_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material)
64 return Nu * fluid_material.thermal_conductivity / diameter
67# noinspection PyPep8Naming
68def nusselt_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material: Fluid) -> float:
69 Re = diameter * velocity / fluid_material.kin_viscosity
70 Pr = fluid_material.Pr
72 L = characteristic_length_pipe
74 Nu_d1 = 3.66
75 Nu_d2 = 1.615 * (Re * Pr * diameter / L) ** (1 / 3)
77 return (Nu_d1**3 + 0.7**3 + (Nu_d2 - 0.7) ** 3) ** (1 / 3)
80# noinspection PyPep8Naming
81def alpha_gnielinski_forced_tube_flow_transition(diameter, velocity, fluid_material: Fluid) -> float:
82 Re = diameter * velocity / fluid_material.kin_viscosity
83 gamma = (Re - 2300) / (10**4 - 2300)
84 Nu_laminar = nusselt_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material)
85 Nu_turbulent = nusselt_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material)
87 Nu = (1 - gamma) * Nu_laminar + gamma * Nu_turbulent
89 return Nu * fluid_material.thermal_conductivity / diameter
92# noinspection PyPep8Naming
93def alpha_forced_convection_in_pipe(diameter, velocity, fluid_material: Fluid) -> float | sp.Basic:
94 Re = diameter * velocity / fluid_material.kin_viscosity
96 if isinstance(Re, sp.Basic):
97 return sp.Piecewise(
98 (alpha_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material), Re <= 2300),
99 (alpha_gnielinski_forced_tube_flow_transition(diameter, velocity, fluid_material), Re < 10000),
100 (alpha_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material), Re < 10 ** 6),
101 (sp.nan, True),
102 )
103 else:
104 if Re <= 2300:
105 return alpha_gnielinski_forced_tube_flow_laminar(diameter, velocity, fluid_material)
106 elif Re >= 10000:
107 if Re < 10**6:
108 raise ValueError(f"Reynolds to high: {Re}\nOnly defined for < 10e6")
109 return alpha_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material)
110 return alpha_gnielinski_forced_tube_flow_transition(diameter, velocity, fluid_material)
113# noinspection PyPep8Naming
114def alpha_free_convection_horizontal_wall(length, fluid_material: Fluid) -> float:
115 Nu = 0.14 * (fluid_material.Gr * fluid_material.Pr) ** (1 / 3) # always turbulent
116 return Nu * fluid_material.thermal_conductivity / length