sam computes a version of the Southern Annular Mode index, also known as the Antarctic Oscillation.
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.
We can load data containing zonal-mean SLP at 40S and 65S calculated from observations from 1957 January to 2018 December.
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:
figure plot(t,slp40); hold on plot(t,slp65) 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); figure plot(t,sam_idx,':','color',rgb('gray')); hold on plot(t,movmean(sam_idx,12),'k','linewidth',1) ylabel('SAM Index') xlabel('Year') 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('ERA_Interim_2017.nc','latitude')); lon = double(ncread('ERA_Interim_2017.nc','longitude')); t = ncdateread('ERA_Interim_2017.nc','time'); sp = ncread('ERA_Interim_2017.nc','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)); end figure plot(t,slp40) hold on plot(t,slp65) 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. https://journals.ametsoc.org/doi/pdf/10.1175/1520-0442%282003%29016%3C4134%3ATITSAM%3E2.0.CO%3B2
The sam function and supporting documentation were written by Kaustubh Thirumalai for the Climate Data Toolbox for Matlab, 2019.