46 |
46 |
self.pressure_drops = {}
|
47 |
47 |
self.density_elevations = {}
|
48 |
48 |
self.extras = {}
|
|
49 |
self.pattern = {}
|
49 |
50 |
|
50 |
51 |
self.total_device_loss = None
|
51 |
52 |
self.suction_line_friction_loss = None
|
... | ... | |
55 |
56 |
self.discharge_device_loss = None
|
56 |
57 |
self.total_suction_loss = None
|
57 |
58 |
self.total_discharge_loss = None
|
|
59 |
self.total_loss = None
|
58 |
60 |
self.deviation = None
|
59 |
61 |
|
60 |
62 |
self.fill_start = 0
|
... | ... | |
204 |
206 |
try:
|
205 |
207 |
acv = 0
|
206 |
208 |
for i in range(2, len(self.items) - 3, 3):
|
207 |
|
if not self.items[i] in self.pressure_drops and str(self.items[i])[:3] == 'CV_':
|
|
209 |
# if not self.items[i] in self.pressure_drops and str(self.items[i])[:3] == 'CV_':
|
|
210 |
if self.pattern[self.items[i]] == -4125 and str(self.items[i])[:3] == 'CV_':
|
208 |
211 |
acv = i
|
209 |
212 |
break
|
210 |
213 |
|
... | ... | |
217 |
220 |
elif method == 'lummus':
|
218 |
221 |
ap_lummus = 0
|
219 |
222 |
for i in range(2, len(self.items) - 3, 3):
|
220 |
|
name = str(self.items[i])[:3]
|
221 |
|
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
222 |
|
ap_lummus = i
|
223 |
|
break
|
|
223 |
if self.pattern[self.items[i]] == -4125:
|
|
224 |
name = str(self.items[i])[:3]
|
|
225 |
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
|
226 |
ap_lummus = i
|
|
227 |
break
|
224 |
228 |
self.lummus_cal(pf, acv, ap_lummus)
|
225 |
229 |
elif method == 'mixed':
|
226 |
230 |
ap_lummus = 0
|
227 |
231 |
for i in range(2, len(self.items) - 3, 3):
|
228 |
|
name = str(self.items[i])[:3]
|
229 |
|
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
230 |
|
ap_lummus = i
|
231 |
|
break
|
|
232 |
if self.pattern[self.items[i]] == -4125:
|
|
233 |
name = str(self.items[i])[:3]
|
|
234 |
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
|
235 |
ap_lummus = i
|
|
236 |
break
|
232 |
237 |
self.mixed_cal(pf, acv, ap_lummus)
|
233 |
238 |
elif method == 'aramco':
|
234 |
239 |
self.aramco_cal(pf, acv)
|
... | ... | |
587 |
592 |
sys.exc_info()[-1].tb_lineno)
|
588 |
593 |
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
589 |
594 |
|
|
595 |
def final_suc_p_cal(self, i):
|
|
596 |
res = self.suction_p_cal(i)
|
|
597 |
if res == 0:
|
|
598 |
return
|
|
599 |
|
590 |
600 |
def final_loss_input(self):
|
591 |
601 |
pass
|
592 |
602 |
|
|
603 |
# line_total_friction_loss, total_loss, total_device_loss 값을 계산하지만 사용하는 곳이 없어서 일단 주석
|
|
604 |
'''
|
|
605 |
try:
|
|
606 |
final_line_loss = 0
|
|
607 |
final_dev_loss = 0
|
|
608 |
# 라인(fric)
|
|
609 |
for i in range(2, len(self.items) - 3, 3):
|
|
610 |
final_line_loss += self.pressure_drops[self.items[i]] if self.items[i] in self.pressure_drops else 0
|
|
611 |
self.line_total_friction_loss = final_line_loss
|
|
612 |
final_line_loss = 0
|
|
613 |
|
|
614 |
# 라인(stat)
|
|
615 |
for i in range(1, len(self.items) - 3, 3):
|
|
616 |
final_line_loss += self.pressure_drops[self.items[i]] if self.items[i] in self.pressure_drops else 0
|
|
617 |
self.total_loss = final_line_loss
|
|
618 |
final_line_loss = 0
|
|
619 |
|
|
620 |
# 기기(total)
|
|
621 |
for i in range(3, len(self.items) - 3, 3):
|
|
622 |
name = str(self.items[i])[:3]
|
|
623 |
if name == 'R_P' or name == 'L_P' or name == 'V_P' or name == 'R_K' or name == 'L_K' or name == 'CV_':
|
|
624 |
pass
|
|
625 |
elif name == 'CV_':
|
|
626 |
if self.pattern[self.items[i]] != -4125:
|
|
627 |
final_dev_loss += self.pressure_drops[self.items[i]] if self.items[i] in self.pressure_drops else 0
|
|
628 |
else:
|
|
629 |
final_dev_loss += self.pressure_drops[self.items[i]] if self.items[i] in self.pressure_drops else 0
|
|
630 |
self.total_device_loss = final_dev_loss
|
|
631 |
final_dev_loss = 0
|
|
632 |
|
|
633 |
except Exception as ex:
|
|
634 |
from App import App
|
|
635 |
message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
|
636 |
sys.exc_info()[-1].tb_lineno)
|
|
637 |
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
|
638 |
'''
|
593 |
639 |
def loss_input(self):
|
594 |
640 |
try:
|
595 |
641 |
hole_start, hole_end = self.fill_start, self.fill_end
|
... | ... | |
650 |
696 |
sys.exc_info()[-1].tb_lineno)
|
651 |
697 |
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
652 |
698 |
|
653 |
|
def discharge_cal(self, calc_cnt=1):
|
|
699 |
def discharge_cal(self):
|
654 |
700 |
try:
|
655 |
701 |
if len(self.items) == 3:
|
656 |
702 |
# 장치 2개와 Line 1개로 구성된 경우
|
... | ... | |
662 |
708 |
# vapor인 경우 압력강하를 계산해주고 넣어주는 모듈
|
663 |
709 |
if self.items[1].data.phase_type == 'Liquid' or self.items[1].data.phase_type == 'Mixed':
|
664 |
710 |
self.pressure_drops[self.items[1]] = self.items[1].data.pressure_drop_friction
|
665 |
|
self.discharge_p_cal(1, calc_cnt)
|
|
711 |
self.discharge_p_cal(1)
|
666 |
712 |
|
667 |
713 |
elif self.items[1].data.phase_type == 'Vapor':
|
668 |
714 |
self.discharge_vapor_factor_length(1)
|
669 |
|
self.discharge_p_cal(1, calc_cnt)
|
|
715 |
self.discharge_p_cal(1)
|
670 |
716 |
|
671 |
717 |
self.fill_end = 3
|
672 |
718 |
else:
|
... | ... | |
679 |
725 |
# vapor인 경우 압력강하를 계산해주고 넣어주는 모듈
|
680 |
726 |
if self.items[i].data.phase_type == 'Liquid' or self.items[i].data.phase_type == 'Mixed':
|
681 |
727 |
self.pressure_drops[self.items[i]] = self.items[i].data.pressure_drop_friction
|
682 |
|
asd = self.discharge_p_cal(i, calc_cnt)
|
|
728 |
asd = self.discharge_p_cal(i)
|
683 |
729 |
if asd == 0:
|
684 |
730 |
break
|
685 |
731 |
elif self.items[i].data.phase_type == 'Vapor':
|
686 |
732 |
self.discharge_vapor_factor_length(i)
|
687 |
|
asd = self.discharge_p_cal(i, calc_cnt)
|
|
733 |
asd = self.discharge_p_cal(i)
|
688 |
734 |
if asd == 0:
|
689 |
735 |
break
|
690 |
736 |
|
... | ... | |
1203 |
1249 |
sys.exc_info()[-1].tb_lineno)
|
1204 |
1250 |
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
1205 |
1251 |
|
1206 |
|
def suction_cal(self, calc_cnt=1) -> list:
|
|
1252 |
def suction_cal(self) -> list:
|
1207 |
1253 |
messages = []
|
1208 |
1254 |
try:
|
1209 |
1255 |
for i in range(1, len(self.items) - 1, 3):
|
... | ... | |
1214 |
1260 |
if self.items[i].data.phase_type == 'Liquid' or self.items[i].data.phase_type == 'Mixed':
|
1215 |
1261 |
# liquid 인 경우 stream 데이타로부터 del.P를 입력해줌.
|
1216 |
1262 |
self.pressure_drops[self.items[i]] = self.items[i].data.pressure_drop_friction
|
1217 |
|
res, message = self.suction_p_cal(i, calc_cnt)
|
|
1263 |
res, message = self.suction_p_cal(i)
|
1218 |
1264 |
if message:
|
1219 |
1265 |
messages.append(message)
|
1220 |
1266 |
|
... | ... | |
1226 |
1272 |
if message:
|
1227 |
1273 |
messages.append(message)
|
1228 |
1274 |
|
1229 |
|
res, message = self.suction_p_cal(i, calc_cnt)
|
|
1275 |
res, message = self.suction_p_cal(i)
|
1230 |
1276 |
if message:
|
1231 |
1277 |
messages.append(message)
|
1232 |
1278 |
|
... | ... | |
1380 |
1426 |
pass
|
1381 |
1427 |
else:
|
1382 |
1428 |
for i in range(2, len(self.items) - 3, 3):
|
|
1429 |
self.pattern[self.items[i]] = -4142
|
|
1430 |
|
1383 |
1431 |
if self.items[i].data is None:
|
1384 |
1432 |
self.pressure_drops[self.items[i]] = 0
|
1385 |
1433 |
self.density_elevations[self.items[i]] = 0
|
... | ... | |
1393 |
1441 |
# pressure drop
|
1394 |
1442 |
if self.items[i].data.pressure_drop is not None:
|
1395 |
1443 |
self.pressure_drops[self.items[i]] = self.items[i].data.pressure_drop
|
|
1444 |
else:
|
|
1445 |
self.pattern[self.items[i]] = -4125
|
1396 |
1446 |
|
1397 |
1447 |
# elevation
|
1398 |
1448 |
if self.items[i].data.elevation is None:
|
... | ... | |
1411 |
1461 |
if self.items[i].data.over_design_cv else 0
|
1412 |
1462 |
elif dp_eq[:3] == 'CV_':
|
1413 |
1463 |
self.extras[self.items[i]] = self.items[i].data.over_design_cv \
|
1414 |
|
if self.items[i].data.over_design_cv else 0
|
1415 |
|
self.extras[self.items[i + 1]] = None # TODO:
|
|
1464 |
if self.items[i].data.over_design_cv else 0 # over% factor
|
|
1465 |
self.extras[self.items[i + 1]] = None # for aramco
|
|
1466 |
|
|
1467 |
if self.items[i].data.pressure_drop is None:
|
|
1468 |
pass
|
|
1469 |
|
1416 |
1470 |
except Exception as ex:
|
1417 |
1471 |
from App import App
|
1418 |
1472 |
message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
... | ... | |
1999 |
2053 |
f"{sys.exc_info()[-1].tb_lineno}"
|
2000 |
2054 |
App.mainWnd().addMessage.emit(MessageType.Error, message)
|
2001 |
2055 |
|
2002 |
|
def suction_p_cal(self, i, calc_cnt=1):
|
|
2056 |
def suction_p_cal(self, i):
|
2003 |
2057 |
from CalculationValidation import QCalculationValidation
|
2004 |
2058 |
res, message = 1, None
|
2005 |
2059 |
|
... | ... | |
2052 |
2106 |
|
2053 |
2107 |
# raise ValueError('The absolute pressure of {} is below 0.'.format(self.items[i + 1]))
|
2054 |
2108 |
|
2055 |
|
if calc_cnt == 1:
|
2056 |
|
if self.items[i + 1] in self.pressure_drops and self.pressure_drops[self.items[i + 1]] is not None:
|
2057 |
|
name = str(self.items[i + 1])[:3]
|
2058 |
|
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
2059 |
|
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \
|
2060 |
|
self.pressure_drops[self.items[i + 1]]
|
2061 |
|
else:
|
2062 |
|
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \
|
2063 |
|
self.pressure_drops[self.items[i + 1]]
|
2064 |
|
else:
|
2065 |
|
res = 0
|
2066 |
|
elif calc_cnt == 2:
|
2067 |
|
# cv의 압력강하를 fill_end를 이용하여 기입해준다
|
2068 |
|
# (fill_end가 cv의 위치를 나타내주는거니까)
|
2069 |
|
if self.items[i + 1] in self.pressure_drops and self.pressure_drops[self.items[i + 1]] is not None:
|
2070 |
|
name = str(self.items[i + 1])[:3]
|
2071 |
|
if name == 'CV_':
|
2072 |
|
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
2073 |
|
res = 0
|
2074 |
|
elif name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
2075 |
|
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \
|
2076 |
|
self.pressure_drops[self.items[i + 1]]
|
2077 |
|
else:
|
2078 |
|
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \
|
2079 |
|
self.pressure_drops[self.items[i + 1]]
|
|
2109 |
if self.pattern[self.items[i + 1]] == -4125:
|
|
2110 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
|
2111 |
res = 0
|
|
2112 |
else:
|
|
2113 |
name = str(self.items[i + 1])[:3]
|
|
2114 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
|
2115 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] + \
|
|
2116 |
self.pressure_drops[self.items[i + 1]]
|
2080 |
2117 |
else:
|
2081 |
|
res = 0
|
|
2118 |
self.pressures[self.items[i + 2]] = self.pressures[self.items[i + 1]] - \
|
|
2119 |
self.pressure_drops[self.items[i + 1]]
|
2082 |
2120 |
except Exception as ex:
|
2083 |
2121 |
from App import App
|
2084 |
2122 |
_message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
... | ... | |
2094 |
2132 |
self.pressures[self.items[i]] = self.pressures[self.items[i + 1]] + self.pressure_drops[self.items[i]] \
|
2095 |
2133 |
if not self.pressure_drops[self.items[i]] is None else 0
|
2096 |
2134 |
|
2097 |
|
index = str(self.items[i - 2])[:3]
|
|
2135 |
name = str(self.items[i - 2])[:3]
|
2098 |
2136 |
if i > 0:
|
2099 |
2137 |
self.pressures[self.items[i - 1]] = self.pressures[self.items[i]] + self.pressure_drops[
|
2100 |
2138 |
self.items[i - 1]]
|
2101 |
2139 |
|
|
2140 |
if self.pattern[self.items[i - 2]] == -4125:
|
|
2141 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
|
2142 |
res = 0
|
|
2143 |
else:
|
|
2144 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
|
2145 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - \
|
|
2146 |
self.pressure_drops[self.items[i - 2]]
|
|
2147 |
else:
|
|
2148 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + \
|
|
2149 |
self.pressure_drops[self.items[i - 2]]
|
|
2150 |
|
|
2151 |
'''
|
2102 |
2152 |
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]] is not None:
|
2103 |
2153 |
if index == 'L_P' or index == 'R_P' or index == 'V_P' or index == 'R_K' or index == 'L_K':
|
2104 |
2154 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - \
|
... | ... | |
2109 |
2159 |
else:
|
2110 |
2160 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
2111 |
2161 |
res = 0
|
|
2162 |
'''
|
2112 |
2163 |
except Exception as ex:
|
2113 |
2164 |
from App import App
|
2114 |
2165 |
message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
... | ... | |
2117 |
2168 |
|
2118 |
2169 |
return res
|
2119 |
2170 |
|
2120 |
|
def discharge_p_cal(self, i, calc_cnt=1):
|
|
2171 |
def discharge_p_cal(self, i):
|
2121 |
2172 |
res = 1
|
2122 |
2173 |
|
2123 |
2174 |
try:
|
... | ... | |
2130 |
2181 |
self.pressures[self.items[i - 1]] = self.pressures[self.items[i]] + \
|
2131 |
2182 |
self.pressure_drops[self.items[i - 1]]
|
2132 |
2183 |
|
2133 |
|
if calc_cnt == 1:
|
2134 |
|
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]] is not None:
|
2135 |
|
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
2136 |
|
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[
|
2137 |
|
self.items[i - 2]]
|
2138 |
|
else:
|
2139 |
|
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[
|
2140 |
|
self.items[i - 2]]
|
2141 |
|
else:
|
2142 |
|
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
2143 |
|
res = 0
|
2144 |
|
elif calc_cnt == 2:
|
2145 |
|
if self.items[i - 2] in self.pressure_drops and self.pressure_drops[self.items[i - 2]] is not None:
|
2146 |
|
if name == 'CV_':
|
2147 |
|
# cv의 압력강하를 fill_end를 이용하여 기입해준다
|
2148 |
|
# (fill_end가 cv의 위치를 나타내주는거니까)
|
2149 |
|
|
2150 |
|
#self.pressure_drops[self.items[i - 2]] = self.pressures[self.items[i - 2]] - \
|
2151 |
|
# self.pressures[self.items[i - 1]]
|
2152 |
|
res = 0
|
2153 |
|
elif name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
2154 |
|
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[
|
2155 |
|
self.items[i - 2]]
|
2156 |
|
else:
|
2157 |
|
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[
|
2158 |
|
self.items[i - 2]]
|
|
2184 |
if self.pattern[self.items[i - 2]] == -4125:
|
|
2185 |
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
|
2186 |
res = 0
|
|
2187 |
else:
|
|
2188 |
if name == 'L_P' or name == 'R_P' or name == 'V_P' or name == 'R_K' or name == 'L_K':
|
|
2189 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] - self.pressure_drops[
|
|
2190 |
self.items[i - 2]]
|
2159 |
2191 |
else:
|
2160 |
|
# 여기에 그 루프는 그만 하는 로직을 넣어줘야함
|
2161 |
|
res = 0
|
|
2192 |
self.pressures[self.items[i - 2]] = self.pressures[self.items[i - 1]] + self.pressure_drops[
|
|
2193 |
self.items[i - 2]]
|
2162 |
2194 |
except Exception as ex:
|
2163 |
2195 |
from App import App
|
2164 |
2196 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
|