프로젝트

일반

사용자정보

개정판 d144f3de

IDd144f3de61575d7299523b475f78db3da268b732
상위 05af0289
하위 96a2fc6f

김연진이(가) 4년 이상 전에 추가함

issue #1060 Loop 계산 그만두는 로직에 Pattern 이용

Change-Id: Ib54d774323f5b2e57c7171b5538299d992f718c7

차이점 보기:

HYTOS/HYTOS/Commands/HydroCalculationCommand.py
107 107
                        '_{}'.format(str(loop.items[i + 1]).split('_')[len(str(loop.items[i + 1]).split('_')) - 1]), '')
108 108
                    if control_valve == name:
109 109
                        loop.pressure_drops[loop.items[i + 1]] = cvdp_final
110
                        loop.pattern[loop.items[i + 1]] = -4142
110 111
                        loop.extras[loop.items[i + 2]] = cvdp_final / (
111 112
                                cvdp_final + loop.total_device_loss + loop.line_total_friction_loss)
112 113

  
......
147 148
                        '_{}'.format(str(loop.items[i + 1]).split('_')[len(str(loop.items[i + 1]).split('_')) - 1]), '')
148 149
                    if pump == name:
149 150
                        # '계산 분기점 (펌프 헤드가 입력 안되있는 경우에 가동됨)
150
                        if loop.items[i + 1].data.pressure_drop is None:
151

  
151
                        if loop.pattern[loop.items[i + 1]] == -4125:
152 152
                            # 'govern loop 탐색을 위한 것
153 153
                            if loop.pressure_drops[loop.items[i + 1]] == pumpdp_final:
154 154
                                self.govern_loop_name = loop.name
155 155

  
156 156
                            loop.pressure_drops[loop.items[i + 1]] = pumpdp_final
157
                            loop.pattern[loop.items[i + 1]] = -4142
157 158

  
158 159
                            if loop.fill_end - loop.fill_start != 3:
159
                                loop.suction_cal(2)
160
                                loop.discharge_cal(2)
160
                                loop.suction_cal()
161
                                loop.discharge_cal()
161 162

  
162 163
                                # 'cv의 압력강하를 fill_end를 이용하여 기입해준다
163 164
                                # '(fill_end가 cv의 위치를 나타내주는거니까)
164 165
                                loop.pressure_drops[loop.items[loop.fill_end - 2]] = loop.pressures[loop.items[
165 166
                                    loop.fill_end - 2]] - loop.pressures[loop.items[loop.fill_end - 1]]
166
        '''
167
        if len(pumps) > 0:
168
            for loop in self.loops:
169
                if loop.fill_end - loop.fill_start != 3:
170
                    loop.suction_cal(2)
171
                    loop.discharge_cal(2)
172

  
173
                    # 'cv의 압력강하를 fill_end를 이용하여 기입해준다
174
                    # '(fill_end가 cv의 위치를 나타내주는거니까)
175
                    loop.pressure_drops[loop.items[loop.fill_end - 2]] = loop.pressures[loop.items[loop.fill_end - 2]] - loop.pressures[loop.items[loop.fill_end - 1]]
176
        '''
177 167

  
178 168
    def execute_second(self, param):
179 169
        try:
......
189 179
            # 계산 마무리
190 180
            for loop in self.loops:
191 181
                for i in range(1, len(loop.items) - 1, 3):
192
                    loop.suction_p_cal(i)
193
                    loop.final_loss_input()
182
                    loop.final_suc_p_cal(i)
194 183

  
195 184
                items_count = len(loop.items)
196

  
197 185
                pressure_2 = loop.pressures[loop.items[items_count - 2]] \
198 186
                    if loop.pressures[loop.items[items_count - 2]] else 0
199 187
                pressure_1 = loop.pressures[loop.items[items_count - 1]] \
......
203 191
                deviation = pressure_2 - pressure_1 - pressure_drop_2
204 192

  
205 193
                loop.deviation = deviation
206
                self.final_loss_input()
194

  
195
                loop.final_loss_input()
207 196

  
208 197
            self.init_units()
209 198
            self.loop_result()
HYTOS/HYTOS/Shapes/EngineeringLoopItem.py
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}:" \
readme.html
36 36
		<tr bgcolor='#27AE60' >
37 37
			<td style="padding-left: 5px; font-weight: bold;" colspan="2"><font color="white" size="3">CHANGES</font></td>
38 38
		</tr>
39

  
39
		
40
		<tr><td style="tr-title" colspan="2" bgcolor=lightgray><B>3.1.2.0 [2020.10.19]</B></td></tr>
41
		<tr><td class="filesChanged">1.</td><td>Loop 계산시 Pattern 이용 빠져나오기</td></tr>		
42
		
40 43
		<tr><td style="tr-title" colspan="2" bgcolor=lightgray><B>3.1.1.0 [2020.10.06]</B></td></tr>
41 44
		<tr><td class="filesChanged">1.</td><td>Pump Head 오류 수정</td></tr>		
42 45
		<tr><td class="filesChanged">2.</td><td>Governig loop 오류 수정</td></tr>		
version.rc
7 7
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
8 8
# Set not needed items to zero 0.
9 9
# Local Build $BUILD_NUMBER=0
10
filevers=(3,1,1,0),
11
prodvers=(3,1,1,0),
10
filevers=(3,1,2,0),
11
prodvers=(3,1,2,0),
12 12
# Contains a bitmask that specifies the valid bits 'flags'r
13 13
mask=0x3f,
14 14
# Contains a bitmask that specifies the Boolean attributes of the file.
......
32 32
    u'040904B0',
33 33
    [StringStruct(u'CompanyName', u'SECL'),
34 34
    StringStruct(u'FileDescription', u'Hydraulic Calculator'),
35
    StringStruct(u'FileVersion', u'3.1.1.0'),
35
    StringStruct(u'FileVersion', u'3.1.2.0'),
36 36
    StringStruct(u'InternalName', u'HYTOS'),
37 37
    StringStruct(u'LegalCopyright', u'Copyright(c) SECL'),
38 38
    StringStruct(u'OriginalFilename', u'HYTOS.exe'),
39 39
    StringStruct(u'ProductName', u'HYTOS'),
40
    StringStruct(u'ProductVersion', u'3.1.1.0')])
40
    StringStruct(u'ProductVersion', u'3.1.2.0')])
41 41
  ]), 
42 42
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
43 43
  ]

내보내기 Unified diff

클립보드 이미지 추가 (최대 크기: 500 MB)