coil_water.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import numpy as np
  2. try:
  3. import pymc as pm
  4. except:
  5. pass
  6. from ._base_components import BaseComponents
  7. from ..tools.enthalpy import get_Dew_from_HumRatio
  8. from ..tools.enthalpy import get_HumRatio_from_Dew
  9. class CoolingCoil(BaseComponents):
  10. def __init__(self, name):
  11. super().__init__(name)
  12. @classmethod
  13. def model(
  14. cls,
  15. TinA,HinA,FA,
  16. TinW,FW,
  17. engine,
  18. param
  19. ):
  20. FUNC = cls.get_func_by_engine(engine)
  21. WHERE = FUNC['WHERE']
  22. GT = FUNC['GT']
  23. EXP = FUNC['EXP']
  24. DinA = get_Dew_from_HumRatio(HinA,engine)
  25. mode = WHERE(GT(DinA-TinW,0),1,0) #1湿工况
  26. UA_dry = param['UA_dry']
  27. UA_wet_ratio = param['UA_wet_ratio']
  28. Ts_adj = param['Ts_adj']
  29. eta = param['eta']
  30. UA_wet = UA_dry * UA_wet_ratio
  31. C_min = FA * cls.CONSTANT['c_p_air']
  32. C_max = FW * cls.CONSTANT['c_p_water']
  33. Cr = C_min / C_max
  34. NTU_wet = UA_wet / C_min
  35. NTU_dry = UA_dry / C_min
  36. NTU = WHERE(mode,NTU_wet,NTU_dry)
  37. epsilon = (1-EXP(-NTU*(1-Cr))) / (1-Cr*EXP(-NTU*(1-Cr)))
  38. # 出风干球温度
  39. Ts = TinW + Ts_adj * (HinA) * (TinA - TinW) # 湿工况盘管表面温度
  40. Q_wet = epsilon * C_min * (TinA - Ts)
  41. Q_dry = epsilon * C_min * (TinA - TinW)
  42. Q = WHERE(mode,Q_wet,Q_dry)
  43. ToutA = TinA - Q / (FA * cls.CONSTANT['c_p_air'])
  44. # 出风湿度+露点
  45. HoutA = WHERE(
  46. mode,
  47. HinA - eta * (HinA - get_HumRatio_from_Dew(TinW,engine)),
  48. HinA
  49. )
  50. DoutA = get_Dew_from_HumRatio(HoutA,engine)
  51. return {'ToutA':ToutA,'HoutA':HoutA,'DoutA':DoutA}
  52. def prior(self) -> dict:
  53. param = {
  54. 'UA_dry' : pm.HalfNormal(f'{self.name}_UA_dry',5,initval=10),
  55. 'UA_wet_ratio': pm.TruncatedNormal(f'{self.name}_UA_wet_ratio',mu=4,sigma=0.2,lower=1,upper=10,initval=4),
  56. 'Ts_adj' : pm.HalfNormal(f'{self.name}_Ts_adj',5,initval=5),
  57. 'eta' : pm.HalfNormal(f'{self.name}_eta',0.5,initval=0.5),
  58. }
  59. return param
  60. class CoolingCoil2(BaseComponents):
  61. def __init__(self, name):
  62. super().__init__(name)
  63. @classmethod
  64. def model(
  65. cls,
  66. TinA,HinA,FA,
  67. TinW,FW,
  68. engine,
  69. param
  70. ):
  71. FUNC = cls.get_func_by_engine(engine)
  72. WHERE = FUNC['WHERE']
  73. EXP = FUNC['EXP']
  74. DinA = get_Dew_from_HumRatio(HinA,engine)
  75. beta1_T = param['beta1_T']
  76. beta2_T = param['beta2_T']
  77. beta3_T = param['beta3_T']
  78. beta1_D_adj = param['beta1_D_adj']
  79. beta2_D_adj = param['beta2_D_adj']
  80. beta3_D_adj = param['beta3_D_adj']
  81. beta4_D = param['beta4_D']
  82. beta1_D = beta1_T * beta1_D_adj
  83. beta2_D = beta2_T * beta2_D_adj
  84. beta3_D = beta3_T * beta3_D_adj
  85. EFF_T_FW = 1 - EXP(-beta2_T * FW)
  86. EFF_T_FA = EXP(-beta3_T * FA)
  87. EFF_D_FW = 1 - EXP(-beta2_D * FW)
  88. EFF_D_FA = EXP(-beta3_D * FA)
  89. mode = WHERE(DinA > TinW,1,0)
  90. ToutA = TinA - beta1_T * (TinA - TinW) * EFF_T_FA * EFF_T_FW
  91. DoutA = DinA - (beta1_D - beta4_D * (TinA - DinA)) * (DinA - TinW) * mode * EFF_D_FW * EFF_D_FA
  92. HoutA = get_HumRatio_from_Dew(DoutA,engine)
  93. return {'ToutA':ToutA,'HoutA':HoutA,'DoutA':DoutA,'FA':FA}
  94. def prior(self) -> dict:
  95. param = {
  96. 'beta1_T' : pm.TruncatedNormal(f'{self.name}_beta1_T',mu=1,sigma=0.2,lower=0),
  97. 'beta2_T' : pm.TruncatedNormal(f'{self.name}_beta2_T',mu=5,sigma=3,lower=0),
  98. 'beta3_T' : pm.TruncatedNormal(f'{self.name}_beta3_T',mu=5,sigma=0.3,lower=0),
  99. 'beta1_D_adj': pm.TruncatedNormal(f'{self.name}_beta1_D_adj',mu=1,sigma=0.1,lower=0.1),
  100. 'beta2_D_adj': pm.TruncatedNormal(f'{self.name}_beta2_D_adj',mu=1,sigma=0.1,lower=0.1),
  101. 'beta3_D_adj': pm.TruncatedNormal(f'{self.name}_beta3_D_adj',mu=1,sigma=0.1,lower=0.1),
  102. 'beta4_D' : pm.TruncatedNormal(f'{self.name}_beta4_D',mu=0.01,sigma=0.01,lower=0)
  103. }
  104. return param