enthalpy.py 3.7 KB

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