개정판 ef062496
issue #1265 : Calculation
Change-Id: I3d89b5a422171d887a38263155398b808dae075d
HYTOS/HYTOS/Commands/HydroCalculationCommand.py | ||
---|---|---|
54 | 54 |
|
55 | 55 |
return item.category == 'Equipment - [ Pressurized ]' or (item.name == 'R_Comp' or item.name == 'L_Comp') |
56 | 56 |
|
57 |
def del_p_cal(self): |
|
58 |
for loop in self.loops: |
|
59 |
items = loop.items |
|
60 |
for item in items: |
|
61 |
if item == items[0] or item == items[-1]: |
|
62 |
continue |
|
63 |
loop.pressures[item] = 0 |
|
64 |
|
|
65 |
def search_cv_calc(self): |
|
66 |
for loop in self.loops: |
|
67 |
cvdp = [] |
|
68 |
cvdp.append(100000000) |
|
69 |
for item in loop.items: |
|
70 |
name = str(item)[:3] |
|
71 |
if name == 'CV_': |
|
72 |
if item in loop.pressure_drops: |
|
73 |
if loop.pressure_drops[item] > 0: |
|
74 |
cvdp.append(loop.pressure_drops[item]) |
|
75 |
|
|
76 |
cvdp_final = min(cvdp) |
|
77 |
|
|
78 |
for item in loop.items: |
|
79 |
name = str(item)[:3] |
|
80 |
if name == 'CV_': |
|
81 |
if loop.pressure_drops[item] > 0: |
|
82 |
loop.pressure_drops[item] = cvdp_final |
|
83 |
else: |
|
84 |
loop.extras[item] = cvdp_final / (cvdp_final + loop.total_device_loss + loop.line_total_friction_loss) |
|
85 |
|
|
86 |
def search_pump_calc(self): |
|
87 |
pumpdp = [] |
|
88 |
pumpdp.append(0.00000001) |
|
89 |
|
|
90 |
# (1) 펌프 헤드 결정 |
|
91 |
for loop in self.loops: |
|
92 |
for item in loop.items: |
|
93 |
name = str(item)[:3] |
|
94 |
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_P': |
|
95 |
if item in loop.pressure_drops: |
|
96 |
pumpdp.append(loop.pressure_drops[item]) |
|
97 |
break |
|
98 |
|
|
99 |
pumpdp_final = max(pumpdp) |
|
100 |
|
|
101 |
# (2) 펌프 헤드를 각 루프에 새로 씀 |
|
102 |
for loop in self.loops: |
|
103 |
for item in loop.items: |
|
104 |
name = str(item)[:3] |
|
105 |
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_P': |
|
106 |
loop.pressure_drops[item] = pumpdp_final |
|
107 |
break |
|
108 |
|
|
109 |
for loop in self.loops: |
|
110 |
if loop.fill_end - loop.fill_start != 3: |
|
111 |
loop.suction_cal(2) |
|
112 |
matches = [item for item in loop.items if str(item)[:3] == 'CV_'] |
|
113 |
if matches: |
|
114 |
loop.discharge_cal(2) |
|
115 |
|
|
116 |
def execute_second(self, param): |
|
117 |
|
|
118 |
# 라인 계산된 것을 지운다 |
|
119 |
self.del_p_cal() |
|
120 |
|
|
121 |
# 펌프 먼저 |
|
122 |
self.search_pump_calc() |
|
123 |
|
|
124 |
# CV decision |
|
125 |
self.search_cv_calc() |
|
126 |
|
|
127 |
# 계산 마무리 |
|
128 |
for loop in self.loops: |
|
129 |
for i in range(1, len(loop.items) - 1, 3): |
|
130 |
loop.suction_p_cal(i) |
|
131 |
loop.final_loss_input() |
|
132 |
|
|
133 |
self.init_units() |
|
134 |
self.loop_result() |
|
135 |
|
|
57 | 136 |
def execute(self, param): |
58 | 137 |
""" execute hydro calculation """ |
59 | 138 |
|
... | ... | |
84 | 163 |
if item in loop.pressure_drops: |
85 | 164 |
item.pressure_drop = loop.pressure_drops[item] |
86 | 165 |
|
87 |
self.init_units() |
|
88 |
self.loop_result() |
|
166 |
#self.init_units()
|
|
167 |
#self.loop_result()
|
|
89 | 168 |
|
90 | 169 |
except Exception as ex: |
91 | 170 |
from App import App |
HYTOS/HYTOS/Shapes/EngineeringLoopItem.py | ||
---|---|---|
86 | 86 |
self.loss_input() |
87 | 87 |
self.cv_dp_cal() |
88 | 88 |
self.hole_recalc(self.fill_start, self.fill_end) |
89 |
|
|
90 |
name = str(self.items[self.fill_start + 1])[:3] |
|
91 |
if name == 'CV_': |
|
92 |
self.pressure_drops[self.items[self.fill_start + 1]] = self.pressures[ |
|
93 |
self.items[self.fill_start + 1]] - \ |
|
94 |
self.pressures[ |
|
95 |
self.items[self.fill_start + 2]] |
|
96 |
elif name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'L_K': |
|
97 |
self.pressure_drops[self.items[self.fill_start + 1]] = self.pressures[ |
|
98 |
self.items[self.fill_start + 2]] - \ |
|
99 |
self.pressures[ |
|
100 |
self.items[self.fill_start + 1]] |
|
101 | 89 |
else: |
102 | 90 |
self.loss_input() |
91 |
|
|
92 |
name = str(self.items[self.fill_start + 1])[:3] |
|
93 |
if name == 'CV_': |
|
94 |
self.pressure_drops[self.items[self.fill_start + 1]] = self.pressures[ |
|
95 |
self.items[self.fill_start + 1]] - \ |
|
96 |
self.pressures[ |
|
97 |
self.items[self.fill_start + 2]] |
|
98 |
elif name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
99 |
self.pressure_drops[self.items[self.fill_start + 1]] = self.pressures[ |
|
100 |
self.items[self.fill_start + 2]] - \ |
|
101 |
self.pressures[ |
|
102 |
self.items[self.fill_start + 1]] |
|
103 | 103 |
except Exception as ex: |
104 | 104 |
from App import App |
105 | 105 |
message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, |
... | ... | |
243 | 243 |
sys.exc_info()[-1].tb_lineno) |
244 | 244 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
245 | 245 |
|
246 |
def final_loss_input(self): |
|
247 |
pass |
|
248 |
|
|
246 | 249 |
def loss_input(self): |
247 | 250 |
try: |
248 | 251 |
hole_start, hole_end = self.fill_start, self.fill_end |
... | ... | |
303 | 306 |
sys.exc_info()[-1].tb_lineno) |
304 | 307 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
305 | 308 |
|
306 |
def discharge_cal(self): |
|
309 |
def discharge_cal(self, calc_cnt=1):
|
|
307 | 310 |
try: |
308 | 311 |
if len(self.items) == 3: |
309 | 312 |
# 장치 2개와 Line 1개로 구성된 경우 |
... | ... | |
315 | 318 |
# vapor인 경우 압력강하를 계산해주고 넣어주는 모듈 |
316 | 319 |
if self.items[1].data.phase_type == 'Liquid' or self.items[1].data.phase_type == 'Mixed': |
317 | 320 |
self.pressure_drops[self.items[1]] = self.items[1].data.pressure_drop_friction |
318 |
self.discharge_p_cal(1) |
|
321 |
self.discharge_p_cal(1, calc_cnt)
|
|
319 | 322 |
|
320 | 323 |
elif self.items[1].data.phase_type == 'Vapor': |
321 | 324 |
self.discharge_vapor_factor_length(1) |
322 |
self.discharge_p_cal(1) |
|
325 |
self.discharge_p_cal(1, calc_cnt)
|
|
323 | 326 |
|
324 | 327 |
self.fill_end = 3 |
325 | 328 |
else: |
... | ... | |
332 | 335 |
# vapor인 경우 압력강하를 계산해주고 넣어주는 모듈 |
333 | 336 |
if self.items[i].data.phase_type == 'Liquid' or self.items[i].data.phase_type == 'Mixed': |
334 | 337 |
self.pressure_drops[self.items[i]] = self.items[i].data.pressure_drop_friction |
335 |
asd = self.discharge_p_cal(i) |
|
338 |
asd = self.discharge_p_cal(i, calc_cnt)
|
|
336 | 339 |
if asd == 0: |
337 | 340 |
break |
338 | 341 |
elif self.items[i].data.phase_type == 'Vapor': |
339 | 342 |
self.discharge_vapor_factor_length(i) |
340 |
asd = self.discharge_p_cal(i) |
|
343 |
asd = self.discharge_p_cal(i, calc_cnt)
|
|
341 | 344 |
if asd == 0: |
342 | 345 |
break |
343 | 346 |
|
... | ... | |
397 | 400 |
|
398 | 401 |
mach = velocity / ((k * 9.80665 * 847.28 * temp / mw) ** 0.5) |
399 | 402 |
|
400 |
|
|
401 | 403 |
# '부피유량 계산 |
402 | 404 |
volume = mass / density2 |
403 | 405 |
|
... | ... | |
641 | 643 |
sys.exc_info()[-1].tb_lineno) |
642 | 644 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
643 | 645 |
|
644 |
def suction_cal(self): |
|
646 |
def suction_cal(self, calc_cnt=1):
|
|
645 | 647 |
try: |
646 | 648 |
for i in range(1, len(self.items) - 1, 3): |
647 | 649 |
self.suction_find_line(i) |
... | ... | |
651 | 653 |
if self.items[i].data.phase_type == 'Liquid' or self.items[i].data.phase_type == 'Mixed': |
652 | 654 |
# liquid 인 경우 stream 데이타로부터 del.P를 입력해줌. |
653 | 655 |
self.pressure_drops[self.items[i]] = self.items[i].data.pressure_drop_friction |
654 |
res = self.suction_p_cal(i) |
|
656 |
res = self.suction_p_cal(i, calc_cnt)
|
|
655 | 657 |
if res == 0: |
656 | 658 |
break |
657 | 659 |
elif self.items[i].data.phase_type == 'Vapor': |
658 | 660 |
# vapor인 경우 압력강하를 계산해주고 넣어주는 모듈 |
659 | 661 |
self.suction_vapor_factor_length(i) |
660 |
res = self.suction_p_cal(i) |
|
662 |
res = self.suction_p_cal(i, calc_cnt)
|
|
661 | 663 |
if res == 0: |
662 | 664 |
break |
663 | 665 |
|
... | ... | |
1245 | 1247 |
sys.exc_info()[-1].tb_lineno) |
1246 | 1248 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
1247 | 1249 |
|
1248 |
def suction_p_cal(self, i): |
|
1250 |
def suction_p_cal(self, i, calc_cnt=1):
|
|
1249 | 1251 |
res = 1 |
1250 | 1252 |
|
1251 | 1253 |
try: |
... | ... | |
1293 | 1295 |
if pabsolute < 0: |
1294 | 1296 |
raise ValueError('The absolute pressure of {} is below 0.'.format(self.items[i + 1])) |
1295 | 1297 |
|
1296 |
if self.items[i + 1] in self.pressure_drops and self.pressure_drops[self.items[i + 1]]: |
|
1297 |
name = str(self.items[i + 1])[:3] |
|
1298 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1299 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \ |
|
1300 |
self.pressure_drops[self.items[i + 1]] |
|
1298 |
if calc_cnt == 1: |
|
1299 |
if self.items[i + 1] in self.pressure_drops and self.pressure_drops[self.items[i + 1]] is not None: |
|
1300 |
name = str(self.items[i + 1])[:3] |
|
1301 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1302 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \ |
|
1303 |
self.pressure_drops[self.items[i + 1]] |
|
1304 |
else: |
|
1305 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \ |
|
1306 |
self.pressure_drops[self.items[i + 1]] |
|
1301 | 1307 |
else: |
1302 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \ |
|
1303 |
self.pressure_drops[self.items[i + 1]] |
|
1304 |
else: |
|
1305 |
res = 0 |
|
1308 |
res = 0 |
|
1309 |
elif calc_cnt == 2: |
|
1310 |
if self.items[i + 1] in self.pressure_drops and self.pressure_drops[self.items[i + 1]] is not None: |
|
1311 |
name = str(self.items[i + 1])[:3] |
|
1312 |
if name == 'CV_': |
|
1313 |
res = 0 |
|
1314 |
elif name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1315 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \ |
|
1316 |
self.pressure_drops[self.items[i + 1]] |
|
1317 |
else: |
|
1318 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \ |
|
1319 |
self.pressure_drops[self.items[i + 1]] |
|
1320 |
else: |
|
1321 |
res = 0 |
|
1306 | 1322 |
except Exception as ex: |
1307 | 1323 |
from App import App |
1308 | 1324 |
message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename, |
... | ... | |
1341 | 1357 |
|
1342 | 1358 |
return res |
1343 | 1359 |
|
1344 |
def discharge_p_cal(self, i): |
|
1360 |
def discharge_p_cal(self, i, calc_cnt=1):
|
|
1345 | 1361 |
res = 1 |
1346 | 1362 |
|
1347 | 1363 |
try: |
... | ... | |
1354 | 1370 |
self.pressures[self.items[i - 1]] = self.pressures[self.items[i]] + \ |
1355 | 1371 |
self.pressure_drops[self.items[i - 1]] |
1356 | 1372 |
|
1357 |
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]]: |
|
1358 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1359 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[ |
|
1360 |
self.items[i - 2]] |
|
1373 |
if calc_cnt == 1: |
|
1374 |
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]] is not None: |
|
1375 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1376 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[ |
|
1377 |
self.items[i - 2]] |
|
1378 |
else: |
|
1379 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[ |
|
1380 |
self.items[i - 2]] |
|
1361 | 1381 |
else: |
1362 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[ |
|
1363 |
self.items[i - 2]] |
|
1364 |
else: |
|
1365 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함 |
|
1366 |
res = 0 |
|
1382 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함 |
|
1383 |
res = 0 |
|
1384 |
elif calc_cnt == 2: |
|
1385 |
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]] is not None: |
|
1386 |
if name == 'CV_': |
|
1387 |
self.pressure_drops[self.items[i - 2]] = self.pressures[self.items[i - 2]] - \ |
|
1388 |
self.pressures[self.items[i - 1]] |
|
1389 |
res = 0 |
|
1390 |
elif name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K': |
|
1391 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[ |
|
1392 |
self.items[i - 2]] |
|
1393 |
else: |
|
1394 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[ |
|
1395 |
self.items[i - 2]] |
|
1396 |
else: |
|
1397 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함 |
|
1398 |
res = 0 |
|
1367 | 1399 |
except Exception as ex: |
1368 | 1400 |
from App import App |
1369 | 1401 |
message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename, |
내보내기 Unified diff