Source code for uwg.psychrometrics

"""Functions for sychrometric calculations."""
from __future__ import division

from math import log, pow, exp


[docs] def psychrometrics(Tdb_in, w_in, P): """Modified version of Psychometrics by Tea Zakula MIT Building Technology Lab. Args: Tdb_in: Number for dry bulb temperature (K). w_in: Number for Humidity Ratio (kgv/kgda). P: Atmospheric Station Pressure (P). Returns: A tuple with six values - Tdb: Number for dry bulb temperature in (C). - w: Number for Humidity Ratio (kgv/kgda). - phi: Number for relative humidity (Pw/Pws*100). - h: Number for enthalpy (J/kga). - Tdp: Number for dew point temperature (C). - v: Number for specific volume (m3/kga). """ # Change units c_air = 1006. # [J/kg] air heat capacity, value from ASHRAE Fundamentals hlg = 2501000. # [J/kg] latent heat, value from ASHRAE Fundamentals cw = 1860. # [J/kg] value from ASHRAE Fundamentals P = P / 1000. # convert from Pa to kPa Tdb = Tdb_in - 273.15 w = w_in # phi (RH) calculation from Tdb and w Pw = (w * P) / (0.621945 + w) # partial pressure of water vapor Pws = saturation_pressure(Tdb) # Get saturation pressure for given Tdb phi = Pw / Pws * 100.0 # enthalpy calculation from Tdb and w h = c_air * Tdb + w * (hlg + cw * Tdb) # [J kga-1] # specific volume calculation from Tdb and w v = 0.287042 * (Tdb + 273.15) * (1 + 1.607858 * w) / P # dew point calculation from w _pw = (w * P) / (0.621945 + w) # water vapor partial pressure in kPa try: alpha = log(_pw) except ValueError: # case of zero humidity alpha = -3 # just assume a very low value Tdp = 6.54 + 14.526 * alpha + pow(alpha, 2) * 0.7389 + pow(alpha, 3) * 0.09486 + \ pow(_pw, 0.1984) * 0.4569 # valid for Tdp between 0 C and 93 C return Tdb, w, phi, h, Tdp, v
[docs] def saturation_pressure(Tdb_): """Saturation pressure from dry bulb pressure. Args: Tdb_: Dry bulb temperature (K). Returns: Saturation pressure. """ T = Tdb_ + 273.15 # N.B In Matlab, negative values are converted to complex values. # log(-x) = log(x) + log(-1) = log(x) + i*pi # Python will throw an exception. Negative value occurs here if simulation # timestep (dtSim) is large, i.e 3600s. _Pws = exp(-1 * 5.8002206e3 / T + 1.3914993 + 4.8640239e-2 * T * -1.0 + 4.1764768e-5 * pow(T, 2) - 1.4452093e-8 * pow(T, 3) + 6.5459673 * log(T)) # Pa return _Pws / 1000. # kPa
[docs] def moist_air_density(P, Tdb, H): """Moist air density (kgv m-3) from dry bulb temp, HR, and pressure[1][2][3]. Note: [1] ASHRAE Fundamentals (2005) ch. 6 eqn. 28 [2] ASHRAE Fundamentals (2009) ch. 1 eqn. 28 [3] https://github.com/psychrometrics/Libraries/blob/master/Psychrometrics_SI.cpp Args: P: Number for Pressure (P). Tdb: Number for dry bulb temperature in (C). H: Number for Humidity Ratio (kgv/kgda). Returns: Moist air density (kgv m-3). """ return P / (1000 * 0.287042 * Tdb * (1. + 1.607858 * H))
[docs] def hum_from_rhum_temp(RH, T, P): """Specific Humidity (kgh20/kgn202) from RH, T and Pa. Args: RH: Number for Relative Humidity. T: Number for dry bulb temperature (C). P: Number for air pressure (P). Returns: Specific Humidity (kgh20/kgn202). """ # Saturation vapour pressure from ASHRAE C8 = -5.8002206e3 C9 = 1.3914993 C10 = -4.8640239e-2 C11 = 4.1764768e-5 C12 = -1.4452093e-8 C13 = 6.5459673 T += 273.15 PWS = exp(C8 / T + C9 + C10 * T + C11 * pow(T, 2) + C12 * pow(T, 3) + C13 * log(T)) PW = RH * PWS / 100.0 # Vapour pressure return 0.62198 * PW / (P - PW) # 4. Specific humidity