User Tools

Site Tools

You are not allowed to perform this action


Author: David Zelený & Tsung-Yi Lin

The function uses aspect, slope and latitude of the plot and calculates potential annual direct incident radiation and heat load, according to equations published by McCune & Keon (2002).

Note: prior to 4/16/2019, the definition of this function had a bug and returned incorrect values; thanks to Tsung-Yi Lin (林宗儀) for noticing the problem and fixing it!


  • aspect - aspect of the plot, vector (either in degrees, or radians)
  • slope - the inclination of the plot, vector (either in degrees, or radians)
  • latitude - latitude of the plot, either a vector of the same length as aspect or slope, or a single value (in case that all plots are from the same relatively small region)
  • method - default is “heatload”, alternative is “radiation”
  • units - default is “degrees”, alternative is “radians”
  • equation - the equation number (1, 2 or 3); default is 1 (the most general one). The three equations have slightly different uses. Eq. 1 (default in the function below) is broadest in the application, covering all slopes <= 90° in steepness at latitudes 0-60°N, but has the lowest precision. Eq. 2 increases the precision by excluding slopes steeper than 60°, an inconsequential omission for almost all data sets. Eq. 3 uses only three parameters to produce a slightly stronger model but is applicable only to latitudes 30-60°N (ie not for the tropical and subtropical region).
# Function "heatload"
# Calculates heat load or potential annual direct incident radiation, using the formulas published in 
# McCune & Keon (2002) based on aspect, slope and latitude.
heatload <- function (aspect, slope, latitude, method = 'heatload', units = 'degrees', equation = 1)
  if (units == 'degrees')   # convert degrees to radians
    aspect <- aspect/180*pi
    slope <- slope/180*pi
    aspect[slope == 0] <- 0
    latitude <- latitude/180*pi
  A <- if (method == 'heatload') abs (pi - abs (aspect - (5*pi/4))) else pi - abs (aspect-pi)
  S <- slope
  L <- if (length (latitude) == 1) rep (latitude, length (A)) else latitude
  if (equation == 1) res <- exp (-1.467 +1.582*cos(L)*cos(S) -1.500*cos(A)*sin(S)*sin(L) -0.262*sin(L)*sin(S) +0.607*sin(A)*sin(S))
  if (equation == 2) res <- exp (-1.236 +1.350*cos(L)*cos(S) -1.376*cos(A)*sin(S)*sin(L) -0.331*sin(L)*sin(S) +0.375*sin(A)*sin(S))
  if (equation == 3) res <-      +0.339 +0.808*cos(L)*cos(S)                             -0.196*sin(L)*sin(S)                       - 0.482*cos(A)*sin(S)
  return (res)

Example of the use on the dataset grasslands.env (acidophilous grasslands in Třebíč region, Czech Republic). The grasslands.env contains variables aspect, slope and latitude, all in degrees. Dataset represents small plots (16-25m2) located on convex outcrops in the agricultural landscape, covered by seminatural grassland vegetation.

source ('') # reads the function definition from above
grasslands.env <- read.delim ('') # loads the file
# Calculate heat load and add it to the grasslands.env data.frame:
grasslands.env$heatload <- heatload (aspect = grasslands.env$aspect, slope = grasslands.env$slope, latitude = grasslands.env$latitude, equation = 3)
en/customized_functions/heatload.txt · Last modified: 2021/01/31 20:07 by David Zelený