프로젝트

일반

사용자정보

개정판 ef062496

IDef0624965cdb1dfaf2ba8ba91c9e48c63bd32219
상위 b513fbd1
하위 46483342

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

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

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