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

1import unittest 

2 

3import networkx as nx 

4 

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 

10 

11 

12class ParallelPumpHelper(SetupHelperHVAC): 

13 

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)] 

50 

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]) 

58 

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 ] 

64 

65 flags['connect'] = [con_vl_a[0], con_rl_a[-1]] 

66 

67 graph = HvacGraph(gen_circuit) 

68 return graph, flags 

69 

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)] 

150 

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]) 

167 

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 ] 

173 

174 flags['connect'] = [con_vl_a[0], con_rl_a[-1]] 

175 

176 graph = HvacGraph(gen_circuit) 

177 return graph, flags 

178 

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)] 

247 

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]) 

267 

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 ] 

273 

274 flags['connect'] = [con_vl_a[0], con_rl_a[-1]] 

275 

276 graph = HvacGraph(gen_circuit) 

277 return graph, flags 

278 

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]) 

369 

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]) 

374 

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 ] 

381 

382 flags['connect'] = [con_vl_a[0], con_rl_a[-1]] 

383 

384 graph = HvacGraph(gen_circuit) 

385 return graph, flags 

386 

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)] 

470 

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]) 

489 

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 ] 

496 

497 flags['connect'] = [con_vl_a[0], con_rl_a[-1]] 

498 

499 graph = HvacGraph(gen_circuit) 

500 return graph, flags 

501 

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() 

508 

509 distributor = flags1['distributor'][0] 

510 distributor_ports = self.fake_add_ports(distributor, 4) 

511 

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]) 

515 

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]) 

519 

520 ele = graph1.elements + graph2.elements + graph3.elements 

521 graph = HvacGraph(ele) 

522 flags = {**flags1, **flags2, **flags3} 

523 return graph, flags 

524 

525 

526class TestParallelPumps(unittest.TestCase): 

527 helper = None 

528 

529 @classmethod 

530 def setUpClass(cls): 

531 cls.helper = ParallelPumpHelper() 

532 

533 def tearDown(self) -> None: 

534 self.helper.reset() 

535 

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 

548 

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) 

553 

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]]]) 

562 

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) 

570 

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 

578 

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) 

583 

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

593 

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, []) 

598 

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) 

606 

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 

614 

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) 

619 

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

629 

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, []) 

634 

635 def test_pump_setup5(self): 

636 """Five parallel pumps, one smaller, additional connections.""" 

637 graph, flags = self.helper.get_setup_pumps5() 

638 

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) 

643 

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) 

658 

659 graph.merge( 

660 mapping=agg_pump.get_replacement_mapping(), 

661 inner_connections=agg_pump.inner_connections, 

662 ) 

663 

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

669 

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, []) 

674 

675 def test_basics(self): 

676 graph, flags = self.helper.get_setup_pumps1() 

677 

678 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph) 

679 self.assertEqual(len(matches), 1) 

680 

681 agg = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump(graph, matches[0], **meta[0]) 

682 self.assertTrue(self.helper.elements_in_agg(agg)) 

683 

684 def test_detection_pumps1(self): 

685 """test detection of ParallelPumps in setup pumps1""" 

686 graph, flags = self.helper.get_setup_pumps1() 

687 

688 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph) 

689 

690 self.assertEqual( 

691 len(matches), 1, 

692 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" 

693 % len(matches) 

694 ) 

695 

696 def test_detection_pumps2(self): 

697 """test detection of ParallelPumps in setup pumps2""" 

698 graph, flags = self.helper.get_setup_pumps2() 

699 

700 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph) 

701 

702 self.assertEqual( 

703 len(matches), 1, 

704 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches) 

705 ) 

706 

707 def test_detection_pumps3(self): 

708 """test detection of ParallelPumps in setup pumps2""" 

709 graph, flags = self.helper.get_setup_pumps3() 

710 

711 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph) 

712 

713 self.assertEqual( 

714 len(matches), 1, 

715 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches) 

716 ) 

717 

718 def test_detection_pumps4(self): 

719 """test detection of ParallelPumps in setup pumps4""" 

720 graph, flags = self.helper.get_setup_pumps4() 

721 

722 matches, meta = bim2sim.elements.aggregation.hvac_aggregations.ParallelPump.find_matches(graph) 

723 

724 self.assertEqual( 

725 len(matches), 1, 

726 "There are 1 cases for ParallelPumps but 'find_matches' returned %d" % len(matches) 

727 ) 

728 

729 def test_detection_system(self): 

730 """test detection of ParallelPumps in setup system""" 

731 graph, flags = self.helper.get_setup_system() 

732 

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 ) 

739 

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)]) 

744 

745 match_pumps = [] 

746 for match in matches: 

747 match_pumps.append([ele for ele in match.elements 

748 if isinstance(ele, hvac.Pump)]) 

749 

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

756 

757 

758if __name__ == '__main__': 

759 unittest.main()