Coverage for pyrc \ tests \ test_resistors.py: 100%

62 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 

8from unittest import TestCase 

9 

10import numpy as np 

11 

12from pyrc.core.inputs import FluidBoundaryConditionGeometric, InteriorBoundaryConditionGeometric 

13from pyrc.core.materials import Concrete, Air 

14from pyrc.core.nodes import Node 

15from pyrc.core.resistors import CombinedResistor 

16from pyrc.tools.science import celsius_to_kelvin 

17 

18 

19class TestCombinedResistor(TestCase): 

20 

21 def setUp(self): 

22 # class TestNetwork(RCNetwork): 

23 # def __init__(self,*args, **kwargs): 

24 # super().__init__(*args, **kwargs) 

25 # self.load_from_pickle = False 

26 # self.save_to_pickle = False 

27 # self.continue_canceled = False 

28 # self.settings.save_all_x_seconds = 1 

29 # 

30 # def _create_network(self): 

31 # bc_outside = FluidBoundaryCondition(temperature=celsius_to_kelvin(5), position=np.array([1, 0, 0]), 

32 # heat_transfer_coefficient=4) 

33 # bc_inside = InteriorBoundaryCondition(temperature=celsius_to_kelvin(5), position=np.array([0, 0, 0]), 

34 # heat_transfer_coefficient=3.5) 

35 # 

36 # material = Concrete() 

37 # 

38 # node1 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

39 # temperature=celsius_to_kelvin(0), 

40 # position=np.array([0, 0, 0]), 

41 # delta=(0.3, 0.5, 1)) 

42 # node2 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

43 # temperature=celsius_to_kelvin(0), 

44 # position=np.array([0.3, 0, 0]), 

45 # delta=(0.3, 0.5, 1)) 

46 # node3 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

47 # temperature=celsius_to_kelvin(0), 

48 # position=np.array([0.6, 0, 0]), 

49 # delta=(0.3, 0.5, 1)) 

50 # node4 = Node(material=Air(), # J/K; like 240x100x100 mm of concrete 

51 # temperature=celsius_to_kelvin(0), 

52 # position=np.array([0.9, 0, 0]), 

53 # delta=(0.3, 0.5, 1)) 

54 # node5 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

55 # temperature=celsius_to_kelvin(0), 

56 # position=np.array([1.2, 0, 0]), 

57 # delta=(0.3, 0.5, 1)) 

58 # 

59 # heat_transfer_outside = CombinedResistor() # 1 W/m/K for 120 mm and alpha=3 

60 # heat_transfer_inside = CombinedResistor() # 1 W/m/K for 120 mm and alpha=2 

61 # 

62 # conduction1_2 = CombinedResistor() # 3 

63 # conduction2_3_1 = CombinedResistor() # 4 

64 # conduction2_3_2 = CombinedResistor() # 5 

65 # conduction3_4_1 = CombinedResistor() # 6 

66 # conduction3_4_2_1 = CombinedResistor() # 7 

67 # conduction3_4_2_2 = CombinedResistor(htc=13) # 8 

68 # conduction4_5_1 = CombinedResistor(htc=2) # 9 

69 # conduction4_5_2 = CombinedResistor() # 10 

70 # 

71 # # create connections to BCs 

72 # bc_outside.connect(heat_transfer_outside) 

73 # heat_transfer_outside.connect(node5, direction=(1, 0, 0), node_direction_points_to=bc_outside) 

74 # node1.connect(heat_transfer_inside, direction=(-1, 0, 0), node_direction_points_to=bc_inside) 

75 # heat_transfer_inside.connect(bc_inside) 

76 # 

77 # # connect nodes 

78 # conduction1_2.double_connect(node1, node2) 

79 # conduction2_3_1.double_connect(node2, conduction2_3_2) 

80 # conduction2_3_2.connect(node3) 

81 # conduction3_4_1.double_connect(node3, conduction3_4_2_1) 

82 # conduction3_4_1.connect(conduction3_4_2_2) 

83 # conduction3_4_2_2.connect(node4) 

84 # conduction3_4_2_1.connect(node4) 

85 # conduction4_5_1.double_connect(node4, conduction4_5_2) 

86 # conduction4_5_2.connect(node5) 

87 # 

88 # self.rc_objects.set_lists(nodes=[node1, node2, node3, node4, node5], 

89 # resistors=[ 

90 # conduction1_2, 

91 # conduction2_3_1, 

92 # conduction2_3_2, 

93 # conduction3_4_1, 

94 # conduction3_4_2_1, 

95 # conduction3_4_2_2, 

96 # conduction4_5_1, 

97 # conduction4_5_2, 

98 # heat_transfer_outside, 

99 # heat_transfer_inside, 

100 # ], 

101 # boundaries=[bc_inside, bc_outside]) 

102 # 

103 # self.network = TestNetwork() 

104 

105 self.bc_outside = FluidBoundaryConditionGeometric(temperature=celsius_to_kelvin(5), 

106 position=np.array([1, 0, 0]), 

107 heat_transfer_coefficient=4) 

108 self.bc_inside = InteriorBoundaryConditionGeometric(temperature=celsius_to_kelvin(5), 

109 position=np.array([0, 0, 0]), 

110 heat_transfer_coefficient=3.5) 

111 

112 material = Concrete() 

113 

114 self.node1 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

115 temperature=celsius_to_kelvin(0), 

116 position=np.array([0, 0, 0]), 

117 delta=(0.3, 0.5, 1)) 

118 self.node2 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

119 temperature=celsius_to_kelvin(0), 

120 position=np.array([0.3, 0, 0]), 

121 delta=(0.3, 0.5, 1)) 

122 self.node3 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

123 temperature=celsius_to_kelvin(0), 

124 position=np.array([0.6, 0, 0]), 

125 delta=(0.3, 0.5, 1)) 

126 self.node4 = Node(material=Air(), # J/K; like 240x100x100 mm of concrete 

127 temperature=celsius_to_kelvin(0), 

128 position=np.array([0.9, 0, 0]), 

129 delta=(0.3, 0.5, 1)) 

130 self.node5 = Node(material=material, # J/K; like 240x100x100 mm of concrete 

131 temperature=celsius_to_kelvin(0), 

132 position=np.array([1.2, 0, 0]), 

133 delta=(0.3, 0.5, 1)) 

134 

135 self.heat_transfer_outside = CombinedResistor() # 1 

136 self.heat_transfer_inside = CombinedResistor() # 1 

137 

138 self.conduction1_2 = CombinedResistor() # 3 

139 self.conduction2_3_1 = CombinedResistor() # 4 

140 self.conduction2_3_2 = CombinedResistor() # 5 

141 self.conduction3_4_1 = CombinedResistor() # 6 

142 self.conduction3_4_2_1 = CombinedResistor(htc=5) # 7 

143 self.conduction3_4_2_2 = CombinedResistor(htc=13) # 8 

144 self.conduction4_5_1 = CombinedResistor(htc=2) # 9 

145 self.conduction4_5_2 = CombinedResistor() # 10 

146 

147 # create connections to BCs 

148 self.bc_outside.connect(self.heat_transfer_outside) 

149 self.heat_transfer_outside.connect(self.node5, direction=(1, 0, 0), node_direction_points_to=self.bc_outside) 

150 self.node1.connect(self.heat_transfer_inside, direction=(-1, 0, 0), node_direction_points_to=self.bc_inside) 

151 self.heat_transfer_inside.connect(self.bc_inside) 

152 

153 # connect nodes 

154 self.conduction1_2.double_connect(self.node1, self.node2) 

155 self.conduction2_3_1.double_connect(self.node2, self.conduction2_3_2) 

156 self.conduction2_3_2.connect(self.node3) 

157 self.conduction3_4_1.double_connect(self.node3, self.conduction3_4_2_1) 

158 self.conduction3_4_1.connect(self.conduction3_4_2_2) 

159 self.conduction3_4_2_2.connect(self.node4) 

160 self.conduction3_4_2_1.connect(self.node4) 

161 self.conduction4_5_1.double_connect(self.node4, self.conduction4_5_2) 

162 self.conduction4_5_2.connect(self.node5) 

163 

164 def test_resistance(self): 

165 # self.network.create_network() 

166 # self.network.solve_network((0,10)) 

167 self.assertAlmostEqual(self.heat_transfer_outside.resistance, 1 / (0.5 * 4) + (0.3 / 2) / (1.6 * 0.5)) 

168 self.assertAlmostEqual(self.heat_transfer_inside.resistance, 1 / (0.5 * 3.5) + (0.3 / 2) / (1.6 * 0.5)) 

169 

170 conduction_resistance1_2 = (self.node1.delta_x / 2 / ( 

171 self.node1.material.thermal_conductivity * self.node1.delta_y * self.node1.delta_z) + 

172 self.node2.delta_x / 2 / ( 

173 self.node2.material.thermal_conductivity * self.node2.delta_y * self.node2.delta_z)) 

174 self.assertAlmostEqual(self.conduction1_2.resistance, conduction_resistance1_2) 

175 self.assertAlmostEqual(self.conduction1_2.equivalent_resistance, conduction_resistance1_2) 

176 

177 conduction_resistance2_3_1 = self.node2.delta_x / 2 / ( 

178 self.node2.material.thermal_conductivity * self.node2.delta_y * self.node2.delta_z) 

179 self.assertAlmostEqual(self.conduction2_3_1.resistance, conduction_resistance2_3_1) 

180 conduction_resistance2_3_2 = self.node3.delta_x / 2 / ( 

181 self.node3.material.thermal_conductivity * self.node3.delta_y * 

182 self.node3.delta_z) 

183 self.assertAlmostEqual(self.conduction2_3_2.resistance, conduction_resistance2_3_2) 

184 

185 self.assertAlmostEqual(self.conduction2_3_1.equivalent_resistance, 

186 conduction_resistance2_3_1 + conduction_resistance2_3_2) 

187 self.assertAlmostEqual(self.conduction2_3_2.equivalent_resistance, 

188 conduction_resistance2_3_1 + conduction_resistance2_3_2) 

189 

190 conduction_resistance3_4_1 = self.node3.delta_x / 2 / ( 

191 self.node3.material.thermal_conductivity * self.node3.delta_y * self.node3.delta_z) 

192 conduction_resistance3_4_2_1 = 1 / ( 

193 self.conduction3_4_2_1.htc * self.node4.delta_y * self.node4.delta_z) 

194 conduction_resistance3_4_2_2 = 1 / ( 

195 self.conduction3_4_2_2.htc * self.node4.delta_y * self.node4.delta_z) 

196 conduction_resistance3_4_2 = 1 / (1 / conduction_resistance3_4_2_1 + 1 / conduction_resistance3_4_2_2) 

197 self.assertAlmostEqual(self.conduction3_4_1.equivalent_resistance, 

198 conduction_resistance3_4_1 + conduction_resistance3_4_2) 

199 self.assertAlmostEqual(self.conduction3_4_2_1.equivalent_resistance, 

200 conduction_resistance3_4_1 + conduction_resistance3_4_2) 

201 self.assertAlmostEqual(self.conduction3_4_2_2.equivalent_resistance, 

202 conduction_resistance3_4_1 + conduction_resistance3_4_2) 

203 

204 conduction_resistance4_5_1 = 1 / ( 

205 self.conduction4_5_1.htc * self.node4.delta_y * self.node4.delta_z) 

206 conduction_resistance4_5_2 = self.node5.delta_x / 2 / ( 

207 self.node5.material.thermal_conductivity * self.node5.delta_y * self.node5.delta_z) 

208 self.assertAlmostEqual(self.conduction4_5_1.equivalent_resistance, 

209 conduction_resistance4_5_1 + conduction_resistance4_5_2)