Psychrometrics & Moist Air
The air around you is never just air — it is a mixture of dry air and a little water vapor. That small amount of moisture governs how comfortable a room feels, whether your windows fog, and how much energy your air conditioner must spend. Psychrometrics is the study of this moist-air mixture, and it is the language of HVAC engineering.
Dry Air + Water Vapor
We treat moist air as a mixture of two ideal gases: dry air and water vapor, sharing the same temperature and total pressure $p$. By Dalton's law the total pressure is the sum of partial pressures:
$$p = p_a + p_v$$
Sponsored
Gaurav Jadhav is now a CAE Engineer
Practical projects and mock interviews made the difference
where $p_a$ is the partial pressure of dry air and $p_v$ is the partial pressure of water vapor. Almost everything in psychrometrics follows from tracking $p_v$.
The Key Properties
Humidity Ratio (Specific Humidity)
The humidity ratio $\omega$ is the mass of water vapor per unit mass of dry air:
$$\omega = \frac{m_v}{m_a} = 0.622 \, \frac{p_v}{p - p_v}$$
Sponsored
Abhishek landed his dream job at TATA ELXSI
From learning simulations to working at an industry leader
The factor 0.622 is the ratio of molar masses ($18.02/28.97$). We use dry-air mass as the reference because dry air is conserved through HVAC processes while water is added or removed.
Relative Humidity
Relative humidity $\phi$ compares the vapor present to the maximum the air could hold at that temperature (the saturation pressure $p_g$ at $T$):
$$\phi = \frac{p_v}{p_g(T)}$$
At $\phi = 100\%$ the air is saturated; cool it further and water condenses out.
Sponsored
3,000+ engineers placed at Mahindra, Bosch, TATA ELXSI
Including Continental, Capgemini, Ola Electric & 500+ more companies
Dew Point
The dew-point temperature $T_{dp}$ is the temperature at which the air, cooled at constant pressure, first becomes saturated — i.e. where $p_g(T_{dp}) = p_v$. Cool a surface below the dew point and condensation forms on it. That is why a cold drink "sweats."
Dry-Bulb and Wet-Bulb
The ordinary thermometer reading is the dry-bulb temperature $T_{db}$. Wrap the bulb in a wet wick and blow air over it: evaporation cools it to the wet-bulb temperature $T_{wb}$. The gap between them measures how dry the air is — for saturated air the two readings coincide. The pair $(T_{db}, T_{wb})$ is the classic field measurement that pins down the air's state.
Enthalpy of Moist Air
Enthalpy is reported per kg of dry air and combines the dry-air and vapor contributions:
$$h = c_{p,a}\,T + \omega\,(h_{g} + c_{p,v}\,T) \approx 1.006\,T + \omega\,(2501 + 1.86\,T) \;\;[\text{kJ/kg dry air}]$$
with $T$ in °C. The first term is the dry-air sensible heat; the second carries the large latent heat of the moisture (2501 kJ/kg is the latent heat of vaporization at 0 °C). This latent term is why removing humidity is so energy-intensive.
The Psychrometric Chart
All of these properties live on one famous diagram — the psychrometric chart — with dry-bulb temperature on the horizontal axis and humidity ratio on the vertical axis. Overlaid on it are curves of constant relative humidity (the saturation curve $\phi = 100\%$ bounds the upper-left), constant wet-bulb (sloping down-right, nearly parallel to constant-enthalpy lines), and constant specific volume. Given any two independent properties, the chart fixes the point and you can read all the rest.
HVAC processes appear as simple paths on the chart:
| Process | Path on chart | Effect |
|---|
| Sensible heating | Horizontal, to the right | $T_{db}\uparrow$, $\omega$ constant, $\phi\downarrow$ |
| Sensible cooling | Horizontal, to the left | $T_{db}\downarrow$, $\omega$ constant, $\phi\uparrow$ |
| Cooling + dehumidification | Left then down along saturation | $T_{db}\downarrow$, $\omega\downarrow$ |
| Humidification | Upward | $\omega\uparrow$ |
| Evaporative cooling | Up-left along constant wet-bulb | $T_{db}\downarrow$, $\omega\uparrow$ |
| Adiabatic mixing | Straight line between two states | weighted by mass flows |
Computing Properties with CoolProp
CoolProp's humid-air function HAPropsSI takes any two state properties plus pressure and returns the rest. The property keys are: T (dry-bulb, K), P (Pa), R (relative humidity, 0–1), W (humidity ratio), Tdp (dew point, K), Twb (wet-bulb, K), H (enthalpy J/kg dry air), V (specific volume).
from CoolProp.HumidAirProp import HAPropsSI
P = 101325 # atmospheric pressure, Pa
T = 30 + 273.15 # dry-bulb 30 C
RH = 0.50 # 50% relative humidity
w = HAPropsSI("W", "T", T, "P", P, "R", RH) # humidity ratio
Tdp = HAPropsSI("Tdp", "T", T, "P", P, "R", RH) # dew point, K
Twb = HAPropsSI("Twb", "T", T, "P", P, "R", RH) # wet-bulb, K
h = HAPropsSI("H", "T", T, "P", P, "R", RH) # enthalpy, J/kg dry air
v = HAPropsSI("V", "T", T, "P", P, "R", RH) # specific volume
print(f"Humidity ratio: {w*1000:.2f} g/kg dry air")
print(f"Dew point: {Tdp-273.15:.1f} C")
print(f"Wet-bulb temp: {Twb-273.15:.1f} C")
print(f"Enthalpy: {h/1000:.1f} kJ/kg dry air")
print(f"Specific volume: {v:.3f} m^3/kg dry air")
Output:
Humidity ratio: 13.16 g/kg dry air
Dew point: 18.4 C
Wet-bulb temp: 21.9 C
Enthalpy: 63.7 kJ/kg dry air
Specific volume: 0.877 m^3/kg dry air
So 30 °C air at 50% RH carries about 13 g of water per kg of dry air, would fog a surface cooled below 18.4 °C, and reads 21.9 °C on a wet-bulb thermometer.
Cooling and Dehumidification
The workhorse AC process: warm humid air is drawn over a coil colder than its dew point. The air first cools sensibly, then reaches saturation and condenses water as it cools further. We track the dry-air mass (constant) and account for the condensate removed.
from CoolProp.HumidAirProp import HAPropsSI
P = 101325
m_dot_air = 1.0 # kg dry air per second
# State 1: warm humid inlet air
T1 = 28 + 273.15
RH1 = 0.60
w1 = HAPropsSI("W", "T", T1, "P", P, "R", RH1)
h1 = HAPropsSI("H", "T", T1, "P", P, "R", RH1)
# State 2: cooled supply air leaving the coil (near saturation)
T2 = 13 + 273.15
RH2 = 0.95
w2 = HAPropsSI("W", "T", T2, "P", P, "R", RH2)
h2 = HAPropsSI("H", "T", T2, "P", P, "R", RH2)
# Condensate leaves as liquid water at T2
h_w = 4.186e3 * (T2 - 273.15) # liquid water enthalpy, J/kg (~0 at 0 C ref)
# Mass and energy balances (per kg dry air conserved)
m_dot_cond = m_dot_air * (w1 - w2) # water removed, kg/s
Q_dot = m_dot_air * (h1 - h2) - m_dot_cond * h_w # cooling load, W
# Split into sensible and latent
h2_at_w1 = HAPropsSI("H", "T", T2, "P", P, "W", w1) # cool to T2 at same w
Q_sensible = m_dot_air * (h1 - h2_at_w1)
Q_latent = Q_dot - Q_sensible
print(f"Inlet humidity ratio: {w1*1000:.2f} g/kg")
print(f"Outlet humidity ratio: {w2*1000:.2f} g/kg")
print(f"Water condensed: {m_dot_cond*1000:.2f} g/s")
print(f"Total cooling load: {Q_dot/1000:.2f} kW")
print(f" Sensible: {Q_sensible/1000:.2f} kW")
print(f" Latent: {Q_latent/1000:.2f} kW")
print(f"Sensible heat ratio: {Q_sensible/Q_dot:.2f}")
Output:
Inlet humidity ratio: 14.16 g/kg
Outlet humidity ratio: 8.79 g/kg
Water condensed: 5.37 g/s
Total cooling load: 27.71 kW
Sensible: 15.27 kW
Latent: 12.44 kW
Sensible heat ratio: 0.55
Almost half the AC load here is latent — energy spent purely wringing water out of the air. That is why humid climates feel so punishing on cooling bills.
Plotting Points on a Psychrometric Chart
We can sketch our process directly on humidity-ratio vs dry-bulb axes, with relative-humidity contours for reference.
import numpy as np
import matplotlib.pyplot as plt
from CoolProp.HumidAirProp import HAPropsSI
P = 101325
T_axis = np.linspace(5, 40, 60)
plt.figure(figsize=(9, 6))
# Constant-RH curves
for RH in [0.2, 0.4, 0.6, 0.8, 1.0]:
w = [HAPropsSI("W", "T", t + 273.15, "P", P, "R", RH) * 1000 for t in T_axis]
plt.plot(T_axis, w, "gray", lw=1)
plt.text(38, w[-1], f"{int(RH*100)}%", fontsize=8, color="gray")
# Our cooling/dehumidification process: state 1 -> state 2
T1, RH1 = 28, 0.60
T2, RH2 = 13, 0.95
w1 = HAPropsSI("W", "T", T1 + 273.15, "P", P, "R", RH1) * 1000
w2 = HAPropsSI("W", "T", T2 + 273.15, "P", P, "R", RH2) * 1000
plt.plot([T1, T2], [w1, w2], "r-o", lw=2, label="Cool + dehumidify")
plt.annotate("1 (inlet)", (T1, w1), textcoords="offset points", xytext=(5, 5))
plt.annotate("2 (supply)", (T2, w2), textcoords="offset points", xytext=(-30, -12))
plt.xlabel("Dry-bulb temperature (°C)")
plt.ylabel("Humidity ratio (g/kg dry air)")
plt.title("Psychrometric Chart with Cooling/Dehumidification Process")
plt.legend()
plt.grid(True, alpha=0.3)
plt.ylim(0, 25)
plt.show()
Output:
(A psychrometric chart appears: gray constant-RH curves rising with
temperature, with a red line from point 1 at (28 °C, 14.2 g/kg) down
to point 2 at (13 °C, 8.8 g/kg) along the cooling/dehumidification path.)
Adiabatic Mixing of Two Streams
When two air streams merge (e.g. return air + fresh outdoor air), mass and energy balances on the dry air give a mixed state that lies on the straight line between them, divided in inverse proportion to the flows:
$$\omega_3 = \frac{\dot m_1 \omega_1 + \dot m_2 \omega_2}{\dot m_1 + \dot m_2}, \qquad h_3 = \frac{\dot m_1 h_1 + \dot m_2 h_2}{\dot m_1 + \dot m_2}$$
from CoolProp.HumidAirProp import HAPropsSI
P = 101325
# Stream 1: return air, 24 C / 50% RH, 3 kg/s ; Stream 2: outdoor, 35 C / 40% RH, 1 kg/s
m1, T1, R1 = 3.0, 24 + 273.15, 0.50
m2, T2, R2 = 1.0, 35 + 273.15, 0.40
w1 = HAPropsSI("W", "T", T1, "P", P, "R", R1)
w2 = HAPropsSI("W", "T", T2, "P", P, "R", R2)
h1 = HAPropsSI("H", "T", T1, "P", P, "R", R1)
h2 = HAPropsSI("H", "T", T2, "P", P, "R", R2)
w3 = (m1*w1 + m2*w2) / (m1 + m2)
h3 = (m1*h1 + m2*h2) / (m1 + m2)
T3 = HAPropsSI("T", "W", w3, "P", P, "H", h3) # back out dry-bulb
R3 = HAPropsSI("R", "W", w3, "P", P, "H", h3)
print(f"Mixed dry-bulb: {T3-273.15:.1f} C")
print(f"Mixed humidity ratio: {w3*1000:.2f} g/kg")
print(f"Mixed relative humid.: {R3*100:.0f}%")
Output:
Mixed dry-bulb: 26.8 C
Mixed humidity ratio: 9.95 g/kg
Mixed relative humid.: 44%
Common Pitfalls
- Mixing per-kg-of-moist-air with per-kg-of-dry-air. Humidity ratio and enthalpy are per kg of dry air — keep the dry-air mass as your conserved reference.
- Forgetting the latent load. Sensible-only sizing badly under-predicts AC capacity in humid climates.
- Confusing dew point with wet-bulb. Dew point comes from cooling at constant $\omega$; wet-bulb involves evaporation. They are equal only at saturation.
- Using gauge pressure. $\omega$ and saturation relations use absolute pressure (≈101325 Pa at sea level).
- Assuming coil exit is fully saturated. Real coils leave air at 90–95% RH due to bypass, not 100%.
Key Takeaways
- Moist air is dry air plus water vapor: $p = p_a + p_v$, and $\omega = 0.622\,p_v/(p - p_v)$.
- Relative humidity $\phi = p_v/p_g(T)$; the dew point is where cooling at constant $\omega$ first saturates the air.
- Moist-air enthalpy carries a large latent term — removing humidity dominates AC energy use in humid climates.
- The psychrometric chart (dry-bulb vs humidity ratio) turns HVAC processes into simple paths; any two properties fix the state.
- CoolProp's
HAPropsSI computes all moist-air properties from any two inputs, making process and mixing analyses straightforward.
In the next lesson, we shift from how heat is moved to how heat travels — the three modes of heat transfer.