| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- import numpy as np
- try:
- import pymc as pm
- except:
- pass
- from ._base_components import BaseComponents
- from ..tools.enthalpy import (
- get_Dew_from_HumRatio,
- get_HumRatio_from_Tdb_and_RH,
- get_RH_from_Tdb_and_Hr,
- )
- class WheelS3V2(BaseComponents):
- # 适用于不能够准确测量预冷侧入口的空气温湿度(与V3的差异)
- def __init__(self, name):
- super().__init__(name)
-
- @classmethod
- def model(
- cls,
- TinP,HinP,FP,
- TinR,HinR,FR,
- TinC,HinC,FC,
- engine : str,
- param : dict,
- ):
- FUNC = cls.get_func_by_engine(engine)
- EXP = FUNC['EXP']
-
- beta_P1 = param['beta_P1']
- beta_P2 = param['beta_P2']
- beta_P3 = param['beta_P3']
- beta_P4 = param['beta_P4']
- beta_P5 = param['beta_P5']
- beta_P6 = param['beta_P6']
- beta_P7 = param['beta_P7']
- beta_P8 = param['beta_P8']
- beta_P9 = param['beta_P9']
- beta_P10 = param['beta_P10']
- beta_C1 = param['beta_C1']
- beta_C2 = param['beta_C2']
- beta_C3 = param['beta_C3']
- beta_C4 = param['beta_C4']
-
- RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
- # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
-
- # 处理侧
- HdiffP = (
- beta_P1 * RinP ** beta_P4
- * HinP
- * (
- TinR * (1 - EXP(-beta_P5 * FR))
- + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
- + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
- )
- + beta_P2
- ) / 1000
- WdiffP = HdiffP * FP
- HoutP = HinP - HdiffP
- DoutP = get_Dew_from_HumRatio(HoutP,engine)
- Q_lat_P = WdiffP * cls.CONSTANT['h_ads'] * beta_P8 # 潜热:吸附放热的量不等于液化潜热,因此需要有一个参数修正
- Q_sen_P = beta_P3 * (TinR - beta_P10 * (TinR - TinC) - TinP) # 显热
- TdiffP = (Q_lat_P + Q_sen_P + beta_P9) / (FP * cls.CONSTANT['c_p_air'])
- ToutP = TinP + TdiffP
-
- # 冷却侧
- TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
- ToutC = TinC + TdiffC
- HdiffC = 0
- WdiffC = HdiffC * FC
- HoutC = HinC - HdiffC
- DoutC = get_Dew_from_HumRatio(HoutC,engine)
- Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
-
- # 再生侧
- WdiffR = WdiffP + WdiffC
- HoutR = (HinR * FR + WdiffR) / FR
- DoutR = get_Dew_from_HumRatio(HoutR,engine)
- Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
- TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
- ToutR = TinR - TdiffR
-
- return {
- 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
- 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
- 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
- 'EFF' :Q_lat_P / (Q_sen_P + Q_lat_P),
- 'Qsen' :Q_sen_P,'Qlat':Q_lat_P
- }
-
- def prior(self):
- param = {
- 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
- 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
- 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
- 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
- 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
- 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
- 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
- 'beta_P8': pm.TruncatedNormal(f'{self.name}_beta_P8',mu=1.3,sigma=0.1,initval=1.3,lower=1),
- 'beta_P9': pm.Normal(f'{self.name}_beta_P9',mu=0,sigma=0.1,initval=0),
- 'beta_P10': pm.HalfNormal(f'{self.name}_beta_P10',sigma=0.5,initval=0.1),
- 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
- 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
- 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
- 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
- }
- return param
- class WheelS3V3(BaseComponents):
- def __init__(self, name):
- super().__init__(name)
-
- @classmethod
- def model(
- cls,
- TinP,HinP,FP,
- TinR,HinR,FR,
- TinC,HinC,FC,
- engine : str,
- param : dict,
- ):
- FUNC = cls.get_func_by_engine(engine)
- EXP = FUNC['EXP']
-
- beta_P1 = param['beta_P1']
- beta_P2 = param['beta_P2']
- beta_P3 = param['beta_P3']
- beta_P4 = param['beta_P4']
- beta_P5 = param['beta_P5']
- beta_P6 = param['beta_P6']
- beta_P7 = param['beta_P7']
- beta_P8 = param['beta_P8']
- beta_P9 = param['beta_P9']
- beta_P10 = param['beta_P10']
- beta_C1 = param['beta_C1']
- beta_C2 = param['beta_C2']
- beta_C3 = param['beta_C3']
-
- RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
- RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
-
- # 处理侧
- HdiffP = (
- beta_P1 * RinP ** beta_P4
- * HinP
- * (
- TinR * (1 - EXP(-beta_P5 * FR))
- + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
- + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
- )
- + beta_P2
- ) / 1000
- WdiffP = HdiffP * FP
- HoutP = HinP - HdiffP
- DoutP = get_Dew_from_HumRatio(HoutP,engine)
- Q_lat_P = WdiffP * cls.CONSTANT['h_ads'] * beta_P8
- Q_sen_P = beta_P3 * (TinR - beta_P10 * (TinR - TinC) - TinP)
- TdiffP = (Q_lat_P + Q_sen_P + beta_P9) / (FP * cls.CONSTANT['c_p_air'])
- ToutP = TinP + TdiffP
-
- # 冷却侧
- TdiffC = beta_C1 * RinC ** beta_C2 * TinR + beta_C3
- ToutC = TinC + TdiffC
- HdiffC = 0
- WdiffC = HdiffC * FC
- HoutC = HinC - HdiffC
- DoutC = get_Dew_from_HumRatio(HoutC,engine)
- Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
-
- # 再生侧
- WdiffR = WdiffP + WdiffC
- HoutR = (HinR * FR + WdiffR) / FR
- DoutR = get_Dew_from_HumRatio(HoutR,engine)
- Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
- TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
- ToutR = TinR - TdiffR
-
- return {
- 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
- 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
- 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
- 'EFF' :Q_lat_P / (Q_sen_P + Q_lat_P),
- 'Qsen' :Q_sen_P,'Qlat':Q_lat_P
- }
-
- def prior(self):
- param = {
- 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
- 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
- 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
- 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
- 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
- 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
- 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
- 'beta_P8': pm.TruncatedNormal(f'{self.name}_beta_P8',mu=1.3,sigma=0.1,initval=1.3,lower=1),
- 'beta_P9': pm.Normal(f'{self.name}_beta_P9',mu=0,sigma=0.1,initval=0),
- 'beta_P10': pm.Normal(f'{self.name}_beta_P10',mu=0.1,sigma=0.1,initval=0.1),
- 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=0.5,sigma=1,initval=0.5,lower=0),
- 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=0.3,sigma=1,initval=0.3,lower=0),
- 'beta_C3': pm.Normal(f'{self.name}_beta_C3',mu=0,sigma=10,initval=0),
- }
- return param
|