wheel2.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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,get_HumRatio_from_Tdb_and_RH
  9. class WheelS2(BaseComponents):
  10. def __init__(self, name):
  11. super().__init__(name)
  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. def prior(self):
  51. param = {
  52. 'beta_Q1': pm.HalfNormal(f'{self.name}_beta_Q1',sigma=10),
  53. 'beta_H1': pm.HalfNormal(f'{self.name}_beta_H1',sigma=10),
  54. 'beta_H2': pm.HalfNormal(f'{self.name}_beta_H2',sigma=10),
  55. 'beta_H3': pm.HalfNormal(f'{self.name}_beta_H3',sigma=10),
  56. 'beta_H4': pm.Uniform(f'{self.name}_beta_H4',lower=0,upper=1),
  57. }
  58. return param
  59. class WheelS2V2(BaseComponents):
  60. def __init__(self, name):
  61. super().__init__(name)
  62. @classmethod
  63. def model(
  64. cls,
  65. TinP,HinP,FP,
  66. TinR,HinR,FR,
  67. engine : str,
  68. param : dict,
  69. ):
  70. FUNC = cls.get_func_by_engine(engine)
  71. EXP = FUNC['EXP']
  72. beta_P1 = param['beta_P1']
  73. beta_P2 = param['beta_P2']
  74. beta_P3 = param['beta_P3']
  75. beta_P4 = param['beta_P4']
  76. beta_P5 = param['beta_P5']
  77. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  78. # 处理侧
  79. HdiffP = (beta_P1 * RinP**beta_P4 * HinP * TinR * EXP(-beta_P5 * FP) + beta_P2)/1000
  80. WdiffP = HdiffP * FP
  81. HoutP = HinP - HdiffP
  82. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  83. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  84. Q_sen_P = beta_P3 * (TinR - TinP) * FP #TODO
  85. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  86. ToutP = TinP + TdiffP
  87. # 再生侧
  88. HoutR = (HinR * FR + WdiffP) / FR
  89. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  90. Q_total_R = Q_lat_P + Q_sen_P
  91. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  92. ToutR = TinR - TdiffR
  93. return {
  94. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  95. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  96. }
  97. def prior(self):
  98. param = {
  99. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  100. 'beta_P2': pm.TruncatedNormal(f'{self.name}_beta_P2',mu=0.5,sigma=1,initval=0.02,lower=0),
  101. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  102. 'beta_P4': pm.TruncatedNormal(f'{self.name}_beta_P4',mu=1,sigma=0.3,initval=1,lower=0),
  103. 'beta_P5': pm.TruncatedNormal(f'{self.name}_beta_P5',mu=5,sigma=2,initval=5,lower=0),
  104. }
  105. return param
  106. class WheelS2V3(BaseComponents):
  107. def __init__(self, name):
  108. super().__init__(name)
  109. @classmethod
  110. def model(
  111. cls,
  112. TinP,HinP,FP,
  113. TinR,HinR,FR,
  114. engine : str,
  115. param : dict,
  116. ):
  117. FUNC = cls.get_func_by_engine(engine)
  118. EXP = FUNC['EXP']
  119. beta_P1 = param['beta_P1'] # km
  120. beta_P2 = param['beta_P2'] # eta_max
  121. beta_P3 = param['beta_P3']
  122. beta_P4 = param['beta_P4']
  123. beta_P5 = param['beta_P5']
  124. beta_C1 = param['beta_C1']
  125. beta_C2 = param['beta_C2']
  126. # 处理侧
  127. # 湿度
  128. alpha = FR / (FR + FP)
  129. T_wheel = TinR * alpha + TinP * (1 - alpha) + beta_P3
  130. Hr_eq = get_HumRatio_from_Tdb_and_RH(T_wheel,1,engine)
  131. eta = beta_P2 * (1-EXP(-beta_P1 * (HinP-Hr_eq)/Hr_eq))
  132. HdiffP = eta * (HinP - Hr_eq)
  133. HoutP = HinP - HdiffP
  134. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  135. # 温度
  136. TdiffP_sen = beta_P4 * (T_wheel - TinP)
  137. TdiffP_lat = cls.CONSTANT['h_ads'] / cls.CONSTANT['c_p_air'] * HdiffP * beta_P5
  138. ToutP = TinP + TdiffP_sen + TdiffP_lat
  139. # 再生侧
  140. # 湿度
  141. HdiffR = HdiffP * FP / FR
  142. HoutR = HinR + HdiffR
  143. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  144. # 温度
  145. TdiffR_lat = cls.CONSTANT['h_ads'] / cls.CONSTANT['c_p_air'] * HdiffR * beta_C2
  146. TdiffR_sen = beta_C1 * (TinR - T_wheel)
  147. ToutR = TinR - TdiffR_sen - TdiffR_lat
  148. return {
  149. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  150. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  151. 'T_wheel':T_wheel
  152. }
  153. def prior(self):
  154. param = {
  155. 'beta_P1': pm.HalfNormal(f'{self.name}_beta_P1',sigma=10,initval=5),
  156. 'beta_P2': pm.Uniform(f'{self.name}_beta_P2',lower=0,upper=1,initval=0.6),
  157. 'beta_P3': pm.Normal(f'{self.name}_beta_P3',mu=0,sigma=2,initval=0),
  158. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4', sigma=10,initval=1),
  159. 'beta_P5': pm.TruncatedNormal(f'{self.name}_beta_P5', mu=1, sigma=1,initval=1,lower=0),
  160. 'beta_C1': pm.HalfNormal(f'{self.name}_beta_C1', sigma=10,initval=1),
  161. 'beta_C2': pm.HalfNormal(f'{self.name}_beta_C2', sigma=1,initval=1),
  162. }
  163. return param