Psychrometrics & Moist Air | Thermodynamics with Python | Skill-Lync Resources

50% OFF - Ends Soon!

Lesson 10 of 13 25 min

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

See His Journey

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

See His Journey

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

See Where They Work

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.

🎯 3,000+ Engineers Placed
Sponsored
Harshal Sukenkar

Harshal

Fiat Chrysler

Abhishek

Abhishek

TATA ELXSI

Srinithin

Srinithin

Xitadel

Ranjith

Ranjith

Core Automotive

Gaurav Jadhav

Gaurav

Automotive Company

Bino K Biju

Bino

Design Firm

Aseem Shrivastava

Aseem

EV Company

Puneet

Puneet

Automotive Company

Vishal Kumar

Vishal

EV Startup

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:

ProcessPath on chartEffect
Sensible heatingHorizontal, to the right$T_{db}\uparrow$, $\omega$ constant, $\phi\downarrow$
Sensible coolingHorizontal, to the left$T_{db}\downarrow$, $\omega$ constant, $\phi\uparrow$
Cooling + dehumidificationLeft then down along saturation$T_{db}\downarrow$, $\omega\downarrow$
HumidificationUpward$\omega\uparrow$
Evaporative coolingUp-left along constant wet-bulb$T_{db}\downarrow$, $\omega\uparrow$
Adiabatic mixingStraight line between two statesweighted 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.

3,000+ Engineers Placed in Top Companies
Career Growth

3,000+ Engineers Placed in Top Companies

Join the ranks of successful engineers at Bosch, Tata, L&T, and 500+ hiring partners.