Canadian Polar Deployments

A brief overview of recent deployments of Canadian floats in polar oceans.

Christopher Gordon https://github.com/cgrdn
2024-02-29

In this post we will summarize recent polar deployments of NKE ARVOR and look at their initial data. The deployments occurred in the Beaufort Sea in the Arctic Ocean, North of Alaska/Northwest Territories and the Ross Sea in the Southern Ocean. Ice avoidance parameters for each region will be shown.

All data will be pulled from the GDAC using argopy, code can be expanded in each section.

Show code
### imports and setup

import argopy

from pathlib import Path
from netCDF4 import Dataset
import numpy as np

import matplotlib.pyplot as plt
import matplotlib.path as mpath
import cmocean.cm as cmo

import seaborn as sns
sns.set(style="ticks", palette="colorblind")

import cartopy.crs as ccrs
import cartopy.feature as cfeature

Deployments

Recent polar region deployments consist of 2 floats (4902610, 4902611) deployed in the Beaufort Sea by the Louis S. St. Laurent in September 2023, and 5 floats (4902664, 4902665, 4902667, 4902668, 4902669) deployed in the Ross Sea by the Italian ship Laura Bassi.

Show code
# define some useful mapping functions
def polarCentral_set_latlim(lat_lims, ax):
  ax.set_extent([-180, 180, lat_lims[0], lat_lims[1]], ccrs.PlateCarree())
  # Compute a circle in axes coordinates, which we can use as a boundary
  # for the map. We can pan/zoom as much as we like - the boundary will be
  # permanently circular.
  theta = np.linspace(0, 2*np.pi, 100)
  center, radius = [0.5, 0.5], 0.5
  verts = np.vstack([np.sin(theta), np.cos(theta)]).T
  circle = mpath.Path(verts * radius + center)
  
  ax.set_boundary(circle, transform=ax.transAxes)

def add_map_features(ax):
  ax.coastlines()
  gl = ax.gridlines()
  ax.add_feature(cfeature.BORDERS)
  ax.add_feature(cfeature.LAND)
  gl = ax.gridlines(draw_labels=True)


# wmo numbers of the floats
beaufort_wmos = [4902610, 4902611]
ross_wmos = [4902664, 4902665, 4902667, 4902668, 4902669]

# grab Argo index for each group
index = argopy.ArgoIndex().load()
beaufort_ix = index.search_wmo(beaufort_wmos).to_dataframe()
ross_ix = index.search_wmo(ross_wmos).to_dataframe()

# geo axis figures
fig = plt.figure(constrained_layout=True)
axes = [
  fig.add_subplot(1, 2, 1, projection=ccrs.NorthPolarStereo()),
  fig.add_subplot(1, 2, 2, projection=ccrs.SouthPolarStereo())
]

# bathymetry for plot
bath_file = Path('/Users/GordonC/Documents/data/GEBCO/GEBCO_2020.nc')
bath = Dataset(bath_file)
blat = bath['lat'][:]
blon = bath['lon'][:]
elev = bath['elevation'][:]

# subset/decimate bathymetry - really big array
iy = np.logical_or(blat > 60, blat < -65)

blat = blat[iy]
elev = elev[iy,:]
elev = -np.ma.masked_array(elev.data, elev > 0)

N = 20
blat = blat[::N]
blon = blon[::N]
elev = elev[::N,:]
elev = elev[:,::N]

for ix, ax in zip([beaufort_ix, ross_ix], axes):
  # add bathymetry
  im = ax.contourf(
    blon, blat, elev, list(range(0, 3800, 200)),
    transform=ccrs.PlateCarree(),
    cmap=cmo.deep,
    vmin=0, extend='max'
  )
  
  # plot profiles so far
  sns.scatterplot(
    data=ix, x='longitude', y='latitude', 
    hue='wmo', ax=ax, palette='colorblind',
    transform=ccrs.PlateCarree()
  )
  add_map_features(ax)

# move legend so somewhere more friendly
axes[0].legend(loc=3, bbox_to_anchor=(-0.25, 0.0))
axes[1].legend(loc=4, bbox_to_anchor=(1.25, 0.0))

# set limits
polarCentral_set_latlim([65, 90], axes[0])
polarCentral_set_latlim([-70, -90], axes[1])

axes[0].set_title('Arctic Ocean - Beaufort Sea upper left', loc='left', fontsize=8, fontweight='bold')
axes[1].set_title('Southern Ocean - Ross Sea lower left', loc='left', fontsize=8, fontweight='bold')

plt.show()

Ice Avoidance Configuration

In addition to the basic configuration described here, complete ice avoidance parameters can be found on the Argo Canada data management github page. The Ice Sensing Algorithm (ISA) works by measuring temperatures in a defined near-surface depth window, and if the median temperature is lower than the threshold temperature set by the user, inferring that there will be ice coverage above. Clearly, the proper threshold temperature will depend on the region and water properties, and so should be carefully selected.

Show code
df = read.csv('data/ISA_parameters.csv')
knitr::kable(df, caption='ISA parameters')
(#tab:ISA parameter table)ISA parameters
Parameter Beaufort.Sea.Value Ross.Sea.Value
Start Pressure Detection 20.0 50.000
Stop Pressure Detection 10.0 30.000
Temperature Threshold -1.8 -1.225

Initial Data

In the Beaufort Sea, both floats completed two profiles before going under the ice. We hope to hear from both floats towards the end of this summer/early fall.

In the Ross Sea, one floats (4902665) appears to have broken its conductivity cell upon deployment, perhaps due to icing or temperature shock. Salinity data exists for the first profile, but is all bad. We have not heard from this float since, so it has either completely failed or gone under the ice. There is a small chance if it went under the ice that future data might be viable if the conductivity cell had frozen but not broken, and the ice melts off while the float is at depth (~0.5\(^\circ\)C water).

The other 4 floats deployed in the Ross Sea all had successful deployments. For the first part of their mission (up to 2 weeks for some floats, a few days for others) they performed near-daily (31 hour) cycles in order to maximize data collection before they go under the ice. At the end of February they were switched back to near 10-day (235 hour) cycles so that they do not over-collect data while under the ice and run out of onboard memory space.

Show code
beaufort_df = df = argopy.DataFetcher().float(beaufort_wmos).to_dataframe()
ross_df = argopy.DataFetcher().float(ross_wmos).to_dataframe()

fig, axes = plt.subplots(2, 2, sharex=False, sharey=True, constrained_layout=True)
for axrow, varname in zip(axes, ['TEMP', 'PSAL']):
  for ax, df in zip(axrow, [beaufort_df, ross_df]):
    # remove bad conductivity values from one float w/ broken cell
    df.PSAL.loc[df.PSAL < 28] = np.nan
    sns.scatterplot(
      data=df, x=varname, y='PRES', 
      hue='PLATFORM_NUMBER', 
      palette='colorblind', ax=ax, linewidth=0.2
    )
_ = axes[0,0].set_ylim((2050, -50))
_ = axes[0,0].set_title('Beaufort Sea', loc='left', fontweight='bold')
_ = axes[0,1].set_title('Ross Sea', loc='left', fontweight='bold')
_ = axes[0,0].legend(loc=4)
_ = axes[0,1].legend(loc=3)
_ = axes[1,0].get_legend().remove()
_ = axes[1,1].get_legend().remove()
fig.set_size_inches(fig.get_figwidth(), 1.66*fig.get_figheight())
plt.show()

Citation

For attribution, please cite this work as

Gordon (2024, Feb. 29). Argo Canada Development Blog: Canadian Polar Deployments. Retrieved from https://argocanada.github.io/blog/posts/2024-02-28-canadian-polar-deployments/

BibTeX citation

@misc{gordon2024canadian,
  author = {Gordon, Christopher},
  title = {Argo Canada Development Blog: Canadian Polar Deployments},
  url = {https://argocanada.github.io/blog/posts/2024-02-28-canadian-polar-deployments/},
  year = {2024}
}