Coverage for test/unit/elements/aggregation/test_generator.py: 99%

261 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 17:09 +0000

1import unittest 

2 

3import bim2sim.elements.aggregation.hvac_aggregations 

4from bim2sim.kernel.decision.decisionhandler import DebugDecisionHandler 

5from bim2sim.elements import aggregation 

6from bim2sim.elements import hvac_elements as hvac 

7from bim2sim.elements.graphs.hvac_graph import HvacGraph 

8from bim2sim.elements.mapping.units import ureg 

9from bim2sim.tasks.hvac import expansiontanks, dead_ends 

10from test.unit.elements.helper import SetupHelperHVAC 

11 

12 

13class GeneratorHelper(SetupHelperHVAC): 

14 

15 def get_setup_boiler_with_bypass(self): 

16 """Simple generator system made of boiler, pump, bypass, expansion 

17 tank, distributor and pipes""" 

18 flags = {} 

19 with self.flag_manager(flags): 

20 # generator circuit 

21 boiler = self.element_generator(hvac.Boiler, rated_power=200) 

22 gen_vl_a = [ 

23 self.element_generator(hvac.Pipe, length=100, diameter=40) 

24 for i in range(3)] 

25 h_pump = self.element_generator( 

26 hvac.Pump, rated_power=2.2, rated_height=12, 

27 rated_volume_flow=8) 

28 gen_vl_b1 = [ 

29 self.element_generator( 

30 hvac.Pipe, flags=['strand1'], length=100, diameter=40) 

31 for i in range(2)] 

32 gen_vl_b2 = [ 

33 self.element_generator( 

34 hvac.Pipe, flags=['strand1'], length=100, diameter=40) 

35 for i in range(3)] 

36 distributor = self.element_generator( 

37 hvac.Distributor, flags=['distributor'], n_ports=4) # volume=80 

38 gen_rl_a = [ 

39 self.element_generator(hvac.Pipe, length=100, diameter=40) 

40 for i in range(4)] 

41 fitting = self.element_generator( 

42 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

43 fitting_bp_1 = self.element_generator( 

44 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

45 fitting_bp_2 = self.element_generator( 

46 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

47 gen_rl_b1 = [ 

48 self.element_generator(hvac.Pipe, length=100, diameter=40) 

49 for i in range(2)] 

50 gen_rl_b2 = [ 

51 self.element_generator(hvac.Pipe, length=100, diameter=40) 

52 for i in range(2)] 

53 gen_rl_c = [ 

54 self.element_generator( 

55 hvac.Pipe, flags=['strand2'], length=(1 + i) * 40, 

56 diameter=15) 

57 for i in range(1)] 

58 tank = self.element_generator(hvac.Storage, n_ports=1) 

59 bypass = [ 

60 self.element_generator( 

61 hvac.Pipe, flags=['bypass'], length=60, diameter=30), 

62 self.element_generator( 

63 hvac.Valve, flags=['bypass'], length=10, diameter=30), 

64 self.element_generator( 

65 hvac.Pipe, flags=['bypass'], length=60, diameter=30)] 

66 pipe_outer_vl_distr = [ 

67 self.element_generator( 

68 hvac.Pipe, flags=['outer_vl'], length=100, diameter=40) 

69 for i in range(2)] 

70 pipe_outer_rl_distr = [ 

71 self.element_generator( 

72 hvac.Pipe, flags=['outer_rl'], length=100, diameter=40) 

73 for i in range(2)] 

74 

75 # connect 

76 gen_vl = [boiler, *gen_vl_a, h_pump] 

77 self.connect_strait(gen_vl) 

78 self.connect_strait([h_pump, *gen_rl_b1, fitting_bp_1]) 

79 self.connect_strait([fitting_bp_1, *gen_rl_b2, distributor]) 

80 self.connect_strait([distributor, *gen_rl_a, fitting]) 

81 self.connect_strait([fitting, *gen_vl_b1, fitting_bp_2]) 

82 self.connect_strait([fitting_bp_2, *gen_vl_b2, boiler]) 

83 self.connect_strait([*gen_rl_c, tank]) 

84 self.connect_strait([*bypass]) 

85 self.connect_strait([*pipe_outer_rl_distr]) 

86 self.connect_strait([*pipe_outer_vl_distr]) 

87 pipe_outer_vl_distr[-1].ports[-1].connect( 

88 pipe_outer_rl_distr[0].ports[0]) 

89 distributor.ports[2].connect(pipe_outer_vl_distr[0].ports[0]) 

90 distributor.ports[3].connect(pipe_outer_rl_distr[-1].ports[-1]) 

91 fitting.ports[2].connect(gen_rl_c[0].ports[0]) 

92 fitting_bp_1.ports[2].connect(bypass[0].ports[0]) 

93 fitting_bp_2.ports[2].connect(bypass[-1].ports[-1]) 

94 

95 # full system 

96 gen_circuit = [ 

97 boiler, *gen_vl_a, h_pump, *gen_vl_b1, *gen_vl_b2, distributor, 

98 *gen_rl_a, fitting, fitting_bp_1, fitting_bp_2, *bypass, *gen_rl_b1, 

99 *gen_rl_b2, *gen_rl_c, tank, *pipe_outer_vl_distr, 

100 *pipe_outer_rl_distr 

101 ] 

102 

103 return HvacGraph(gen_circuit), flags 

104 

105 def get_setup_two_seperate_boilers(self): 

106 """Simple generator system made of boiler, pump, bypass, expansion 

107 tank, distributor and pipes, bufferstorage""" 

108 flags = {} 

109 with self.flag_manager(flags): 

110 # generator circuit 1 

111 boiler = self.element_generator(hvac.Boiler, rated_power=200) 

112 gen_vl_a = [ 

113 self.element_generator(hvac.Pipe, length=100, diameter=40) 

114 for i in range(3)] 

115 h_pump = self.element_generator( 

116 hvac.Pump, rated_power=2.2, rated_height=12, 

117 rated_volume_flow=8) 

118 gen_vl_b1 = [ 

119 self.element_generator( 

120 hvac.Pipe, flags=['strand1'], length=100, diameter=40) 

121 for i in range(2)] 

122 gen_vl_b2 = [ 

123 self.element_generator( 

124 hvac.Pipe, flags=['strand1'], length=100, diameter=40) 

125 for i in range(3)] 

126 distributor = self.element_generator(hvac.Distributor, flags=[ 

127 'distributor'], n_ports=4) # volume=80 

128 gen_rl_a = [ 

129 self.element_generator(hvac.Pipe, length=100, diameter=40) 

130 for i in range(4)] 

131 fitting = self.element_generator( 

132 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

133 fitting_bp_1 = self.element_generator( 

134 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

135 fitting_bp_2 = self.element_generator( 

136 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

137 gen_rl_b1 = [ 

138 self.element_generator(hvac.Pipe, length=100, diameter=40) 

139 for i in range(2)] 

140 gen_rl_b2 = [ 

141 self.element_generator(hvac.Pipe, length=100, diameter=40) 

142 for i in range(2)] 

143 gen_rl_c = [ 

144 self.element_generator( 

145 hvac.Pipe, flags=['strand2'], length=(1 + i) * 40, 

146 diameter=15) 

147 for i in range(3) 

148 ] 

149 tank = self.element_generator(hvac.Storage, n_ports=1) 

150 bypass = [self.element_generator( 

151 hvac.Pipe, flags=['bypass'], length=60, diameter=30) 

152 for i in range(3)] 

153 # connect 

154 gen_vl = [boiler, *gen_vl_a, h_pump] 

155 self.connect_strait(gen_vl) 

156 self.connect_strait([h_pump, *gen_rl_b1, fitting_bp_1]) 

157 self.connect_strait([fitting_bp_1, *gen_rl_b2, distributor]) 

158 self.connect_strait([distributor, *gen_rl_a, fitting]) 

159 self.connect_strait([fitting, *gen_vl_b1, fitting_bp_2]) 

160 self.connect_strait([fitting_bp_2, *gen_vl_b2, boiler]) 

161 self.connect_strait([*gen_rl_c, tank]) 

162 self.connect_strait([*bypass]) 

163 fitting.ports[2].connect(gen_rl_c[0].ports[0]) 

164 fitting_bp_1.ports[2].connect(bypass[0].ports[0]) 

165 fitting_bp_2.ports[2].connect(bypass[-1].ports[-1]) 

166 

167 # generator circuit 2 

168 with self.flag_manager(flags): 

169 boiler2 = self.element_generator(hvac.Boiler, rated_power=200) 

170 gen_vl_a2 = [ 

171 self.element_generator(hvac.Pipe, length=100, diameter=40) 

172 for i in range(3)] 

173 h_pump2 = self.element_generator( 

174 hvac.Pump, rated_power=2.2, rated_height=12, 

175 rated_volume_flow=8) 

176 gen_vl_b12 = [ 

177 self.element_generator( 

178 hvac.Pipe, flags=['strand12'], length=100, diameter=40) 

179 for i in range(2)] 

180 gen_vl_b22 = [ 

181 self.element_generator( 

182 hvac.Pipe, flags=['strand12'], length=100, diameter=40) 

183 for i in range(3)] 

184 distributor2 = self.element_generator(hvac.Distributor, flags=[ 

185 'distributor2'], n_ports=4) # volume=80 

186 gen_rl_a2 = [ 

187 self.element_generator(hvac.Pipe, length=100, diameter=40) 

188 for i in range(4)] 

189 fitting2 = self.element_generator( 

190 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

191 fitting_bp_12 = self.element_generator( 

192 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

193 fitting_bp_22 = self.element_generator( 

194 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

195 gen_rl_b12 = [ 

196 self.element_generator(hvac.Pipe, length=100, diameter=40) 

197 for i in range(2)] 

198 gen_rl_b22 = [ 

199 self.element_generator(hvac.Pipe, length=100, diameter=40) 

200 for i in range(2)] 

201 gen_rl_c2 = [ 

202 self.element_generator( 

203 hvac.Pipe, flags=['strand22'], length=(1 + i) * 40, 

204 diameter=15) 

205 for i in range(3) 

206 ] 

207 tank2 = self.element_generator(hvac.Storage, n_ports=1) 

208 bypass2 = [self.element_generator( 

209 hvac.Pipe, flags=['bypass2'], length=60, diameter=30) 

210 for i in range(3)] 

211 # connect 

212 

213 gen_vl2 = [boiler2, *gen_vl_a2, h_pump2] 

214 self.connect_strait(gen_vl2) 

215 self.connect_strait([h_pump2, *gen_rl_b12, fitting_bp_12]) 

216 self.connect_strait([fitting_bp_12, *gen_rl_b22, distributor2]) 

217 self.connect_strait([distributor2, *gen_rl_a2, fitting2]) 

218 self.connect_strait([fitting2, *gen_vl_b12, fitting_bp_22]) 

219 self.connect_strait([fitting_bp_22, *gen_vl_b22, boiler2]) 

220 self.connect_strait([*gen_rl_c2, tank2]) 

221 self.connect_strait([*bypass2]) 

222 fitting2.ports[2].connect(gen_rl_c2[0].ports[0]) 

223 fitting_bp_12.ports[2].connect(bypass2[0].ports[0]) 

224 fitting_bp_22.ports[2].connect(bypass2[-1].ports[-1]) 

225 

226 # connection between two systems 

227 with self.flag_manager(flags): 

228 con_sys_1_vl = [ 

229 self.element_generator(hvac.Pipe, length=100, diameter=40) 

230 for i in range(2)] 

231 con_sys_2_vl = [ 

232 self.element_generator(hvac.Pipe, length=100, diameter=40) 

233 for i in range(2)] 

234 con_sys_1_rl = [ 

235 self.element_generator(hvac.Pipe, length=100, diameter=40) 

236 for i in range(2)] 

237 con_sys_2_rl = [ 

238 self.element_generator(hvac.Pipe, length=100, diameter=40) 

239 for i in range(2)] 

240 con_fitting_vl = self.element_generator( 

241 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

242 con_fitting_rl = self.element_generator( 

243 hvac.PipeFitting, n_ports=3, diameter=40, length=60) 

244 dead_end_vl = [ 

245 self.element_generator(hvac.Pipe, length=100, diameter=40) 

246 for i in range(2)] 

247 dead_end_rl = [ 

248 self.element_generator(hvac.Pipe, length=100, diameter=40) 

249 for i in range(2)] 

250 self.connect_strait([*con_sys_1_vl]) 

251 self.connect_strait([*con_sys_2_vl]) 

252 self.connect_strait([*con_sys_1_rl]) 

253 self.connect_strait([*con_sys_2_rl]) 

254 self.connect_strait([*dead_end_vl]) 

255 self.connect_strait([*dead_end_rl]) 

256 con_fitting_vl.ports[0].connect(con_sys_1_vl[-1].ports[-1]) 

257 con_fitting_vl.ports[1].connect(con_sys_2_vl[-1].ports[-1]) 

258 con_fitting_vl.ports[2].connect(dead_end_vl[0].ports[0]) 

259 con_fitting_rl.ports[0].connect(dead_end_rl[-1].ports[-1]) 

260 con_fitting_rl.ports[1].connect(con_sys_1_rl[0].ports[0]) 

261 con_fitting_rl.ports[2].connect(con_sys_2_rl[0].ports[0]) 

262 distributor.ports[2].connect(con_sys_1_vl[0].ports[0]) 

263 distributor.ports[3].connect(con_sys_1_rl[-1].ports[-1]) 

264 distributor2.ports[2].connect(con_sys_2_vl[0].ports[0]) 

265 distributor2.ports[3].connect(con_sys_2_rl[-1].ports[-1]) 

266 

267 # full system 

268 gen_circuit = [ 

269 boiler, *gen_vl_a, h_pump, *gen_vl_b1, *gen_vl_b2, distributor, 

270 *gen_rl_a, fitting, fitting_bp_1, fitting_bp_2, *bypass, *gen_rl_b1, 

271 *gen_rl_b2, *gen_rl_c, tank, 

272 boiler2, *gen_vl_a2, h_pump2, *gen_vl_b12, *gen_vl_b22, 

273 distributor2, 

274 *gen_rl_a2, fitting2, fitting_bp_12, fitting_bp_22, *bypass2, 

275 *gen_rl_b12, 

276 *gen_rl_b22, *gen_rl_c2, tank2, *con_sys_1_vl, *con_sys_2_vl, 

277 *con_sys_1_rl, *con_sys_2_rl, *dead_end_vl, *dead_end_rl, 

278 con_fitting_vl, con_fitting_rl, 

279 

280 ] 

281 

282 return HvacGraph(gen_circuit), flags 

283 

284 def setup_get_two_parallel_boilers(self): 

285 """Generator system made of two boilers, two pumps, 1 bypass, expansion 

286 tank, distributor and pipes. 

287 

288 .. image: two_parallel_boilers_test.png 

289 """ 

290 flags = {} 

291 with self.flag_manager(flags): 

292 # generator circuit 

293 boiler1 = self.element_generator(hvac.Boiler, rated_power=200, 

294 flags=['boiler200kW']) 

295 boiler2 = self.element_generator(hvac.Boiler, rated_power=400, 

296 flags=['boiler400kW']) 

297 h_pump1 = self.element_generator(hvac.Pump, rated_power=2.2, 

298 rated_height=12, 

299 rated_volume_flow=8) 

300 h_pump2 = self.element_generator(hvac.Pump, rated_power=2.2, 

301 rated_height=12, 

302 rated_volume_flow=8) 

303 gen_strand1 = [self.element_generator(hvac.Pipe, flags=[ 

304 'strand1'], length=100, diameter=40) for i in range(2)] 

305 gen_strand2 = [self.element_generator(hvac.Pipe, flags=[ 

306 'strand2'], length=100, diameter=40) for i in range(3)] 

307 gen_strand3 = [self.element_generator(hvac.Pipe, flags=[ 

308 'strand3'], length=100, diameter=40) for i in range(2)] 

309 gen_strand4 = [self.element_generator(hvac.Pipe, flags=[ 

310 'strand4'], length=100, diameter=40) for i in range(3)] 

311 gen_strand5 = [self.element_generator(hvac.Pipe, flags=[ 

312 'strand5'], length=100, diameter=40) for i in range(2)] 

313 gen_strand6 = [self.element_generator(hvac.Pipe, flags=[ 

314 'strand6'], length=100, diameter=40) for i in range(1)] 

315 gen_strand7 = [self.element_generator(hvac.Pipe, flags=[ 

316 'strand7'], length=100, diameter=40) for i in range(1)] 

317 gen_strand8 = [self.element_generator(hvac.Pipe, flags=[ 

318 'strand8'], length=100, diameter=40) for i in range(1)] 

319 gen_strand9 = [self.element_generator(hvac.Pipe, flags=[ 

320 'strand9'], length=100, diameter=40) for i in range(1)] 

321 gen_strand10 = [self.element_generator(hvac.Pipe, flags=[ 

322 'strand10'], length=100, diameter=40) for i in range(1)] 

323 gen_strand11 = [self.element_generator(hvac.Pipe, flags=[ 

324 'strand11'], length=100, diameter=40) for i in range(3)] 

325 distributor = self.element_generator( 

326 hvac.Distributor, flags=['distributor'], n_ports=4) 

327 fitting1 = self.element_generator(hvac.PipeFitting, n_ports=3, 

328 diameter=40, length=60) 

329 fitting2 = self.element_generator(hvac.PipeFitting, n_ports=3, 

330 diameter=40, length=60) 

331 fitting3 = self.element_generator(hvac.PipeFitting, n_ports=3, 

332 diameter=40, length=60) 

333 fitting4 = self.element_generator(hvac.PipeFitting, n_ports=3, 

334 diameter=40, length=60) 

335 pipe_outer_vl_distr = [ 

336 self.element_generator( 

337 hvac.Pipe, flags=['outer_vl'], length=100, diameter=40) 

338 for i in range(2)] 

339 pipe_outer_rl_distr = [ 

340 self.element_generator( 

341 hvac.Pipe, flags=['outer_rl'], length=100, diameter=40) 

342 for i in range(2)] 

343 

344 # connect 

345 gen_dis = [*gen_strand1, distributor, *gen_strand2] 

346 gen_boi1 = [ 

347 *gen_strand3, h_pump2, *gen_strand4, boiler2, *gen_strand5] 

348 gen_boi2_rl = [*gen_strand6, h_pump1, *gen_strand7] 

349 gen_boi2 = [*gen_strand8, boiler1, *gen_strand9] 

350 self.connect_strait(gen_dis) 

351 self.connect_strait(gen_boi1) 

352 self.connect_strait(gen_boi2_rl) 

353 self.connect_strait(gen_boi2) 

354 self.connect_strait([*gen_strand10]) 

355 self.connect_strait([*gen_strand11]) 

356 self.connect_strait([*pipe_outer_vl_distr, *pipe_outer_rl_distr]) 

357 fitting1.ports[0].connect(gen_strand1[0].ports[0]) 

358 gen_strand2[-1].ports[-1].connect(fitting2.ports[0]) 

359 fitting2.ports[1].connect(gen_strand3[0].ports[0]) 

360 gen_strand5[-1].ports[-1].connect(fitting1.ports[1]) 

361 fitting2.ports[2].connect(gen_strand6[0].ports[0]) 

362 gen_strand7[-1].ports[-1].connect(fitting3.ports[0]) 

363 fitting3.ports[1].connect(gen_strand8[0].ports[0]) 

364 gen_strand9[-1].ports[-1].connect(fitting4.ports[0]) 

365 fitting4.ports[1].connect(gen_strand10[0].ports[0]) 

366 gen_strand10[-1].ports[-1].connect(fitting1.ports[2]) 

367 fitting3.ports[2].connect(gen_strand11[0].ports[0]) 

368 gen_strand11[-1].ports[-1].connect(fitting4.ports[2]) 

369 distributor.ports[2].connect(pipe_outer_vl_distr[0].ports[0]) 

370 distributor.ports[3].connect(pipe_outer_rl_distr[-1].ports[-1]) 

371 # full system 

372 gen_circuit = [ 

373 distributor, *gen_strand1, *gen_strand2, *gen_strand3, *gen_strand4, 

374 *gen_strand5, *gen_strand6, *gen_strand7, *gen_strand8, 

375 *gen_strand9, *gen_strand10, *gen_strand11, boiler1, boiler2, 

376 fitting1, fitting2, fitting3, fitting4, h_pump1, h_pump2, 

377 *pipe_outer_vl_distr, *pipe_outer_rl_distr 

378 ] 

379 

380 return HvacGraph(gen_circuit), flags 

381 

382 

383class TestGeneratorAggregation(unittest.TestCase): 

384 helper: GeneratorHelper = None 

385 

386 @classmethod 

387 def setUpClass(cls): 

388 cls.helper = GeneratorHelper() 

389 

390 def tearDown(self): 

391 self.helper.reset() 

392 

393 def test_simple_boiler_with_bypass(self): 

394 graph, flags = self.helper.get_setup_boiler_with_bypass() 

395 pot_tanks = \ 

396 expansiontanks.ExpansionTanks.identify_expansion_tanks(graph) 

397 handler = DebugDecisionHandler(answers=[]) 

398 handler.handle(expansiontanks.ExpansionTanks.decide_expansion_tanks( 

399 graph, pot_tanks, force=True)) 

400 graph, n_removed_tanks = handler.return_value 

401 dead_ends_found = dead_ends.DeadEnds.identify_dead_ends(graph) 

402 handler = DebugDecisionHandler(answers=[]) 

403 handler.handle(dead_ends.DeadEnds.decide_dead_ends( 

404 graph, dead_ends_found, force=True)) 

405 graph, n_removed_dead_ends = handler.return_value 

406 matches, metas = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid.find_matches(graph) 

407 self.assertEqual( 

408 len(matches), 1, 

409 "There is 1 case for generation cycles but 'find_matches' " 

410 "returned %d" % len(matches) 

411 ) 

412 agg_generator = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid( 

413 graph, matches[0], **metas[0]) 

414 self.assertEqual(agg_generator.rated_power, 200 * ureg.kilowatt) 

415 self.assertTrue(agg_generator._calc_has_pump, 

416 "No pump was found in generator cycle but there should" 

417 " be one existing") 

418 self.assertTrue(agg_generator.has_bypass, 

419 "No bypass was found in generator cycle but there " 

420 "should be one existing") 

421 graph.merge( 

422 mapping=agg_generator.get_replacement_mapping(), 

423 inner_connections=agg_generator.get_inner_connections(), 

424 ) 

425 

426 def test_two_simple_boiler_with_bypass(self): 

427 graph, flags = self.helper.get_setup_two_seperate_boilers() 

428 pot_tanks = \ 

429 expansiontanks.ExpansionTanks.identify_expansion_tanks(graph) 

430 handler = DebugDecisionHandler(answers=[]) 

431 handler.handle(expansiontanks.ExpansionTanks.decide_expansion_tanks( 

432 graph, pot_tanks, force=True)) 

433 graph, n_removed_tanks = handler.return_value 

434 dead_ends_found = dead_ends.DeadEnds.identify_dead_ends(graph) 

435 handler = DebugDecisionHandler(answers=[]) 

436 handler.handle(dead_ends.DeadEnds.decide_dead_ends( 

437 graph, dead_ends_found, force=True)) 

438 graph, n_removed_dead_ends = handler.return_value 

439 matches, metas = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid.find_matches(graph) 

440 agg_generators = [] 

441 self.assertEqual( 

442 len(matches), 2, 

443 "There are 2 generation cycles but 'find_matches' " 

444 "returned %d" % len(matches) 

445 ) 

446 

447 i = 0 

448 for match, meta in zip(matches, metas): 

449 agg_generator = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid(graph, match, **meta) 

450 i += 1 

451 agg_generators.append(agg_generator) 

452 self.assertEqual(agg_generator.rated_power, 200 * ureg.kilowatt) 

453 self.assertTrue(agg_generator.has_pump, 

454 "No pump was found in generator cycle but there" 

455 " should be one existing") 

456 self.assertTrue(agg_generator._calc_has_pump, 

457 "No pump was found in generator cycle but there" 

458 " should be one existing") 

459 

460 self.assertEqual(len(matches), 2, f"2 Generator should be created but " 

461 f"only {len(matches)} where created ") 

462 

463 mappings = [] 

464 for agg_generator in agg_generators[::-1]: 

465 mapping = agg_generator.get_replacement_mapping() 

466 mappings.append(mapping) 

467 graph.merge( 

468 mapping=agg_generator.get_replacement_mapping(), 

469 inner_connections=agg_generator.get_inner_connections(), 

470 ) 

471 

472 def test_two_parallel_boilers_with_bypass(self): 

473 graph, flags = self.helper.setup_get_two_parallel_boilers() 

474 matches, metas = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid.find_matches(graph) 

475 self.assertEqual( 

476 len(matches), 2, 

477 "There are 2 generation cycles but 'find_matches' returned %d" 

478 % len(matches) 

479 ) 

480 i = 0 

481 agg_generators = [] 

482 boiler200kw_guid = [b.guid for b in flags['boiler200kW']] 

483 boiler400kw_guid = [b.guid for b in flags['boiler400kW']] 

484 for match, meta in zip(matches, metas): 

485 agg_generator = bim2sim.elements.aggregation.hvac_aggregations.GeneratorOneFluid(graph, match, **meta) 

486 i += 1 

487 agg_generators.append(agg_generator) 

488 boiler_element = [element for element in agg_generator.elements 

489 if isinstance(element, hvac.Boiler)][0] 

490 if boiler_element.guid == boiler200kw_guid: 

491 self.assertEqual(agg_generator.rated_power, 200 * ureg.kilowatt) 

492 if boiler_element.guid == boiler400kw_guid: 

493 self.assertEqual(agg_generator.rated_power, 400 * ureg.kilowatt) 

494 self.assertTrue(agg_generator._calc_has_pump, 

495 "No pump was found in generator cycle but there" 

496 " should be one existing") 

497 self.assertEqual(len(matches), 2, f"2 Generator should be created but " 

498 f"only {len(matches)} where created ") 

499 mappings = [] 

500 for agg_generator in agg_generators[::-1]: 

501 mapping = agg_generator.get_replacement_mapping() 

502 mappings.append(mapping) 

503 graph.merge( 

504 mapping=agg_generator.get_replacement_mapping(), 

505 inner_connections=agg_generator.get_inner_connections(), 

506 )