wheel3.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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 WheelS3(BaseComponents):
  13. def __init__(self, name):
  14. super().__init__(name)
  15. @classmethod
  16. def model(
  17. cls,
  18. TinP,HinP,FP,
  19. TinR,HinR,FR,
  20. TinC,HinC,FC,
  21. engine : str,
  22. param : dict,
  23. ):
  24. FUNC = cls.get_func_by_engine(engine)
  25. EXP = FUNC['EXP']
  26. beta_P1 = param['beta_P1']
  27. beta_P2 = param['beta_P2']
  28. beta_P3 = param['beta_P3']
  29. beta_P4 = param['beta_P4']
  30. beta_P5 = param['beta_P5']
  31. beta_P6 = param['beta_P6']
  32. beta_P7 = param['beta_P7']
  33. beta_P8 = param['beta_P8']
  34. beta_C1 = param['beta_C1']
  35. beta_C2 = param['beta_C2']
  36. beta_C3 = param['beta_C3']
  37. beta_C4 = param['beta_C4']
  38. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  39. # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  40. # 处理侧
  41. HdiffP = (
  42. beta_P1 * RinP ** beta_P4
  43. * HinP
  44. * (TinR + beta_P6 * TinC + beta_P7 * TinP)
  45. * EXP(-beta_P5 * FP)
  46. + beta_P8 * FR
  47. + beta_P2
  48. ) / 1000
  49. WdiffP = HdiffP * FP
  50. HoutP = HinP - HdiffP
  51. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  52. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  53. Q_sen_P = beta_P3 * (TinR - TinP) * FP
  54. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  55. ToutP = TinP + TdiffP
  56. # 冷却侧
  57. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  58. ToutC = TinC + TdiffC
  59. HdiffC = 0
  60. WdiffC = HdiffC * FC
  61. HoutC = HinC - HdiffC
  62. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  63. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  64. # 再生侧
  65. WdiffR = WdiffP + WdiffC
  66. HoutR = (HinR * FR + WdiffR) / FR
  67. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  68. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  69. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  70. ToutR = TinR - TdiffR
  71. return {
  72. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  73. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  74. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  75. }
  76. def prior(self):
  77. param = {
  78. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  79. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  80. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  81. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  82. 'beta_P5': pm.TruncatedNormal(f'{self.name}_beta_P5',mu=5,sigma=2,initval=5,lower=0),
  83. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  84. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  85. 'beta_P8': pm.Normal(f'{self.name}_beta_P8',mu=1,sigma=10,initval=1),
  86. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  87. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  88. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  89. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  90. }
  91. return param
  92. class WheelS3V2(BaseComponents):
  93. # 适用于不能够准确测量预冷侧入口的空气温湿度
  94. def __init__(self, name):
  95. super().__init__(name)
  96. @classmethod
  97. def model(
  98. cls,
  99. TinP,HinP,FP,
  100. TinR,HinR,FR,
  101. TinC,HinC,FC,
  102. engine : str,
  103. param : dict,
  104. ):
  105. FUNC = cls.get_func_by_engine(engine)
  106. EXP = FUNC['EXP']
  107. beta_P1 = param['beta_P1']
  108. beta_P2 = param['beta_P2']
  109. beta_P3 = param['beta_P3']
  110. beta_P4 = param['beta_P4']
  111. beta_P5 = param['beta_P5']
  112. beta_P6 = param['beta_P6']
  113. beta_P7 = param['beta_P7']
  114. beta_C1 = param['beta_C1']
  115. beta_C2 = param['beta_C2']
  116. beta_C3 = param['beta_C3']
  117. beta_C4 = param['beta_C4']
  118. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  119. # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  120. # 处理侧
  121. HdiffP = (
  122. beta_P1 * RinP ** beta_P4
  123. * HinP
  124. * (
  125. TinR * (1 - EXP(-beta_P5 * FR))
  126. + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
  127. + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
  128. )
  129. + beta_P2
  130. ) / 1000
  131. WdiffP = HdiffP * FP
  132. HoutP = HinP - HdiffP
  133. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  134. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  135. Q_sen_P = beta_P3 * (TinR - TinP) * FP
  136. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  137. ToutP = TinP + TdiffP
  138. # 冷却侧
  139. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  140. ToutC = TinC + TdiffC
  141. HdiffC = 0
  142. WdiffC = HdiffC * FC
  143. HoutC = HinC - HdiffC
  144. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  145. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  146. # 再生侧
  147. WdiffR = WdiffP + WdiffC
  148. HoutR = (HinR * FR + WdiffR) / FR
  149. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  150. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  151. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  152. ToutR = TinR - TdiffR
  153. return {
  154. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  155. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  156. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  157. }
  158. def prior(self):
  159. param = {
  160. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  161. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  162. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  163. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  164. 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
  165. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  166. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  167. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  168. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  169. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  170. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  171. }
  172. return param
  173. class WheelS3V3(BaseComponents):
  174. def __init__(self, name):
  175. super().__init__(name)
  176. @classmethod
  177. def model(
  178. cls,
  179. TinP,HinP,FP,
  180. TinR,HinR,FR,
  181. TinC,HinC,FC,
  182. engine : str,
  183. param : dict,
  184. ):
  185. FUNC = cls.get_func_by_engine(engine)
  186. EXP = FUNC['EXP']
  187. beta_P1 = param['beta_P1']
  188. beta_P2 = param['beta_P2']
  189. beta_P3 = param['beta_P3']
  190. beta_P4 = param['beta_P4']
  191. beta_P5 = param['beta_P5']
  192. beta_P6 = param['beta_P6']
  193. beta_P7 = param['beta_P7']
  194. beta_C1 = param['beta_C1']
  195. beta_C2 = param['beta_C2']
  196. beta_C3 = param['beta_C3']
  197. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  198. RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  199. # 处理侧
  200. HdiffP = (
  201. beta_P1 * RinP ** beta_P4
  202. * HinP
  203. * (
  204. TinR * (1 - EXP(-beta_P5 * FR))
  205. + beta_P6 * TinC * (1 - EXP(-beta_P5 * FC))
  206. + beta_P7 * TinP * (1 - EXP(-beta_P5 * FP))
  207. )
  208. + beta_P2
  209. ) / 1000
  210. WdiffP = HdiffP * FP
  211. HoutP = HinP - HdiffP
  212. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  213. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  214. Q_sen_P = beta_P3 * (TinR - TinP) * FP
  215. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  216. ToutP = TinP + TdiffP
  217. # 冷却侧
  218. TdiffC = beta_C1 * RinC ** beta_C2 * TinR + beta_C3
  219. ToutC = TinC + TdiffC
  220. HdiffC = 0
  221. WdiffC = HdiffC * FC
  222. HoutC = HinC - HdiffC
  223. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  224. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  225. # 再生侧
  226. WdiffR = WdiffP + WdiffC
  227. HoutR = (HinR * FR + WdiffR) / FR
  228. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  229. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  230. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  231. ToutR = TinR - TdiffR
  232. return {
  233. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  234. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  235. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  236. }
  237. def prior(self):
  238. param = {
  239. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  240. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  241. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  242. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  243. 'beta_P5': pm.HalfNormal(f'{self.name}_beta_P5',sigma=10,initval=1),
  244. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  245. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  246. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=0.5,sigma=1,initval=0.5,lower=0),
  247. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=0.3,sigma=1,initval=0.3,lower=0),
  248. 'beta_C3': pm.Normal(f'{self.name}_beta_C3',mu=0,sigma=10,initval=0),
  249. }
  250. return param