coil.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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,get_Enthalpy_from_Tdb_and_HumRatio
  8. from ..tools.enthalpy import get_HumRatio_from_Dew
  9. class CoolingCoil(BaseComponents):
  10. def __init__(self, engine):
  11. super().__init__(engine)
  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. @classmethod
  53. def prior(cls,name) -> dict:
  54. param = {
  55. 'UA_dry' : pm.HalfNormal(f'{name}_UA_dry',5,initval=10),
  56. 'UA_wet_ratio': pm.TruncatedNormal(f'{name}_UA_wet_ratio',mu=4,sigma=0.2,lower=1,upper=10,initval=4),
  57. 'Ts_adj' : pm.HalfNormal(f'{name}_Ts_adj',5,initval=5),
  58. 'eta' : pm.HalfNormal(f'{name}_eta',0.5,initval=0.5),
  59. }
  60. return param
  61. class CoolingCoil2(BaseComponents):
  62. def __init__(self, engine):
  63. super().__init__(engine)
  64. @classmethod
  65. def model(
  66. cls,
  67. TinA,HinA,FA,
  68. TinW,FW,
  69. engine,
  70. param
  71. ):
  72. FUNC = cls.get_func_by_engine(engine)
  73. WHERE = FUNC['WHERE']
  74. EXP = FUNC['EXP']
  75. DinA = get_Dew_from_HumRatio(HinA,engine)
  76. beta1_T = param['beta1_T']
  77. beta2_T = param['beta2_T']
  78. beta3_T = param['beta3_T']
  79. beta1_D_adj = param['beta1_D_adj']
  80. beta2_D_adj = param['beta2_D_adj']
  81. beta3_D_adj = param['beta3_D_adj']
  82. beta4_D = param['beta4_D']
  83. beta1_D = beta1_T * beta1_D_adj
  84. beta2_D = beta2_T * beta2_D_adj
  85. beta3_D = beta3_T * beta3_D_adj
  86. EFF_T_FW = 1 - EXP(-beta2_T * FW)
  87. EFF_T_FA = EXP(-beta3_T * FA)
  88. EFF_D_FW = 1 - EXP(-beta2_D * FW)
  89. EFF_D_FA = EXP(-beta3_D * FA)
  90. mode = WHERE(DinA > TinW,1,0)
  91. ToutA = TinA - beta1_T * (TinA - TinW) * EFF_T_FA * EFF_T_FW
  92. DoutA = DinA - (beta1_D - beta4_D * (TinA - DinA)) * (DinA - TinW) * mode * EFF_D_FW * EFF_D_FA
  93. HoutA = get_HumRatio_from_Dew(DoutA,engine)
  94. return {'ToutA':ToutA,'HoutA':HoutA,'DoutA':DoutA,'FA':FA}
  95. @classmethod
  96. def prior(cls,name) -> dict:
  97. param = {
  98. 'beta1_T' : pm.TruncatedNormal(f'{name}_beta1_T',mu=1,sigma=0.2,lower=0),
  99. 'beta2_T' : pm.TruncatedNormal(f'{name}_beta2_T',mu=5,sigma=3,lower=0),
  100. 'beta3_T' : pm.TruncatedNormal(f'{name}_beta3_T',mu=5,sigma=0.3,lower=0),
  101. 'beta1_D_adj': pm.TruncatedNormal(f'{name}_beta1_D_adj',mu=1,sigma=0.1,lower=0.1),
  102. 'beta2_D_adj': pm.TruncatedNormal(f'{name}_beta2_D_adj',mu=1,sigma=0.1,lower=0.1),
  103. 'beta3_D_adj': pm.TruncatedNormal(f'{name}_beta3_D_adj',mu=1,sigma=0.1,lower=0.1),
  104. 'beta4_D' : pm.TruncatedNormal(f'{name}_beta4_D',mu=0.01,sigma=0.01,lower=0)
  105. }
  106. return param
  107. class SteamCoilFs(BaseComponents):
  108. def __init__(self):
  109. super().__init__()
  110. @classmethod
  111. def model(
  112. cls,
  113. TinA,ToutA,FA,
  114. param,
  115. engine
  116. ):
  117. b1 = param['b1']
  118. b2 = param['b2']
  119. b3 = param['b3']
  120. Fs = b1 * (ToutA - TinA) * FA + b2 * TinA + b3
  121. return {'Fs':Fs}
  122. @classmethod
  123. def prior(cls,name):
  124. param = {
  125. 'b1': pm.HalfNormal(f'{name}_b1',sigma=10),
  126. 'b2': pm.Normal(f'{name}_b2',sigma=10),
  127. 'b3': pm.Normal(f'{name}_b3',sigma=10),
  128. }
  129. return param
  130. class SteamCoilFs2(BaseComponents):
  131. def __init__(self):
  132. super().__init__()
  133. @classmethod
  134. def model(cls,TinA,ToutA,FA,param,engine):
  135. b1 = param['b1']
  136. b2 = param['b2']
  137. FP = np.exp(b1 * (ToutA - TinA)*FA + b2)
  138. FUNC = cls.get_func_by_engine(engine)
  139. WHERE = FUNC['WHERE']
  140. LT = FUNC['LT']
  141. param_change_point = param['change_point']
  142. param_b1 = param['a1']
  143. param_b2 = param['a2']
  144. param_b3 = param['a3']
  145. param_Ps_change_point = param_b1 + param_b2 * param_change_point
  146. Fs = WHERE(
  147. LT(FP,param_Ps_change_point * param_change_point),
  148. get_root(param_b1,param_b2,FP),
  149. get_root(param_b1+(param_b2-param_b3)*param_change_point,param_b3,FP)
  150. )
  151. return {'FP':FP,'Fs':Fs}
  152. @classmethod
  153. def prior(cls,name):
  154. param = {
  155. 'b1' : pm.Normal(f'{name}_b1',mu=0.08,sigma=0.1,initval=0.08),
  156. 'b2' : pm.Normal(f'{name}_b2',mu=3.65,sigma=0.02,initval=3.65),
  157. 'change_point': pm.Normal(f'{name}_change_point',mu=104,sigma=1,initval=104),
  158. 'a1' : pm.Normal(f'{name}_a1',mu=17.5,sigma=1,initval=17.5),
  159. 'a2' : pm.Normal(f'{name}_a2',mu=0.2,sigma=0.1,initval=0.2),
  160. 'a3' : pm.Normal(f'{name}_a3',mu=1.5,sigma=0.1,initval=1.5),
  161. }
  162. return param
  163. class SteamCoilFs3(BaseComponents):
  164. def __init__(self):
  165. super().__init__()
  166. @classmethod
  167. def model(
  168. cls,
  169. TinA,ToutA,FA,
  170. HinA,HoutA,
  171. param,
  172. engine
  173. ):
  174. b1 = param['b1']
  175. b2 = param['b2']
  176. b3 = param['b3']
  177. Fs = b1 * (ToutA - TinA) + b2 * ToutA + b3
  178. return {'Fs':Fs}
  179. @classmethod
  180. def prior(cls,name):
  181. param = {
  182. 'b1': pm.HalfNormal(f'{name}_b1',sigma=10,initval=1),
  183. 'b2': pm.HalfNormal(f'{name}_b2',sigma=10,initval=1),
  184. 'b3': pm.Normal(f'{name}_b3',sigma=10,initval=0),
  185. }
  186. return param
  187. def get_root(b0,b1,FP):
  188. return (np.sqrt(b0**2+4*b1*FP)-b0)/(2*b1)