How can I calculate Vapor Pressure Deficit from Temperature and Relative Humidity?

From [The ASCE Standardized Reference Evapotranspiration Equation]1

Given T is temperature in degrees Celsius, and RH is relative humidity:

Saturation Vapor Pressure (es) =

0.6108 * exp(17.27 * T / (T + 237.3))

Actual Vapor Pressure (ea) =

RH / 100 * es 

Vapor Pressure Deficit =

ea - es

Why this is a meaningful measurement: "The strain under which an organism is placed in maintaining a water balance during temperature changes is much more clearly shown by noting the vapor pressure deficit than by recording the relative humidity." Anderson, D. B. 1936. Relative humidity or vapor pressure deficit. Ecology 17, no. 2: 277–282.


From Dennis Hartman "Global Physical Climatology" (p 350)


Given relative humidity in percent ($RH$) and temperature in Kelvin ($K$):

First, calculate saturation vapor pressure, $e_s$ in millibars (mb):

$$e_s= 6.11*exp\left( \frac{L}{R_v}\left(\frac{1}{273} - \frac{1}{T}\right) \right)$$

Where $L$ is the latent heat of vaporization, $2.5\times10^6\text{ J kg}^{-1}$, $R_v$ is the gas constant for water vapor ($461 \text{ J K}^{-1}\text{kg}^{-1}$.

Then calculate vapor pressure deficit, $vpd$, which is the difference between the saturation vapor pressure and the actual vapor pressure:

$$vpd = e_s*(100-RH)/100$$

Here are two functions written in R that will do this:

get.es <- function(temp){
  es <- 6.11 * exp((2.5e6 / 461) * (1 / 273 - 1 / (273 + temp)))
  return(es)
}

get.vpd <- function(rh, temp){
  ## calculate saturation vapor pressure
  es <- get.es(temp)
  ## calculate vapor pressure deficit
  vpd <- ((100 - rh) / 100) * es
  return(vpd)
}

And to test them out, you can plot the relationship between temperature and es (black) and at 50% RH, for example (in red):

temp <- -30:30
plot(temp, get.es(temp), type = "l", xlab = "T", ylab = "es or vpd")
lines(temp, get.vpd(50, temp), col = "red")

enter image description here


After checking the reference James suggested:

Allen, RG, Pereira, LS, Raes, D, Smith, M (1998) Meteorological data, Chapter 3. In: Crop evapotranspiration - Guidelines for computing crop water requirements. Food and Agricuture Organization (FAO) Irrigation and Drainage Paper 56. United Nations, FAO, Rome, Italy. Available from http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures

I found that, in the reference, it is less recommended to calculate Actual vapour pressure (ea) using mean relative humidity (as the get.ea function)

# function suggested by James 
# Calculate actual vapor pressure (ea)
get.ea <- function(rh, tmin, tmax){
  esm <- get.esm(tmin, tmax)
  ea <- (rh/100) * esm
  return(ea)
}

according to the reference http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures, Eq. 17, ea = [e°(Tmin) RHmax/100 + e°(Tmax) RHmin/100]/2, it is recommended to derive ea from maximum and minimum relative humidity rather than from the mean relative humidity.

therefore, the function get.ea can be modified as follows.

# reference http://www.fao.org/docrep/x0490e/x0490e07.htm#calculation%20procedures, Eq. 17 
# Calculate actual vapor pressure (ea)
# based on maximum and minimum relative humidity

get.ea <- function(rhmin, rhmax, tmin, tmax){
  esmn <- get.esmn(tmin) # other fun same as James suggested
  esmx <- get.esmx(tmax) 
  ea <- (esmn * rhmax/100 + esmx * rhmin/100) / 2
  return(ea)
}

Except for the modification of get.ea, the other functions are same as James suggested.