sam documentation

sam computes a version of the Southern Annular Mode index, also known as the Antarctic Oscillation.

Back to Climate Data Tools Contents



idx = sam(slp40,slp65,t)


idx = sam(slp40,slp65,t) calculates the Southern Annular Mode index from two time series of sea-level pressures at two latitudes (40S and 65S) and their corresponding times t.


Here, we'll recreate Figure 7 from Marshall's classic 2003 paper, Trends in the Southern Annular Mode from observations and reanalyses (Marshall, 2003), which depicts the monthly SAM index.

Load Data

We can load data containing zonal-mean SLP at 40S and 65S calculated from observations from 1957 January to 2018 December.

load sam_slp_data.mat

Plot pressure data

The sam_slp_data.mat file contains monthly zonal mean pressures from 1957 to 2018. (A note on how to get these types of zonal mean pressures from gridded data appears at the bottom of this page.) Here is the pressure data we'll use to calculate SAM:

hold on
axis tight
legend('mean SLP at 40\circS','mean SLP at 65\circS')

Calculate SAM index

The sam function normalizes each time series relative to a 1971-2000 baseline, and differences the two pressure anomaly time series to yield the SAM index.

% Calculate SAM index:
sam_idx = sam(slp40,slp65,t);

hold on
ylabel('SAM Index')
xlim([datetime(1955,1,1) datetime(2005,1,1)]) % sets date limits
ylim([-8 8])                                  % sets vertical limits
hline(0,'k--')                                % draws horizontal line

Above, the built-in Matlab function movmean was used to calculate the 12 month moving mean, and a horizontal dashed line was drawn with hline to match Marshall's Figure 7.

Getting zonal mean pressures

The example above begins by loading zonal mean pressures from 40S and 65S. If you're working with gridded data you'll need to calculate the zonal means at 40S and 65S. Do that like this. Start by loading some example data: (using ncdateread to read the date time).

lat = double(ncread('','latitude'));
lon = double(ncread('','longitude'));
t = ncdateread('','time');
sp = ncread('','sp');

A brute force way to get the zonal means at 40S and 65S is to interpolate to 40S and 65S at each unique longitude in the grid, and then average the results, for each timestep. Begin by preallocating the outputs, then loop through each time step, interpolating to 40S and 65S

% Preallocate zonal mean pressure time series:
slp40 = NaN(size(t));
slp65 = NaN(size(t));

% Loop through each time step:
for k = 1:length(t)

   % Take the mean of SLPs at all longitides, interpolated to 40S:
   slp40(k) = mean(interp2(lat,lon,sp(:,:,k),-40*ones(size(lon)),lon));

   % Take the mean of SLPs at all longitides, interpolated to 65S:
   slp65(k) = mean(interp2(lat,lon,sp(:,:,k),-65*ones(size(lon)),lon));

hold on

legend('mean SLP at 40\circS','mean SLP at 65\circS')


Marshall, G. J., 2003: Trends in the Southern Annular Mode from observations and reanalyses. J. Clim., 16, 4134-4143.

Author Info

The sam function and supporting documentation were written by Kaustubh Thirumalai for the Climate Data Toolbox for Matlab, 2019.