Coverage for test/unit/elements/aggregation/test_parallelpumps.py: 99%
317 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
1import unittest
3import networkx as nx
5import bim2sim.elements.aggregation.hvac_aggregations
6from bim2sim.elements import aggregation
7from bim2sim.elements import hvac_elements as hvac
8from bim2sim.elements.graphs.hvac_graph import HvacGraph
9from test.unit.elements.helper import SetupHelperHVAC
12class ParallelPumpHelper(SetupHelperHVAC):
14 def get_setup_pumps1(self):
15 """get consumer circuit made of 2 parallel pumps (equal size),
16 space heater and pipes"""
17 flags = {}
18 with self.flag_manager(flags):
19 # generator circuit
20 con_vl_a = [self.element_generator(
21 hvac.Pipe, length=100, diameter=30) for i in range(3)]
22 fitting1 = self.element_generator(
23 hvac.PipeFitting, flags=['pumps1'], n_ports=3, diameter=30, length=60)
24 p_pump1_p = [
25 self.element_generator(
26 hvac.Pipe, flags=['pumps1'], length=40, diameter=20),
27 self.element_generator(
28 hvac.Pump, flags=['pumps1'], rated_power=1, rated_height=8,
29 rated_volume_flow=6, diameter=20),
30 self.element_generator(
31 hvac.Pipe, flags=['pumps1'], length=40, diameter=20),
32 ]
33 p_pump2_p = [
34 self.element_generator(
35 hvac.Pipe, flags=['pumps1'], length=40, diameter=20),
36 self.element_generator(
37 hvac.Pump, flags=['pumps1'], rated_power=1, rated_height=8,
38 rated_volume_flow=6, diameter=20),
39 self.element_generator(
40 hvac.Pipe, flags=['pumps1'], length=40, diameter=20),
41 ]
42 fitting2 = self.element_generator(
43 hvac.PipeFitting, flags=['pumps1'], n_ports=3, diameter=30, length=60)
44 con_vl_b = [self.element_generator(
45 hvac.Pipe, length=100, diameter=30) for i in range(3)]
46 consumer = self.element_generator(
47 hvac.SpaceHeater)
48 con_rl_a = [self.element_generator(
49 hvac.Pipe, length=100, diameter=30) for i in range(6)]
51 # connect
52 self.connect_strait([*con_vl_a, fitting1])
53 self.connect_strait([fitting1, *p_pump1_p, fitting2])
54 self.connect_strait(p_pump2_p)
55 fitting1.ports[2].connect(p_pump2_p[0].ports[0])
56 p_pump2_p[-1].ports[1].connect(fitting2.ports[2])
57 self.connect_strait([fitting2, *con_vl_b, consumer, *con_rl_a])
59 # full system
60 gen_circuit = [
61 *con_vl_a, fitting1, *p_pump1_p, *p_pump2_p, fitting2,
62 *con_vl_b, consumer, *con_rl_a
63 ]
65 flags['connect'] = [con_vl_a[0], con_rl_a[-1]]
67 graph = HvacGraph(gen_circuit)
68 return graph, flags
70 def get_setup_pumps2(self):
71 """get consumer circuit made of 5 parallel pumps (one small),
72 space heater and pipes"""
73 flags = {}
74 with self.flag_manager(flags):
75 # generator circuit
76 con_vl_a = [self.element_generator(
77 hvac.Pipe, length=100, diameter=30) for i in range(3)]
78 fitting1 = self.element_generator(
79 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
80 n_ports=6, diameter=30, length=60)
81 p_pump1_p = [
82 self.element_generator(
83 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
84 diameter=20),
85 self.element_generator(
86 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
87 rated_height=8,
88 rated_volume_flow=6, diameter=20),
89 self.element_generator(
90 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
91 diameter=20),
92 ]
93 p_pump2_p = [
94 self.element_generator(
95 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
96 diameter=20),
97 self.element_generator(
98 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
99 rated_height=8,
100 rated_volume_flow=6, diameter=20),
101 self.element_generator(
102 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
103 diameter=20),
104 ]
105 p_pump3_p = [
106 self.element_generator(
107 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
108 diameter=20),
109 self.element_generator(
110 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
111 rated_height=8,
112 rated_volume_flow=6, diameter=20),
113 self.element_generator(
114 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
115 diameter=20),
116 ]
117 p_pump4_p = [
118 self.element_generator(
119 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
120 diameter=20),
121 self.element_generator(
122 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
123 rated_height=8,
124 rated_volume_flow=6, diameter=20),
125 self.element_generator(
126 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
127 diameter=20),
128 ]
129 p_pump5_p = [
130 self.element_generator(
131 hvac.Pipe, flags=['pumps2', 'small'], length=40,
132 diameter=15),
133 self.element_generator(
134 hvac.Pump, flags=['pumps2', 'small'], rated_power=0.22,
135 rated_height=8,
136 rated_volume_flow=0.8, diameter=15),
137 self.element_generator(
138 hvac.Pipe, flags=['pumps2', 'small'], length=40,
139 diameter=15),
140 ]
141 fitting2 = self.element_generator(
142 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
143 n_ports=6, diameter=30, length=60)
144 con_vl_b = [self.element_generator(
145 hvac.Pipe, length=100, diameter=30) for i in range(3)]
146 consumer = self.element_generator(
147 hvac.SpaceHeater)
148 con_rl_a = [self.element_generator(
149 hvac.Pipe, length=100, diameter=30) for i in range(6)]
151 # connect
152 self.connect_strait([*con_vl_a, fitting1])
153 self.connect_strait([fitting1, *p_pump1_p, fitting2])
154 self.connect_strait(p_pump2_p)
155 self.connect_strait(p_pump3_p)
156 self.connect_strait(p_pump4_p)
157 self.connect_strait(p_pump5_p)
158 fitting1.ports[2].connect(p_pump2_p[0].ports[0])
159 fitting1.ports[3].connect(p_pump3_p[0].ports[0])
160 fitting1.ports[4].connect(p_pump4_p[0].ports[0])
161 fitting1.ports[5].connect(p_pump5_p[0].ports[0])
162 p_pump2_p[-1].ports[1].connect(fitting2.ports[2])
163 p_pump3_p[-1].ports[1].connect(fitting2.ports[3])
164 p_pump4_p[-1].ports[1].connect(fitting2.ports[4])
165 p_pump5_p[-1].ports[1].connect(fitting2.ports[5])
166 self.connect_strait([fitting2, *con_vl_b, consumer, *con_rl_a])
168 # full system
169 gen_circuit = [
170 *con_vl_a, fitting1, *p_pump1_p, *p_pump2_p, *p_pump3_p, *p_pump4_p,
171 *p_pump5_p, fitting2, *con_vl_b, consumer, *con_rl_a
172 ]
174 flags['connect'] = [con_vl_a[0], con_rl_a[-1]]
176 graph = HvacGraph(gen_circuit)
177 return graph, flags
179 def get_setup_pumps3(self):
180 """get consumer circuit made of 5 parallel pumps (one small), bypass,
181 space heater and pipes"""
182 flags = {}
183 with self.flag_manager(flags):
184 # generator circuit
185 con_vl_a = [self.element_generator(
186 hvac.Pipe, length=100, diameter=30) for i in range(3)]
187 fitting1 = self.element_generator(
188 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
189 n_ports=7, diameter=30, length=60)
190 p_pump1_p = [
191 self.element_generator(
192 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
193 self.element_generator(
194 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1, rated_height=8,
195 rated_volume_flow=6, diameter=20),
196 self.element_generator(
197 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
198 ]
199 p_pump2_p = [
200 self.element_generator(
201 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
202 self.element_generator(
203 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1, rated_height=8,
204 rated_volume_flow=6, diameter=20),
205 self.element_generator(
206 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
207 ]
208 p_pump3_p = [
209 self.element_generator(
210 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
211 self.element_generator(
212 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1, rated_height=8,
213 rated_volume_flow=6, diameter=20),
214 self.element_generator(
215 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
216 ]
217 p_pump4_p = [
218 self.element_generator(
219 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
220 self.element_generator(
221 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1, rated_height=8,
222 rated_volume_flow=6, diameter=20),
223 self.element_generator(
224 hvac.Pipe, flags=['pumps2', 'normal'], length=40, diameter=20),
225 ]
226 p_pump5_p = [
227 self.element_generator(
228 hvac.Pipe, flags=['pumps2', 'small'], length=40, diameter=15),
229 self.element_generator(
230 hvac.Pump, flags=['pumps2', 'small'], rated_power=0.22, rated_height=8,
231 rated_volume_flow=0.8, diameter=15),
232 self.element_generator(
233 hvac.Pipe, flags=['pumps2', 'small'], length=40, diameter=15),
234 ]
235 fitting2 = self.element_generator(
236 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
237 n_ports=7, diameter=30, length=60)
238 con_vl_b = [self.element_generator(
239 hvac.Pipe, length=100, diameter=30) for i in range(3)]
240 consumer = self.element_generator(
241 hvac.SpaceHeater)
242 con_rl_a = [self.element_generator(
243 hvac.Pipe, length=100, diameter=30) for i in range(6)]
244 bypass = [self.element_generator(
245 hvac.Pipe, flags=['bypass'], length=60, diameter=30) for
246 i in range(3)]
248 # connect
249 self.connect_strait([*con_vl_a, fitting1])
250 self.connect_strait([fitting1, *p_pump1_p, fitting2])
251 self.connect_strait(p_pump2_p)
252 self.connect_strait(p_pump3_p)
253 self.connect_strait(p_pump4_p)
254 self.connect_strait(p_pump5_p)
255 self.connect_strait([*bypass])
256 fitting1.ports[2].connect(p_pump2_p[0].ports[0])
257 fitting1.ports[3].connect(p_pump3_p[0].ports[0])
258 fitting1.ports[4].connect(p_pump4_p[0].ports[0])
259 fitting1.ports[5].connect(p_pump5_p[0].ports[0])
260 fitting1.ports[6].connect(bypass[0].ports[0])
261 p_pump2_p[-1].ports[1].connect(fitting2.ports[2])
262 p_pump3_p[-1].ports[1].connect(fitting2.ports[3])
263 p_pump4_p[-1].ports[1].connect(fitting2.ports[4])
264 p_pump5_p[-1].ports[1].connect(fitting2.ports[5])
265 bypass[-1].ports[1].connect(fitting2.ports[6])
266 self.connect_strait([fitting2, *con_vl_b, consumer, *con_rl_a])
268 # full system
269 gen_circuit = [
270 *con_vl_a, fitting1, *p_pump1_p, *p_pump2_p, *p_pump3_p, *p_pump4_p, *p_pump5_p
271 , fitting2, *con_vl_b, consumer, *con_rl_a, *bypass
272 ]
274 flags['connect'] = [con_vl_a[0], con_rl_a[-1]]
276 graph = HvacGraph(gen_circuit)
277 return graph, flags
279 def get_setup_pumps4(self):
280 """get consumer circuit made of 4 parallel pumps (one small) with
281 pipefittings in between, bypass, space heater and pipes"""
282 flags = {}
283 with self.flag_manager(flags):
284 # generator circuit
285 con_vl_a = [self.element_generator(
286 hvac.Pipe, length=100, diameter=30) for i in range(3)]
287 fitting1 = self.element_generator(
288 hvac.PipeFitting, flags=['pumps4', 'normal'],
289 n_ports=5, diameter=30, length=60)
290 fitting2 = self.element_generator(
291 hvac.PipeFitting, flags=['pumps4', 'normal', 'add'],
292 n_ports=3, diameter=30, length=60)
293 p_pump1_p = [
294 self.element_generator(
295 hvac.Pipe, flags=['pumps4', 'normal'], length=40, diameter=20),
296 self.element_generator(
297 hvac.Pump, flags=['pumps4', 'normal'], rated_power=1, rated_height=8,
298 rated_volume_flow=6, diameter=20),
299 self.element_generator(
300 hvac.Pipe, flags=['pumps4', 'normal'], length=40, diameter=20),
301 ]
302 p_pump2_p = [
303 self.element_generator(
304 hvac.Pipe, flags=['pumps4', 'normal'], length=40, diameter=20),
305 self.element_generator(
306 hvac.Pump, flags=['pumps4', 'normal'], rated_power=1, rated_height=8,
307 rated_volume_flow=6, diameter=20),
308 self.element_generator(
309 hvac.Pipe, flags=['pumps4', 'normal'], length=40, diameter=20),
310 ]
311 p_pump3_p = [
312 self.element_generator(
313 hvac.Pipe, flags=['pumps4', 'small'], length=40,
314 diameter=20),
315 self.element_generator(
316 hvac.Pump, flags=['pumps4', 'small'], rated_power=0.6,
317 rated_height=6,
318 rated_volume_flow=6, diameter=20),
319 self.element_generator(
320 hvac.Pipe, flags=['pumps4', 'small'], length=40,
321 diameter=20),
322 ]
323 p_pump4_p = [
324 self.element_generator(
325 hvac.Pipe, flags=['pumps4', 'normal', 'add'],
326 length=40,
327 diameter=20),
328 self.element_generator(
329 hvac.Pump, flags=['pumps4', 'normal', 'add'],
330 rated_power=1, rated_height=8, rated_volume_flow=6,
331 diameter=20),
332 self.element_generator(
333 hvac.Pipe, flags=['pumps4', 'normal', 'add'],
334 length=40, diameter=20),
335 ]
336 fitting3 = self.element_generator(
337 hvac.PipeFitting, flags=['pumps4', 'normal'],
338 n_ports=5, diameter=30, length=60)
339 fitting4 = self.element_generator(
340 hvac.PipeFitting, flags=['pumps4', 'normal', 'add'],
341 n_ports=3, diameter=30, length=60)
342 con_vl_b = [self.element_generator(
343 hvac.Pipe, length=100, diameter=30) for i in range(3)]
344 consumer = self.element_generator(
345 hvac.SpaceHeater)
346 con_rl_a = [self.element_generator(
347 hvac.Pipe, length=100, diameter=30) for i in range(6)]
348 bypass = [self.element_generator(
349 hvac.Pipe, flags=['bypass'], length=60, diameter=30) for
350 i in range(3)]
351 # connect
352 # parallel pumps connections VL
353 self.connect_strait([*con_vl_a, fitting1])
354 self.connect_strait([fitting1, *p_pump1_p, fitting3])
355 self.connect_strait([fitting3, *con_vl_b, consumer, *con_rl_a])
356 self.connect_strait(bypass)
357 self.connect_strait(p_pump2_p)
358 self.connect_strait(p_pump3_p)
359 self.connect_strait(p_pump4_p)
360 fitting1.ports[2].connect(p_pump2_p[0].ports[0])
361 fitting1.ports[3].connect(p_pump3_p[0].ports[0])
362 # bypass connection VL
363 fitting1.ports[4].connect(fitting2.ports[0])
364 fitting2.ports[1].connect(p_pump4_p[0].ports[0])
365 fitting2.ports[2].connect(bypass[0].ports[0])
366 # parallel pumps connection RL
367 p_pump2_p[-1].ports[1].connect(fitting3.ports[2])
368 p_pump3_p[-1].ports[1].connect(fitting3.ports[3])
370 # bypass connection RL
371 p_pump4_p[-1].ports[1].connect(fitting4.ports[0])
372 fitting4.ports[1].connect(fitting3.ports[4])
373 bypass[-1].ports[1].connect(fitting4.ports[2])
375 # full system
376 gen_circuit = [
377 *con_vl_a, fitting1, *p_pump1_p, *p_pump2_p, *p_pump3_p, *p_pump4_p,
378 *bypass, fitting2, fitting3, fitting4, *con_vl_b, consumer,
379 *con_rl_a
380 ]
382 flags['connect'] = [con_vl_a[0], con_rl_a[-1]]
384 graph = HvacGraph(gen_circuit)
385 return graph, flags
387 def get_setup_pumps5(self):
388 """get consumer circuit made of 5 parallel pumps (one small) with
389 additional connection at one edge port that isn't connected to other
390 edge port, space heater and pipes"""
391 flags = {}
392 with self.flag_manager(flags):
393 # generator circuit
394 con_vl_a = [self.element_generator(
395 hvac.Pipe, length=100, diameter=30) for i in range(3)]
396 fitting1 = self.element_generator(
397 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
398 n_ports=7, diameter=30, length=60)
399 p_pump1_p = [
400 self.element_generator(
401 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
402 diameter=20),
403 self.element_generator(
404 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
405 rated_height=8,
406 rated_volume_flow=6, diameter=20),
407 self.element_generator(
408 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
409 diameter=20),
410 ]
411 p_pump2_p = [
412 self.element_generator(
413 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
414 diameter=20),
415 self.element_generator(
416 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
417 rated_height=8,
418 rated_volume_flow=6, diameter=20),
419 self.element_generator(
420 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
421 diameter=20),
422 ]
423 p_pump3_p = [
424 self.element_generator(
425 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
426 diameter=20),
427 self.element_generator(
428 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
429 rated_height=8,
430 rated_volume_flow=6, diameter=20),
431 self.element_generator(
432 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
433 diameter=20),
434 ]
435 p_pump4_p = [
436 self.element_generator(
437 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
438 diameter=20),
439 self.element_generator(
440 hvac.Pump, flags=['pumps2', 'normal'], rated_power=1,
441 rated_height=8,
442 rated_volume_flow=6, diameter=20),
443 self.element_generator(
444 hvac.Pipe, flags=['pumps2', 'normal'], length=40,
445 diameter=20),
446 ]
447 p_pump5_p = [
448 self.element_generator(
449 hvac.Pipe, flags=['pumps2', 'small'], length=40,
450 diameter=15),
451 self.element_generator(
452 hvac.Pump, flags=['pumps2', 'small'], rated_power=0.22,
453 rated_height=8,
454 rated_volume_flow=0.8, diameter=15),
455 self.element_generator(
456 hvac.Pipe, flags=['pumps2', 'small'], length=40,
457 diameter=15),
458 ]
459 fitting2 = self.element_generator(
460 hvac.PipeFitting, flags=['pumps2', 'normal', 'small'],
461 n_ports=6, diameter=30, length=60)
462 con_vl_b = [self.element_generator(
463 hvac.Pipe, length=100, diameter=30) for i in range(3)]
464 consumer = self.element_generator(
465 hvac.SpaceHeater)
466 con_rl_a = [self.element_generator(
467 hvac.Pipe, length=100, diameter=30) for i in range(6)]
468 add_con = [self.element_generator(
469 hvac.Pipe, length=100, diameter=30) for i in range(3)]
471 # connect
472 self.connect_strait([*con_vl_a, fitting1])
473 self.connect_strait([fitting1, *p_pump1_p, fitting2])
474 self.connect_strait(add_con)
475 self.connect_strait(p_pump2_p)
476 self.connect_strait(p_pump3_p)
477 self.connect_strait(p_pump4_p)
478 self.connect_strait(p_pump5_p)
479 fitting1.ports[2].connect(p_pump2_p[0].ports[0])
480 fitting1.ports[3].connect(p_pump3_p[0].ports[0])
481 fitting1.ports[4].connect(p_pump4_p[0].ports[0])
482 fitting1.ports[5].connect(p_pump5_p[0].ports[0])
483 fitting1.ports[6].connect(add_con[0].ports[0])
484 p_pump2_p[-1].ports[1].connect(fitting2.ports[2])
485 p_pump3_p[-1].ports[1].connect(fitting2.ports[3])
486 p_pump4_p[-1].ports[1].connect(fitting2.ports[4])
487 p_pump5_p[-1].ports[1].connect(fitting2.ports[5])
488 self.connect_strait([fitting2, *con_vl_b, consumer, *con_rl_a])
490 # full system
491 gen_circuit = [
492 *con_vl_a, fitting1, *p_pump1_p, *p_pump2_p, *p_pump3_p, *p_pump4_p,
493 *p_pump5_p
494 , fitting2, *con_vl_b, consumer, *con_rl_a
495 ]
497 flags['connect'] = [con_vl_a[0], con_rl_a[-1]]
499 graph = HvacGraph(gen_circuit)
500 return graph, flags
502 def get_setup_system(self):
503 """ Simple generator system made of boiler, pump, expansion tank,
504 distributor and pipes."""
505 graph1, flags1 = super().get_setup_simple_boiler()
506 graph2, flags2 = self.get_setup_pumps1()
507 graph3, flags3 = self.get_setup_pumps2()
509 distributor = flags1['distributor'][0]
510 distributor_ports = self.fake_add_ports(distributor, 4)
512 vl_p1, rl_p1 = flags2.pop('connect')
513 distributor_ports[0].connect(vl_p1.ports[0])
514 rl_p1.ports[1].connect(distributor_ports[1])
516 vl_p2, rl_p2 = flags3.pop('connect')
517 distributor_ports[2].connect(vl_p2.ports[0])
518 rl_p2.ports[1].connect(distributor_ports[3])
520 ele = graph1.elements + graph2.elements + graph3.elements
521 graph = HvacGraph(ele)
522 flags = {**flags1, **flags2, **flags3}
523 return graph, flags
526class TestParallelPumps(unittest.TestCase):
527 helper = None
529 @classmethod
530 def setUpClass(cls):
531 cls.helper = ParallelPumpHelper()
533 def tearDown(self) -> None:
534 self.helper.reset()
536 def test_pump_setup1(self):
537 """ Two parallel pumps."""
538 graph, flags = self.helper.get_setup_pumps1()
539 models = flags['pumps1']
540 pumps = [item for item in models if isinstance(item, hvac.Pump)]
541 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
542 self.assertEqual(len(matches), 1)
543 agg_pump = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0])
544 expected_power = sum([p.rated_power for p in pumps])
545 expected_height = sum([p.rated_height for p in pumps]) / len(pumps)
546 expected_volume_flow = sum([p.rated_volume_flow for p in pumps])
547 expected_diamter = sum([p.diameter**2 for p in pumps])**.5
549 self.assertAlmostEqual(agg_pump.rated_volume_flow, expected_volume_flow)
550 self.assertAlmostEqual(agg_pump.rated_height, expected_height)
551 self.assertAlmostEqual(agg_pump.rated_power, expected_power)
552 self.assertAlmostEqual(agg_pump.diameter, expected_diamter)
554 mapping = agg_pump.get_replacement_mapping()
555 graph.merge(
556 mapping=agg_pump.get_replacement_mapping(),
557 inner_connections=agg_pump.inner_connections,
558 )
559 self.assertCountEqual([agg_pump.ports[0], agg_pump.ports[1]],
560 [mapping[models[0].ports[0]],
561 mapping[models[-1].ports[1]]])
563 def test_pump_setup2(self):
564 """ Five parallel pumps."""
565 graph, flags = self.helper.get_setup_pumps2()
566 models = flags['normal']
567 small = flags['small']
568 pumps = [item for item in models if isinstance(item, hvac.Pump)]
569 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
571 self.assertEqual(len(matches), 1)
572 agg_pump = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0])
573 # TODO: before merge check units
574 expected_power = sum([p.rated_power for p in pumps])
575 expected_height = sum([p.rated_height for p in pumps]) / len(pumps) # only for same size pumps
576 expected_volume_flow = sum([p.rated_volume_flow for p in pumps])
577 expected_diameter = sum([p.diameter**2 for p in pumps])**.5
579 self.assertAlmostEqual(agg_pump.rated_volume_flow, expected_volume_flow)
580 self.assertAlmostEqual(agg_pump.rated_height, expected_height)
581 self.assertAlmostEqual(agg_pump.rated_power, expected_power)
582 self.assertAlmostEqual(agg_pump.diameter, expected_diameter)
584 graph.merge(
585 mapping=agg_pump.get_replacement_mapping(),
586 inner_connections=agg_pump.inner_connections,
587 )
588 remaining_pumps = [node for node in graph.element_graph.nodes if
589 node.__class__.__name__ == 'Pump']
590 small_pumps = [item for item in small if item.__class__.__name__ ==
591 'Pump']
592 unconnected_nodes = list(nx.isolates(graph))
594 # check of small pump still in graph
595 self.assertCountEqual(remaining_pumps, small_pumps)
596 # check for unconnected nodes
597 self.assertCountEqual(unconnected_nodes, [])
599 def test_pump_setup4(self):
600 """Four parallel pumps, one small with bypass."""
601 graph, flags = self.helper.get_setup_pumps4()
602 models = flags['normal']
603 small = flags['small']
604 pumps = [item for item in models if isinstance(item, hvac.Pump)]
605 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
607 self.assertEqual(len(matches), 1)
608 agg_pump = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0])
609 # TODO: before merge check units
610 expected_power = sum([p.rated_power for p in pumps])
611 expected_height = sum([p.rated_height for p in pumps]) / len(pumps) # only for same size pumps
612 expected_volume_flow = sum([p.rated_volume_flow for p in pumps])
613 expected_diameter = sum([p.diameter**2 for p in pumps])**.5
615 self.assertAlmostEqual(agg_pump.rated_volume_flow, expected_volume_flow)
616 self.assertAlmostEqual(agg_pump.rated_height, expected_height)
617 self.assertAlmostEqual(agg_pump.rated_power, expected_power)
618 self.assertAlmostEqual(agg_pump.diameter, expected_diameter)
620 graph.merge(
621 mapping=agg_pump.get_replacement_mapping(),
622 inner_connections=agg_pump.inner_connections,
623 )
624 remaining_pumps = [node for node in graph.element_graph.nodes if
625 node.__class__.__name__ == 'Pump']
626 small_pumps = [item for item in small if item.__class__.__name__ ==
627 'Pump']
628 unconnected_nodes = list(nx.isolates(graph))
630 # check of small pump still in graph
631 self.assertCountEqual(remaining_pumps, small_pumps)
632 # check for unconnected nodes
633 self.assertCountEqual(unconnected_nodes, [])
635 def test_pump_setup5(self):
636 """Five parallel pumps, one smaller, additional connections."""
637 graph, flags = self.helper.get_setup_pumps5()
639 models = flags['normal']
640 small = flags['small']
641 pumps = [item for item in models if isinstance(item, hvac.Pump)]
642 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
644 self.assertEqual(len(matches), 1)
645 agg_pump = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0])
646 # todo before merge check units
647 expected_power = sum([p.rated_power for p in pumps])
648 expected_height = sum([p.rated_height for p in pumps]) / len(pumps) # only for same size pumps
649 expected_volume_flow = sum([p.rated_volume_flow for p in pumps])
650 expected_diamter = sum([p.diameter**2 for p in pumps])**.5
651 pumps_in_aggr = [item for item in agg_pump.elements if
652 isinstance(item, hvac.Pump)]
653 self.assertAlmostEqual(agg_pump.rated_volume_flow, expected_volume_flow)
654 self.assertAlmostEqual(agg_pump.rated_height, expected_height)
655 self.assertAlmostEqual(agg_pump.rated_power, expected_power)
656 self.assertAlmostEqual(agg_pump.diameter, expected_diamter)
657 self.assertCountEqual(pumps_in_aggr, pumps)
659 graph.merge(
660 mapping=agg_pump.get_replacement_mapping(),
661 inner_connections=agg_pump.inner_connections,
662 )
664 remaining_pumps = [node for node in graph.element_graph.nodes if
665 node.__class__.__name__ == 'Pump']
666 small_pumps = [item for item in small if item.__class__.__name__ ==
667 'Pump']
668 unconnected_nodes = list(nx.isolates(graph))
670 # check of small pump still in graph
671 self.assertCountEqual(remaining_pumps, small_pumps)
672 # check for unconnected nodes
673 self.assertCountEqual(unconnected_nodes, [])
675 def test_basics(self):
676 graph, flags = self.helper.get_setup_pumps1()
678 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
679 self.assertEqual(len(matches), 1)
681 agg = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0])
682 self.assertTrue(self.helper.elements_in_agg(agg))
684 def test_detection_pumps1(self):
685 """test detection of ParallelPumps in setup pumps1"""
686 graph, flags = self.helper.get_setup_pumps1()
688 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
690 self.assertEqual(
691 len(matches), 1,
692 "There are 1 cases for ParallelPumps but 'find_matches' returned %d"
693 % len(matches)
694 )
696 def test_detection_pumps2(self):
697 """test detection of ParallelPumps in setup pumps2"""
698 graph, flags = self.helper.get_setup_pumps2()
700 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
702 self.assertEqual(
703 len(matches), 1,
704 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches)
705 )
707 def test_detection_pumps3(self):
708 """test detection of ParallelPumps in setup pumps2"""
709 graph, flags = self.helper.get_setup_pumps3()
711 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
713 self.assertEqual(
714 len(matches), 1,
715 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches)
716 )
718 def test_detection_pumps4(self):
719 """test detection of ParallelPumps in setup pumps4"""
720 graph, flags = self.helper.get_setup_pumps4()
722 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
724 self.assertEqual(
725 len(matches), 1,
726 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches)
727 )
729 def test_detection_system(self):
730 """test detection of ParallelPumps in setup system"""
731 graph, flags = self.helper.get_setup_system()
733 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph)
734 self.assertEqual(
735 len(matches), 2,
736 "There are 2 cases for ParallelPumps but 'find_matches' returned %d"
737 % len(matches)
738 )
740 n_pumps1 = len([item for item in flags['pumps1']
741 if isinstance(item, hvac.Pump)])
742 n_pumps2 = len([item for item in flags['normal']
743 if isinstance(item, hvac.Pump)])
745 match_pumps = []
746 for match in matches:
747 match_pumps.append([ele for ele in match.elements
748 if isinstance(ele, hvac.Pump)])
750 target_pumps = {n_pumps1, n_pumps2}
751 actual_pumps = {len(mp) for mp in match_pumps}
752 self.assertSetEqual(
753 target_pumps, actual_pumps,
754 "{} and {} pumps expected but the finder found {} and {} "
755 "pumps.".format(*target_pumps, *actual_pumps))
758if __name__ == '__main__':
759 unittest.main()