wheel.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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_RH_from_Tdb_and_Hr
  8. from ..tools.enthalpy import get_Dew_from_HumRatio
  9. class WheelS2(BaseComponents):
  10. def __init__(self):
  11. super().__init__()
  12. @classmethod
  13. def model(
  14. cls,
  15. TinP,HinP,FP,
  16. TinR,HinR,FR,
  17. engine : str,
  18. param : dict,
  19. ):
  20. FUNC = cls.get_func_by_engine(engine)
  21. EXP = FUNC['EXP']
  22. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  23. beta_Q1 = param['beta_Q1']
  24. beta_H1 = param['beta_H1']
  25. beta_H2 = param['beta_H2']
  26. beta_H3 = param['beta_H3']
  27. beta_H4 = param['beta_H4']
  28. # 转轮的温度
  29. T_avg = TinR * (1 - beta_H4) + TinP * beta_H4
  30. # 出风露点(除湿量)
  31. ## 处理侧
  32. Hdiff_mu = beta_H1 * RinP ** beta_H2 * EXP(-beta_H3 / T_avg) / 1000 # kg水蒸气/kg干空气
  33. HoutP_mu = HinP - Hdiff_mu
  34. DoutP_mu = get_Dew_from_HumRatio(HoutP_mu,engine)
  35. ## 再生侧
  36. HoutR_mu = HinR + Hdiff_mu * (FP / FR)
  37. DoutR_mu = get_Dew_from_HumRatio(HoutR_mu,engine)
  38. # 出风温度
  39. # 处理侧
  40. Q_latent = Hdiff_mu * cls.CONSTANT['h_ads'] # Kj/kg 潜热
  41. Q_sensible = beta_Q1 * (TinR - TinP) # Kj/kg 显热(影响升焓的部分)
  42. Q = (Q_latent + Q_sensible) * FP # Kj
  43. ToutP_mu = TinP + Q / (FP * cls.CONSTANT['c_p_air'])
  44. # 再生侧
  45. ToutR_mu = TinR - Q / (FR * cls.CONSTANT['c_p_air'])
  46. return {
  47. 'ToutP':ToutP_mu,'HoutP':HoutP_mu,'DoutP':DoutP_mu,
  48. 'ToutR':ToutR_mu,'HoutR':HoutR_mu,'DoutR':DoutR_mu,
  49. }
  50. @classmethod
  51. def prior(cls,name):
  52. param = {
  53. 'beta_Q1': pm.HalfNormal(f'{name}_beta_Q1',sigma=10),
  54. 'beta_H1': pm.HalfNormal(f'{name}_beta_H1',sigma=10),
  55. 'beta_H2': pm.HalfNormal(f'{name}_beta_H2',sigma=10),
  56. 'beta_H3': pm.HalfNormal(f'{name}_beta_H3',sigma=10),
  57. 'beta_H4': pm.Uniform(f'{name}_beta_H4',lower=0,upper=1),
  58. }
  59. return param
  60. class WheelS3(BaseComponents):
  61. def __init__(self):
  62. super().__init__()
  63. @classmethod
  64. def model(
  65. cls,
  66. TinP,HinP,FP,
  67. TinR,HinR,FR,
  68. TinC,HinC,FC,
  69. engine : str,
  70. param : dict,
  71. ):
  72. FUNC = cls.get_func_by_engine(engine)
  73. EXP = FUNC['EXP']
  74. beta_P1 = param['beta_P1']
  75. beta_P2 = param['beta_P2']
  76. beta_P3 = param['beta_P3']
  77. beta_P4 = param['beta_P4']
  78. beta_P5 = param['beta_P5']
  79. beta_C1 = param['beta_C1']
  80. beta_C2 = param['beta_C2']
  81. beta_C3 = param['beta_C3']
  82. beta_C4 = param['beta_C4']
  83. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  84. RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  85. # 处理侧
  86. HdiffP = (beta_P1 * RinP**beta_P4 * HinP * TinR * EXP(-beta_P5 * FP) + beta_P2)/1000
  87. WdiffP = HdiffP * FP
  88. HoutP = HinP - HdiffP
  89. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  90. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  91. Q_sen_P = beta_P3 * (TinR - TinP) * FP #TODO
  92. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  93. ToutP = TinP + TdiffP
  94. # 冷却侧
  95. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  96. ToutC = TinC + TdiffC
  97. HdiffC = (beta_P1 * RinC**beta_P4 * HinC * TinR * EXP(-beta_P5 * FC) + beta_P2)/1000
  98. WdiffC = HdiffC * FC
  99. HoutC = HinC - HdiffC
  100. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  101. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  102. # 再生侧
  103. WdiffR = WdiffP + WdiffC
  104. HoutR = (HinR * FR + WdiffR) / FR
  105. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  106. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  107. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  108. ToutR = TinR - TdiffR
  109. return {
  110. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  111. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  112. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  113. }
  114. @classmethod
  115. def prior(cls,name):
  116. param = {
  117. 'beta_P1': pm.TruncatedNormal(f'{name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  118. 'beta_P2': pm.TruncatedNormal(f'{name}_beta_P2',mu=0.5,sigma=1,initval=0.02,lower=0),
  119. 'beta_P3': pm.TruncatedNormal(f'{name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  120. 'beta_P4': pm.TruncatedNormal(f'{name}_beta_P4',mu=1,sigma=0.3,initval=1,lower=0),
  121. 'beta_P5': pm.TruncatedNormal(f'{name}_beta_P5',mu=5,sigma=2,initval=5,lower=0),
  122. 'beta_C1': pm.TruncatedNormal(f'{name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  123. 'beta_C2': pm.TruncatedNormal(f'{name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  124. 'beta_C3': pm.TruncatedNormal(f'{name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  125. 'beta_C4': pm.TruncatedNormal(f'{name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  126. }
  127. return param
  128. # class WheelS3(BaseComponents):
  129. # # 需要校准的输出 ToutP DoutP ToutR/ToutC
  130. # def __init__(self):
  131. # super().__init__()
  132. # @classmethod
  133. # def model(
  134. # cls,
  135. # TinP,HinP,FP,
  136. # TinR,HinR,FR,
  137. # TinC,HinC,FC,
  138. # engine : str,
  139. # param : dict,
  140. # ):
  141. # FUNC = cls.get_func_by_engine(engine)
  142. # EXP = FUNC['EXP']
  143. # RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  144. # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  145. # beta_Q1 = param['beta_Q1']
  146. # beta_Q2 = param['beta_Q2']
  147. # # beta_Q3 = param['beta_Q3']
  148. # beta_H1 = param['beta_H1']
  149. # beta_H2 = param['beta_H2']
  150. # beta_H3 = param['beta_H3']
  151. # beta_H4 = param['beta_H4']
  152. # beta_H5 = param['beta_H5']
  153. # # 转轮的温度
  154. # T_avg = TinR * beta_H4 + TinC * (1 - beta_H4)
  155. # # 除湿量
  156. # ## 处理侧
  157. # H_diff_P = beta_H1 * RinP ** beta_H2 * EXP(-beta_H3 / T_avg) # 描述吸附 kg水蒸气/kg干空气
  158. # W_diff_P = H_diff_P * FP # kg水蒸气
  159. # HoutP = HinP - H_diff_P
  160. # # 冷却测
  161. # # !转轮的处理侧和冷却侧都在除湿,由于冷却侧出来的空气的温度非常高,所以湿度很难测准
  162. # # !因此冷却侧的除湿量需要假定,这里假定和处理侧参数一致
  163. # H_diff_C = beta_H1 * RinC ** beta_H2 * EXP(-beta_H3 / T_avg) * beta_H5
  164. # W_diff_C = H_diff_C * FC
  165. # HoutC = HinC - H_diff_C
  166. # ## 再生侧
  167. # HoutR = (HinR * FR + W_diff_P + W_diff_C) / FR # kg水蒸气/kg干空气
  168. # # 露点
  169. # DoutP = get_Dew_from_HumRatio(HoutP,engine)
  170. # DoutC = get_Dew_from_HumRatio(HoutC,engine)
  171. # DoutR = get_Dew_from_HumRatio(HoutR,engine)
  172. # # 热量
  173. # Q_lat_C = W_diff_C * cls.CONSTANT['h_ads'] # Kj 冷却侧潜热
  174. # Q_lat_P = W_diff_P * cls.CONSTANT['h_ads'] # Kj 处理侧潜热
  175. # Q_lat_total = Q_lat_C + Q_lat_P # Kj 总潜热
  176. # Q_sen_C = beta_Q1 * (TinR - TinC) # Kj 冷却侧显热
  177. # # Q_sen_P = beta_Q1 * (TinR - beta_Q2 * (TinR - TinC) - TinP) # Kj 处理侧显热
  178. # Q_sen_P = beta_Q1 * (TinR - TinP) * beta_Q2
  179. # Q_sen_Total = Q_sen_C + Q_sen_P # Kj 总显热
  180. # # 温度变化
  181. # ToutP = TinP + (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  182. # ToutC = TinC + (Q_lat_C + Q_sen_C) / (FC * cls.CONSTANT['c_p_air'])
  183. # ToutR = TinR - (Q_lat_total + Q_sen_Total) / (FR * cls.CONSTANT['c_p_air'])
  184. # return {
  185. # 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,
  186. # 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,
  187. # 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,
  188. # }
  189. # @classmethod
  190. # def prior(cls,name):
  191. # param = {
  192. # 'beta_Q1': pm.HalfNormal(f'{name}_beta_Q1',sigma=1,initval=1),
  193. # 'beta_Q2': pm.HalfNormal(f'{name}_beta_Q2',sigma=0.1,initval=0.01),
  194. # 'beta_H1': pm.HalfNormal(f'{name}_beta_H1',sigma=1,initval=0.01),
  195. # 'beta_H2': pm.HalfNormal(f'{name}_beta_H2',sigma=1,initval=0.01),
  196. # 'beta_H3': pm.HalfNormal(f'{name}_beta_H3',sigma=20,initval=100),
  197. # 'beta_H4': pm.Uniform(f'{name}_beta_H4',lower=0,upper=1,initval=0.7),
  198. # # 'beta_H5': pm.TruncatedNormal(f'{name}_beta_H5',mu=5,sigma=2,lower=1,initval=5),
  199. # 'beta_H5':pm.HalfNormal(f'{name}_beta_H5',sigma=1,initval=0.01)
  200. # }
  201. # return param