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
« 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# ------------------------------------------------------------------------------
8from unittest import TestCase
10import numpy as np
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
19class TestCombinedResistor(TestCase):
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()
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)
112 material = Concrete()
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))
135 self.heat_transfer_outside = CombinedResistor() # 1
136 self.heat_transfer_inside = CombinedResistor() # 1
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
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)
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)
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))
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)
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)
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)
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)
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)