enthalpy.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import numpy as np
  2. try:
  3. import pymc as pm
  4. from pytensor.tensor import where
  5. except:
  6. pass
  7. PRESSURE = 101325
  8. def get_HumRatio_from_Tdb_and_RH(Tdb, RH, engine):
  9. """
  10. float: 含湿量 W (kg/kg干空气)
  11. """
  12. if engine == 'pymc':
  13. EXP = pm.math.exp
  14. elif engine == 'numpy':
  15. EXP = np.exp
  16. Psat = 611.2 * EXP(17.67 * Tdb / (Tdb + 243.5))
  17. Pv = RH * Psat
  18. HumRatio = 0.622 * Pv / (PRESSURE - Pv)
  19. return HumRatio
  20. # 计算含湿量
  21. def get_HumRatio_from_Dew(dew_point,engine):
  22. """
  23. :return: 含湿量 kg 水蒸气 / kg 干空气
  24. """
  25. if engine == 'pymc':
  26. EXP = pm.math.exp
  27. elif engine == 'numpy':
  28. EXP = np.exp
  29. vapor_pressure = 6.112 * EXP(17.67 * dew_point / (dew_point + 243.5)) * 100
  30. HumRatio = (0.622 * vapor_pressure) / (PRESSURE - vapor_pressure)
  31. return HumRatio
  32. def get_Dew_from_HumRatio(HumRatio,engine):
  33. """
  34. :param HumRatio: 含湿量 kg 水蒸气 / kg 干空气
  35. :return: 露点温度
  36. """
  37. if engine == 'pymc':
  38. LOG = pm.math.log
  39. WHERE = where
  40. elif engine == 'numpy':
  41. LOG = np.log
  42. WHERE = np.where
  43. HumRatio = WHERE(HumRatio<1e-5,1e-5,HumRatio)
  44. vapor_pressure = (HumRatio * PRESSURE) / (0.622 + HumRatio)
  45. x = LOG(vapor_pressure / (6.112 * 100))
  46. dew_point = (243.5 * x) / (17.67 - x)
  47. return dew_point
  48. def get_Enthalpy_from_Tdb_and_HumRatio(Tdb,Hr,engine):
  49. # return: 焓值 (kJ/kg干空气)
  50. # 常数
  51. c_pa = 1.006 # 干空气比热容 (kJ/kg·K)
  52. c_pv = 1.805 # 水蒸气比热容 (kJ/kg·K)
  53. h_fg = 2501 # 水的汽化潜热 (kJ/kg)
  54. Enthalpy = c_pa * Tdb + Hr * (h_fg + c_pv * Tdb)
  55. return Enthalpy
  56. def get_Enthalpy_from_Tdb_and_Dew(Tdb,Dew,engine):
  57. Hr = get_HumRatio_from_Dew(Dew,engine)
  58. Enthalpy = get_Enthalpy_from_Tdb_and_HumRatio(Tdb,Hr,engine)
  59. return Enthalpy
  60. def get_mixed_Dew(F1,F2,Dew1,Dew2,engine):
  61. if engine == 'pymc':
  62. LOG = pm.math.log
  63. EXP = pm.math.exp
  64. elif engine == 'numpy':
  65. LOG = np.log
  66. EXP = np.exp
  67. # Antoine 方程计算饱和水蒸气压力
  68. def saturation_pressure(T):
  69. return 611 * EXP(17.27 * T / (T + 237.3))
  70. # 计算湿度比
  71. def humidity_ratio(e_s):
  72. return 0.622 * e_s / (PRESSURE - e_s)
  73. # 计算混合后的露点温度
  74. def dew_point_temperature(e_mix):
  75. return (237.3 * LOG(e_mix / 611)) / (17.27 - LOG(e_mix / 611))
  76. # 计算空气 A 和空气 B 的饱和水蒸气压力
  77. e_s1 = saturation_pressure(Dew1)
  78. e_s2 = saturation_pressure(Dew2)
  79. # 计算空气 A 和空气 B 的湿度比
  80. W1 = humidity_ratio(e_s1)
  81. W2 = humidity_ratio(e_s2)
  82. W_mix = (F1 * W1 + F2 * W2) / (F1 + F2) # 计算混合后的湿度比
  83. e_mix = (W_mix * PRESSURE) / (0.622 + W_mix) # 计算混合后的水蒸气分压
  84. d_mix = dew_point_temperature(e_mix) # 计算混合后的露点温度
  85. return d_mix
  86. def get_RH_from_Tdb_and_Hr(Tdb, Hr, engine):
  87. """
  88. 计算相对湿度 (0~1),基于 ASHRAE 标准的高精度方法
  89. 参数:
  90. Tdb: 干球温度 (°C)
  91. Hr: 绝对湿度 (kg/kg)
  92. P: 大气压力 (Pa),默认 101325 Pa (1 atm)
  93. 返回:
  94. RH: 相对湿度 (0~1)
  95. """
  96. if engine == 'pymc':
  97. LOG = pm.math.log
  98. EXP = pm.math.exp
  99. elif engine == 'numpy':
  100. LOG = np.log
  101. EXP = np.exp
  102. # 1. 计算饱和水蒸气压力 (Pa) - Hyland-Wexler 公式 (ASHRAE 标准)
  103. T_kelvin = Tdb + 273.15 # 转换为开尔文温度
  104. # 饱和水蒸气压力 (Pa) - Hyland-Wexler (1983)
  105. ln_es = (
  106. -5.8002206e3 / T_kelvin
  107. + 1.3914993
  108. - 4.8640239e-2 * T_kelvin
  109. + 4.1764768e-5 * T_kelvin**2
  110. - 1.4452093e-8 * T_kelvin**3
  111. + 6.5459673 * LOG(T_kelvin)
  112. )
  113. es = EXP(ln_es)
  114. # 2. 计算实际水蒸气压力 (Pa)
  115. e = Hr * PRESSURE / (0.621945 + Hr) # 0.621945 ≈ 分子量比 (18.01528 / 28.966)
  116. # 3. 计算相对湿度 (RH)
  117. RH = e / es
  118. return RH
  119. def get_VP_from_Hr(Hr):
  120. # 水蒸气分压力
  121. VP = Hr * PRESSURE / (0.621945 + Hr)
  122. return VP