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

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# ------------------------------------------------------------------------------ 

7 

8import numpy as np 

9 

10import sympy as sp 

11 

12from pyrc.core.components.templates import Fluid 

13 

14characteristic_length_pipe = 12 # used in alpha_gnielinski_forced_tube_flow_laminar for each ChannelNode 

15 

16 

17# noinspection PyPep8Naming 

18def alpha_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material: Fluid) -> float: 

19 """ 

20 Return the alpha. 

21 

22 Parameters 

23 ---------- 

24 diameter 

25 velocity 

26 fluid_material 

27 

28 Returns 

29 ------- 

30 

31 """ 

32 Nu = nusselt_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material) 

33 

34 return Nu * fluid_material.thermal_conductivity / diameter 

35 

36 

37# noinspection PyPep8Naming 

38def nusselt_gnielinski_forced_tube_flow_turbulent(diameter, velocity, fluid_material: Fluid) -> float: 

39 """ 

40 Return the alpha. 

41 

42 Parameters 

43 ---------- 

44 diameter 

45 velocity 

46 fluid_material 

47 

48 Returns 

49 ------- 

50 

51 """ 

52 Re = diameter * velocity / fluid_material.kin_viscosity 

53 Pr = fluid_material.Pr 

54 

55 zeta = (1.8 * np.log10(Re) - 1.5) ** -2 

56 

57 return (zeta / 8 * Re * Pr) / (1 + 12.7 * (zeta / 8) ** 0.5 * (Pr ** (2 / 3) - 1)) 

58 

59 

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) 

63 

64 return Nu * fluid_material.thermal_conductivity / diameter 

65 

66 

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 

71 

72 L = characteristic_length_pipe 

73 

74 Nu_d1 = 3.66 

75 Nu_d2 = 1.615 * (Re * Pr * diameter / L) ** (1 / 3) 

76 

77 return (Nu_d1**3 + 0.7**3 + (Nu_d2 - 0.7) ** 3) ** (1 / 3) 

78 

79 

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) 

86 

87 Nu = (1 - gamma) * Nu_laminar + gamma * Nu_turbulent 

88 

89 return Nu * fluid_material.thermal_conductivity / diameter 

90 

91 

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 

95 

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) 

111 

112 

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