Introduction

The ocedata package [1] provides data that may be of use to oceanographers, either working with their own R code or working with the oce package [2]. One such dataset, called levitus, holds sea surface temperature and salinity (SST and SSS), based on the 2013 version of the World Ocean Atlas. An updated version of this atlas is suggested by the WOA authors to be an improvement [3], and so it will be used for an updated version of levitus in the upcoming version of ocedata.

This blog item deals with differences between the two datasets.

Analysis

First, the netcdf files for temperature and salinity were downloaded from online sources [4,5]. Then the data were loaded as follows.

1
2
library(ncdf4)
con <- nc_open("woa13_decav_t00_01v2.nc")
## Error in R_nc4_open: No such file or directory
## Error in nc_open("woa13_decav_t00_01v2.nc"): Error in nc_open trying to open file woa13_decav_t00_01v2.nc
1
2
## make a vector for later convenience
longitude <- as.vector(ncvar_get(con, "lon"))
## Error in ncvar_get(con, "lon"): object 'con' not found
1
latitude <- as.vector(ncvar_get(con, "lat"))
## Error in ncvar_get(con, "lat"): object 'con' not found
1
SST <- ncvar_get(con, "t_an")[,,1]
## Error in ncvar_get(con, "t_an"): object 'con' not found
1
nc_close(con)
## Error in nc_close(con): object 'con' not found
1
con <- nc_open("woa13_decav_s00_01v2.nc")
## Error in R_nc4_open: No such file or directory
## Error in nc_open("woa13_decav_s00_01v2.nc"): Error in nc_open trying to open file woa13_decav_s00_01v2.nc
1
SSS <- ncvar_get(con, "s_an")[,,1]
## Error in ncvar_get(con, "s_an"): object 'con' not found
1
nc_close(con)
## Error in nc_close(con): object 'con' not found

Next, load the levitus dataset from the existing ocedata package and compute the differences

1
2
3
4
5
library(oce)
data("levitus", package="ocedata")
library(MASS) # for truehist
par(mfrow=c(2,1), mar=c(3, 3, 1, 1), mgp=c(2, 0.5, 0))
dSST <- SST - levitus$SST
## Error in eval(expr, envir, enclos): object 'SST' not found
1
dSSS <- SSS - levitus$SSS
## Error in eval(expr, envir, enclos): object 'SSS' not found

The main differences are said to be in data-sparse regions, e.g. high latitudes, so an interesting check is to plot spatial patterns.

1
2
3
par(mfrow=c(2,1), mar=c(3, 3, 1, 1), mgp=c(2, 0.5, 0))
data(coastlineWorld)
imagep(longitude, latitude, dSST, zlim=c(-3,3))
## Error in inherits(x, "POSIXt"): object 'longitude' not found
1
2
polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]],
        col='lightgray') 
## Error in polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]], : plot.new has not been called yet
1
mtext("SST change", side=3, adj=1)
## Error in mtext("SST change", side = 3, adj = 1): plot.new has not been called yet
1
imagep(longitude, latitude, dSSS, zlim=c(-3,3))
## Error in imagep(longitude, latitude, dSSS, zlim = c(-3, 3)): object 'longitude' not found
1
2
polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]],
        col='lightgray') 
## Error in polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]], : plot.new has not been called yet
1
mtext("SSS change", side=3, adj=1)
## Error in mtext("SSS change", side = 3, adj = 1): plot.new has not been called yet

The figures confirm that the differences are mainly in high latitudes, with estimates in Hudson’s Bay being particularly altered. A closer examination of the author’s general locale may interest him, if nobody else…

1
imagep(longitude, latitude, dSST, zlim=c(-3,3), xlim=c(-90,-30), ylim=c(30, 90), asp=1)
## Error in imagep(longitude, latitude, dSST, zlim = c(-3, 3), xlim = c(-90, : object 'longitude' not found
1
2
polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]],
        col='lightgray') 
## Error in polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]], : plot.new has not been called yet
1
mtext("SST change", side=3, adj=1)
## Error in mtext("SST change", side = 3, adj = 1): plot.new has not been called yet
1
imagep(longitude, latitude, dSSS, zlim=c(-3,3), xlim=c(-90,-30), ylim=c(30, 90), asp=1)
## Error in imagep(longitude, latitude, dSSS, zlim = c(-3, 3), xlim = c(-90, : object 'longitude' not found
1
2
polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]],
        col='lightgray') 
## Error in polygon(coastlineWorld[["longitude"]], coastlineWorld[["latitude"]], : plot.new has not been called yet
1
mtext("SSS change", side=3, adj=1)
## Error in mtext("SSS change", side = 3, adj = 1): plot.new has not been called yet

Conclusions

The patterns of variation are as expected: the updated WOA differs mainly in high latitudes. The differences seem mainly to arise in regions that are anomalous compared to other waters at similar latitudes. For example, the estimates for SST and SSS in Hudson’s Bay are markedly different in the two atlases. I am not too surprised by this, and I’m not too concerned either; I doubt that many researchers (other than some modelers) would have paid much attention to WOA estimates for Hudson’s Bay. However, the changes in the northern Labrador Sea are quite concerning, given the importance of that region to Atlantic watermass formation, and the likelihood that WOA is used to initialize numerical models.

References and resources

  1. Ocedata website

  2. Oce website

  3. NOAA document on WOA changes

  4. woa2013v2 temperature netcdf file

  5. woa2013v2 salinity netcdf file

  6. Jekyll source code for this blog entry: 2015-08-22-woa-2013-2.Rmd

This website is written in Jekyll, and the source is available on GitHub.