wheel3.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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_C1 = param['beta_C1']
  34. beta_C2 = param['beta_C2']
  35. beta_C3 = param['beta_C3']
  36. beta_C4 = param['beta_C4']
  37. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  38. # RinC = get_RH_from_Tdb_and_Hr(TinC,HinC,engine)
  39. # 处理侧
  40. HdiffP = (
  41. beta_P1 * RinP ** beta_P4
  42. * HinP
  43. * (TinR + beta_P6 * TinC + beta_P7 * TinP)
  44. * EXP(-beta_P5 * FP)
  45. + beta_P2
  46. ) / 1000
  47. WdiffP = HdiffP * FP
  48. HoutP = HinP - HdiffP
  49. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  50. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  51. Q_sen_P = beta_P3 * (TinR - TinP) * FP
  52. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  53. ToutP = TinP + TdiffP
  54. # 冷却侧
  55. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  56. ToutC = TinC + TdiffC
  57. # HdiffC = (beta_P1 * RinC**beta_P4 * HinC * TinR * EXP(-beta_P5 * FC) + beta_P2)/1000
  58. HdiffC = 0
  59. WdiffC = HdiffC * FC
  60. HoutC = HinC - HdiffC
  61. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  62. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  63. # 再生侧
  64. WdiffR = WdiffP + WdiffC
  65. HoutR = (HinR * FR + WdiffR) / FR
  66. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  67. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  68. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  69. ToutR = TinR - TdiffR
  70. return {
  71. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  72. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  73. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  74. }
  75. def prior(self):
  76. param = {
  77. 'beta_P1': pm.TruncatedNormal(f'{self.name}_beta_P1',mu=5,sigma=10,initval=5,lower=0),
  78. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',sigma=1,initval=0),
  79. 'beta_P3': pm.TruncatedNormal(f'{self.name}_beta_P3',mu=1,sigma=2,initval=1.5,lower=0),
  80. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4',sigma=1,initval=0.1),
  81. 'beta_P5': pm.TruncatedNormal(f'{self.name}_beta_P5',mu=5,sigma=2,initval=5,lower=0),
  82. 'beta_P6': pm.Normal(f'{self.name}_beta_P6',mu=0,sigma=1,initval=0),
  83. 'beta_P7': pm.Normal(f'{self.name}_beta_P7',mu=0,sigma=1,initval=0),
  84. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  85. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  86. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  87. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  88. }
  89. return param
  90. class WheelS3V2(BaseComponents):
  91. def __init__(self, name):
  92. super().__init__(name)
  93. @classmethod
  94. def model(
  95. cls,
  96. TinP,HinP,FP,
  97. TinR,HinR,FR,
  98. TinC,HinC,FC,
  99. engine : str,
  100. param : dict,
  101. ):
  102. FUNC = cls.get_func_by_engine(engine)
  103. EXP = FUNC['EXP']
  104. K0 = param['K0']
  105. eta = param['eta']
  106. beta_P1 = param['beta_P1']
  107. beta_P2 = param['beta_P2']
  108. beta_P3 = param['beta_P3']
  109. beta_P1a = param['beta_P1a']
  110. beta_P2a = param['beta_P2a']
  111. beta_P3a = param['beta_P3a']
  112. beta_P4 = param['beta_P4']
  113. beta_C1 = param['beta_C1']
  114. beta_C2 = param['beta_C2']
  115. beta_C3 = param['beta_C3']
  116. beta_C4 = param['beta_C4']
  117. RinP = get_RH_from_Tdb_and_Hr(TinP,HinP,engine)
  118. T_wheel_P = (
  119. beta_P1a * TinP * FP ** beta_P1
  120. + beta_P2a * TinC * FC ** beta_P2
  121. + beta_P3a * TinR * FR ** beta_P3
  122. )
  123. E = -45
  124. R = 8.314
  125. N = 0.45
  126. H_eq = K0 * EXP(-E / (R * (T_wheel_P + 273.15))) * RinP ** N # 处理侧平衡状态下转轮能够吸附的水
  127. HoutP = HinP - eta * (H_eq - HinP) * (1 - EXP(-beta_P4 * FP))
  128. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  129. WdiffP = (HinP - HoutP) * FP
  130. Q_lat_P = WdiffP * cls.CONSTANT['h_ads']
  131. Q_sen_P = beta_P3 * (TinR - TinP) * FP
  132. TdiffP = (Q_lat_P + Q_sen_P) / (FP * cls.CONSTANT['c_p_air'])
  133. ToutP = TinP + TdiffP
  134. # 冷却侧
  135. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (TinR - TinC))) * EXP(-beta_C4 * FC)
  136. ToutC = TinC + TdiffC
  137. HdiffC = 0
  138. WdiffC = HdiffC * FC
  139. HoutC = HinC - HdiffC
  140. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  141. Q_total_C = TdiffC * FC * cls.CONSTANT['c_p_air']
  142. # 再生侧
  143. WdiffR = WdiffP + WdiffC
  144. HoutR = (HinR * FR + WdiffR) / FR
  145. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  146. Q_total_R = Q_lat_P + Q_sen_P + Q_total_C
  147. TdiffR = Q_total_R / (FR * cls.CONSTANT['c_p_air'])
  148. ToutR = TinR - TdiffR
  149. return {
  150. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  151. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  152. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  153. }
  154. def prior(self):
  155. param = {
  156. 'beta_P1': pm.Normal(f'{self.name}_beta_P1',mu=0,sigma=1,initval=0),
  157. 'beta_P2': pm.Normal(f'{self.name}_beta_P2',mu=0,sigma=1,initval=0),
  158. 'beta_P3': pm.Normal(f'{self.name}_beta_P3',mu=0,sigma=1,initval=0),
  159. 'beta_P1a': pm.Normal(f'{self.name}_beta_P1a',mu=1,sigma=1,initval=1),
  160. 'beta_P2a': pm.Normal(f'{self.name}_beta_P2a',mu=1,sigma=1,initval=1),
  161. 'beta_P3a': pm.Normal(f'{self.name}_beta_P3a',mu=1,sigma=1,initval=1),
  162. 'beta_P4': pm.TruncatedNormal(f'{self.name}_beta_P4',mu=5,sigma=3,initval=5,lower=0),
  163. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  164. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  165. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  166. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  167. 'K0' : pm.TruncatedNormal(f'{self.name}_k0',mu=0.4,sigma=0.1,initval=0.4,lower=0),
  168. 'eta' : pm.HalfNormal(f'{self.name}_eta',sigma=0.1,initval=0.1)
  169. }
  170. return param
  171. class WheelS3V3(BaseComponents):
  172. def __init__(self, name):
  173. super().__init__(name)
  174. @classmethod
  175. def model(
  176. cls,
  177. TinP,HinP,FP,
  178. TinR,HinR,FR,
  179. TinC,HinC,FC,
  180. engine : str,
  181. param : dict,
  182. ):
  183. FUNC = cls.get_func_by_engine(engine)
  184. EXP = FUNC['EXP']
  185. beta_P1 = param['beta_P1'] # km
  186. beta_P2 = param['beta_P2'] # eta_max
  187. beta_P4 = param['beta_P4']
  188. beta_P5 = param['beta_P5']
  189. beta_C1 = param['beta_C1']
  190. beta_C2 = param['beta_C2']
  191. beta_C3 = param['beta_C3']
  192. beta_C4 = param['beta_C4']
  193. beta_R1 = param['beta_R1']
  194. beta_R2 = param['beta_R2']
  195. # FP_w = EXP(FP)
  196. # FR_w = EXP(FR)
  197. # FC_w = EXP(FC)
  198. T_wheel = (
  199. TinP * (FP / (FP + FR + FC))
  200. + TinR * (FR / (FP + FR + FC))
  201. + TinC * (FC / (FP + FR + FC))
  202. )
  203. Hr_eq = get_HumRatio_from_Tdb_and_RH(T_wheel,1,engine)
  204. # 处理侧
  205. # 湿度
  206. eta = beta_P2 * (1-EXP(-beta_P1 * (HinP-Hr_eq)/Hr_eq))
  207. HdiffP = eta * (HinP - Hr_eq)
  208. HoutP = HinP - HdiffP
  209. DoutP = get_Dew_from_HumRatio(HoutP,engine)
  210. # 温度
  211. TdiffP_sen = beta_P4 * (T_wheel - TinP)
  212. TdiffP_lat = cls.CONSTANT['h_ads'] / cls.CONSTANT['c_p_air'] * HdiffP * beta_P5
  213. ToutP = TinP + TdiffP_sen + TdiffP_lat
  214. # 预冷侧
  215. # 湿度
  216. HdiffC = eta * (HinC - Hr_eq)
  217. HoutC = HinC - HdiffC
  218. DoutC = get_Dew_from_HumRatio(HoutC,engine)
  219. # 温度
  220. TdiffC = beta_C1 * EXP(-beta_C2 * EXP(-beta_C3 * (T_wheel - TinC))) * EXP(-beta_C4 * FC)
  221. ToutC = TinC + TdiffC
  222. # 再生侧
  223. # 湿度
  224. HdiffR = (HdiffP * FP + HdiffC * FC) / FR
  225. HoutR = HinR + HdiffR
  226. DoutR = get_Dew_from_HumRatio(HoutR,engine)
  227. # 温度
  228. TdiffR_lat = cls.CONSTANT['h_ads'] / cls.CONSTANT['c_p_air'] * HdiffR * beta_R1
  229. TdiffR_sen = beta_R2 * (TinR - T_wheel)
  230. ToutR = TinR - TdiffR_sen - TdiffR_lat
  231. return {
  232. 'ToutP':ToutP,'HoutP':HoutP,'DoutP':DoutP,'FP':FP,
  233. 'ToutR':ToutR,'HoutR':HoutR,'DoutR':DoutR,'FR':FR,
  234. 'ToutC':ToutC,'HoutC':HoutC,'DoutC':DoutC,'FC':FC,
  235. }
  236. def prior(self):
  237. param = {
  238. 'beta_P1': pm.HalfNormal(f'{self.name}_beta_P1',sigma=10,initval=0.01),
  239. 'beta_P2': pm.Uniform(f'{self.name}_beta_P2',lower=0,upper=1,initval=0.5),
  240. 'beta_P4': pm.HalfNormal(f'{self.name}_beta_P4', sigma=0.5,initval=0.2),
  241. 'beta_P5': pm.TruncatedNormal(f'{self.name}_beta_P5', mu=1, sigma=1,initval=1,lower=0),
  242. 'beta_C1': pm.TruncatedNormal(f'{self.name}_beta_C1',mu=60,sigma=10,initval=60,lower=10),
  243. 'beta_C2': pm.TruncatedNormal(f'{self.name}_beta_C2',mu=30,sigma=10,initval=30,lower=1),
  244. 'beta_C3': pm.TruncatedNormal(f'{self.name}_beta_C3',mu=0.05,sigma=0.1,initval=0.05,lower=0),
  245. 'beta_C4': pm.TruncatedNormal(f'{self.name}_beta_C4',mu=1,sigma=1,initval=1,lower=0),
  246. 'beta_R1': pm.TruncatedNormal(f'{self.name}_beta_R1', mu=1, sigma=1,initval=1,lower=0),
  247. 'beta_R2': pm.HalfNormal(f'{self.name}_beta_R2', sigma=10,initval=1),
  248. }
  249. return param