wheel3.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 (
  8. get_Dew_from_HumRatio,
  9. get_HumRatio_from_Tdb_and_RH,
  10. get_RH_from_Tdb_and_Hr,
  11. )
  12. class WheelS3V2(BaseComponents):
  13. # 适用于不能够准确测量预冷侧入口的空气温湿度(与V3的差异)
  14. def __init__(self, name):
  15. super().__init__(name)
  16. @classmethod
  17. def model(
  18. cls,
  19. TinP,HinP,FP,
  20. TinR,HinR,FR,
  21. TinC,HinC,FC,
  22. engine : str,
  23. param : dict,
  24. ):
  25. FUNC = cls.get_func_by_engine(engine)
  26. EXP = FUNC['EXP']
  27. beta_P1 = param['beta_P1']
  28. beta_P2 = param['beta_P2']
  29. beta_P3 = param['beta_P3']
  30. beta_P4 = param['beta_P4']
  31. beta_P5 = param['beta_P5']
  32. beta_P6 = param['beta_P6']
  33. beta_P7 = param['beta_P7']
  34. beta_P8 = param['beta_P8']
  35. beta_P9 = param['beta_P9']
  36. beta_P10 = param['beta_P10']
  37. beta_C1 = param['beta_C1']
  38. beta_C2 = param['beta_C2']
  39. beta_C3 = param['beta_C3']
  40. beta_C4 = param['beta_C4']
  41. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  42. # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  43. # 处理侧
  44. HdiffP = (
  45. beta_P1 * RinP ** beta_P4
  46. * HinP
  47. * (
  48. TinR * (1 - EXP(-beta_P5 * FR))
  49. + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
  50. + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
  51. )
  52. + beta_P2
  53. ) / 1000
  54. WdiffP = HdiffP * FP
  55. HoutP = HinP - HdiffP
  56. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  57. Q_lat_P = WdiffP * cls.CONSTANT['h_ads'] * beta_P8 # 潜热:吸附放热的量不等于液化潜热,因此需要有一个参数修正
  58. Q_sen_P = beta_P3 * (TinR - beta_P10 * (TinR - TinC) - TinP) # 显热
  59. TdiffP = (Q_lat_P + Q_sen_P + beta_P9) / (FP * cls.CONSTANT['c_p_air'])
  60. ToutP = TinP + TdiffP
  61. # 冷却侧
  62. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  63. ToutC = TinC + TdiffC
  64. HdiffC = 0
  65. WdiffC = HdiffC * FC
  66. HoutC = HinC - HdiffC
  67. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  68. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  69. # 再生侧
  70. WdiffR = WdiffP + WdiffC
  71. HoutR = (HinR * FR + WdiffR) / FR
  72. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  73. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  74. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  75. ToutR = TinR - TdiffR
  76. return {
  77. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  78. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  79. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  80. 'EFF' :Q_lat_P / (Q_sen_P + Q_lat_P),
  81. 'Qsen' :Q_sen_P,'Qlat':Q_lat_P
  82. }
  83. def prior(self):
  84. param = {
  85. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  86. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  87. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  88. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  89. 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
  90. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  91. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  92. 'beta_P8': pm.TruncatedNormal(f'{self.name}_beta_P8',mu=1.3,sigma=0.1,initval=1.3,lower=1),
  93. 'beta_P9': pm.Normal(f'{self.name}_beta_P9',mu=0,sigma=0.1,initval=0),
  94. 'beta_P10': pm.HalfNormal(f'{self.name}_beta_P10',sigma=0.5,initval=0.1),
  95. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  96. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  97. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  98. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  99. }
  100. return param
  101. class WheelS3V3(BaseComponents):
  102. def __init__(self, name):
  103. super().__init__(name)
  104. @classmethod
  105. def model(
  106. cls,
  107. TinP,HinP,FP,
  108. TinR,HinR,FR,
  109. TinC,HinC,FC,
  110. engine : str,
  111. param : dict,
  112. ):
  113. FUNC = cls.get_func_by_engine(engine)
  114. EXP = FUNC['EXP']
  115. beta_P1 = param['beta_P1']
  116. beta_P2 = param['beta_P2']
  117. beta_P3 = param['beta_P3']
  118. beta_P4 = param['beta_P4']
  119. beta_P5 = param['beta_P5']
  120. beta_P6 = param['beta_P6']
  121. beta_P7 = param['beta_P7']
  122. beta_P8 = param['beta_P8']
  123. beta_P9 = param['beta_P9']
  124. beta_P10 = param['beta_P10']
  125. beta_C1 = param['beta_C1']
  126. beta_C2 = param['beta_C2']
  127. beta_C3 = param['beta_C3']
  128. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  129. RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  130. # 处理侧
  131. HdiffP = (
  132. beta_P1 * RinP ** beta_P4
  133. * HinP
  134. * (
  135. TinR * (1 - EXP(-beta_P5 * FR))
  136. + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
  137. + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
  138. )
  139. + beta_P2
  140. ) / 1000
  141. WdiffP = HdiffP * FP
  142. HoutP = HinP - HdiffP
  143. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  144. Q_lat_P = WdiffP * cls.CONSTANT['h_ads'] * beta_P8
  145. Q_sen_P = beta_P3 * (TinR - beta_P10 * (TinR - TinC) - TinP)
  146. TdiffP = (Q_lat_P + Q_sen_P + beta_P9) / (FP * cls.CONSTANT['c_p_air'])
  147. ToutP = TinP + TdiffP
  148. # 冷却侧
  149. TdiffC = beta_C1 * RinC ** beta_C2 * TinR + beta_C3
  150. ToutC = TinC + TdiffC
  151. HdiffC = 0
  152. WdiffC = HdiffC * FC
  153. HoutC = HinC - HdiffC
  154. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  155. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  156. # 再生侧
  157. WdiffR = WdiffP + WdiffC
  158. HoutR = (HinR * FR + WdiffR) / FR
  159. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  160. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  161. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  162. ToutR = TinR - TdiffR
  163. return {
  164. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  165. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  166. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  167. 'EFF' :Q_lat_P / (Q_sen_P + Q_lat_P),
  168. 'Qsen' :Q_sen_P,'Qlat':Q_lat_P
  169. }
  170. def prior(self):
  171. param = {
  172. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  173. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  174. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  175. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  176. 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
  177. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  178. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  179. 'beta_P8': pm.TruncatedNormal(f'{self.name}_beta_P8',mu=1.3,sigma=0.1,initval=1.3,lower=1),
  180. 'beta_P9': pm.Normal(f'{self.name}_beta_P9',mu=0,sigma=0.1,initval=0),
  181. 'beta_P10': pm.Normal(f'{self.name}_beta_P10',mu=0.1,sigma=0.1,initval=0.1),
  182. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=0.5,sigma=1,initval=0.5,lower=0),
  183. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=0.3,sigma=1,initval=0.3,lower=0),
  184. 'beta_C3': pm.Normal(f'{self.name}_beta_C3',mu=0,sigma=10,initval=0),
  185. }
  186. return param