Ventilation tracers: CFCs, 14C, Cant¶
%load_ext autoreload
%autoreload 2
import os
import numpy as np
import pandas as pd
import xarray as xr
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib.colors as colors
import cmocean
import xpersist as xp
cache_dir = '/glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields'
if (os.path.isdir(cache_dir)):
xp.settings['cache_dir'] = cache_dir
os.makedirs(cache_dir, exist_ok=True)
import pop_tools
import climo_utils as cu
import utils
import glodap
%matplotlib inline
xr.set_options(arithmetic_join='exact');
Set region mask for zonal means¶
mask3d = utils.get_pop_region_mask_za(mask_type='3D')
basins = mask3d.region.rename({'region': 'basins'})
mask2d = utils.get_pop_region_mask_za(mask_type='2D')
mask2d.plot()
<matplotlib.collections.QuadMesh at 0x2b0772e460d0>

Load zonal means of GLODAP observations¶
µmolkg_to_mmolm3 = 1026. * 1e-3 # µmol/kg --> mmol/m^3
µmolkg_to_mmolm3
1.026
fields_from = {
'GLODAPv1': ['pCFC11', 'pCFC12', 'Del14C', 'Cant_v1'],
'GLODAPv2.2016b_MappedClimatologies': ['Cant', 'ALK'],
'GLODAPv1+Gruber2019': ['Cant_v1pGruber2019'],
}
ds_list = []
for product_name, fields_list in fields_from.items():
ds = glodap.open_glodap_pop_grid(product_name)[fields_list]
ds_list_i = []
for v in fields_list:
ds_list_i.append(
utils.zonal_mean_via_fortran(
ds, var=v,
grid='POP_gx1v7',
region_mask=mask2d,
replace_kmt=True,
)
)
ds_list.append(xr.merge(ds_list_i))
ds_za = xr.merge(ds_list)
with xr.set_options(keep_attrs=True):
for v in ['Cant', 'Cant_v1', 'ALK']:
if v in ds_za:
ds_za[v] = ds_za[v] * µmolkg_to_mmolm3
ds_za[v].attrs['units'] = 'mmol m$^{-3}$'
ds_za = ds_za.rename({k: f'{k}_obs' for k in ds_za.data_vars})
ds_za['basins'] = basins
ds_za
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv1.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
za ran successfully, writing netcdf output
za ran successfully, writing netcdf output
za ran successfully, writing netcdf output
za ran successfully, writing netcdf output
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv2.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
za ran successfully, writing netcdf output
za ran successfully, writing netcdf output
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv1.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
za ran successfully, writing netcdf output
<xarray.Dataset> Dimensions: (basins: 4, lat_t: 394, lat_t_edges: 395, z_t: 60) Coordinates: * basins (basins) <U14 'Global' ... 'Indian Ocean' * lat_t (lat_t) float32 -79.22 -78.69 -78.15 ... 89.37 89.9 * lat_t_edges (lat_t_edges) float32 -79.49 -78.95 ... 89.64 90.0 * z_t (z_t) float64 500.0 1.5e+03 ... 5.125e+05 5.375e+05 Data variables: pCFC11_obs (basins, z_t, lat_t) float64 nan nan ... nan nan pCFC12_obs (basins, z_t, lat_t) float64 nan nan ... nan nan Del14C_obs (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_v1_obs (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_obs (basins, z_t, lat_t) float64 nan nan ... nan nan ALK_obs (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_v1pGruber2019_obs (basins, z_t, lat_t) float64 nan nan ... nan nan
xarray.Dataset
- basins: 4
- lat_t: 394
- lat_t_edges: 395
- z_t: 60
- basins(basins)<U14'Global' ... 'Indian Ocean'
array(['Global', 'Atlantic Ocean', 'Pacific Ocean', 'Indian Ocean'], dtype='<U14')
- lat_t(lat_t)float32-79.22 -78.69 -78.15 ... 89.37 89.9
- long_name :
- Latitude Cell Centers
- units :
- degrees_north
- edges :
- lat_t_edges
array([-79.22052 , -78.68631 , -78.15209 , ..., 88.836334, 89.370575, 89.904816], dtype=float32)
- lat_t_edges(lat_t_edges)float32-79.49 -78.95 -78.42 ... 89.64 90.0
array([-79.48714 , -78.952896, -78.418655, ..., 89.103455, 89.637695, 90. ], dtype=float32)
- z_t(z_t)float64500.0 1.5e+03 ... 5.375e+05
- units :
- cm
- long_name :
- depth from surface to midpoint of layer
- positive :
- down
array([5.000000e+02, 1.500000e+03, 2.500000e+03, 3.500000e+03, 4.500000e+03, 5.500000e+03, 6.500000e+03, 7.500000e+03, 8.500000e+03, 9.500000e+03, 1.050000e+04, 1.150000e+04, 1.250000e+04, 1.350000e+04, 1.450000e+04, 1.550000e+04, 1.650984e+04, 1.754790e+04, 1.862913e+04, 1.976603e+04, 2.097114e+04, 2.225783e+04, 2.364088e+04, 2.513702e+04, 2.676542e+04, 2.854837e+04, 3.051192e+04, 3.268680e+04, 3.510935e+04, 3.782276e+04, 4.087847e+04, 4.433777e+04, 4.827367e+04, 5.277280e+04, 5.793729e+04, 6.388626e+04, 7.075633e+04, 7.870025e+04, 8.788252e+04, 9.847059e+04, 1.106204e+05, 1.244567e+05, 1.400497e+05, 1.573946e+05, 1.764003e+05, 1.968944e+05, 2.186457e+05, 2.413972e+05, 2.649001e+05, 2.889385e+05, 3.133405e+05, 3.379794e+05, 3.627670e+05, 3.876452e+05, 4.125768e+05, 4.375393e+05, 4.625190e+05, 4.875083e+05, 5.125028e+05, 5.375000e+05])
- pCFC11_obs(basins, z_t, lat_t)float64...
- long_name :
- pCFC-11
- units :
- patm
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- pCFC12_obs(basins, z_t, lat_t)float64...
- long_name :
- pCFC-12
- units :
- patm
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- Del14C_obs(basins, z_t, lat_t)float64...
- long_name :
- $^{14}$C
- units :
- permille
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- Cant_v1_obs(basins, z_t, lat_t)float64nan nan 26.13 26.78 ... nan nan nan
- units :
- mmol m$^{-3}$
array([[[ nan, nan, 26.12513246, ..., nan, nan, nan], [ nan, nan, 25.70800719, ..., nan, nan, nan], [ nan, nan, 24.34805168, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 21.60995085, ..., nan, nan, nan], [ nan, nan, 21.07229263, ..., nan, nan, nan], [ nan, nan, 20.36618903, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_obs(basins, z_t, lat_t)float64nan nan 34.09 35.43 ... nan nan nan
- long_name :
- moles of anthropogenic carbon content per unit mass in seawater
- units :
- mmol m$^{-3}$
- Description :
- The GLODAPv2.2016b input data were normalized to the year 2002 using anthropogenic carbon calculated with the TTD method prior to mapping.
- time_period :
- For all surfaces (1-33) data from the years 1972-2013 inclusive have been used for mapping
array([[[ nan, nan, 34.0910502 , ..., 34.48518809, 34.91430343, 34.78505587], [ nan, nan, 34.57719095, ..., 34.14557923, 34.54970547, 34.6049128 ], [ nan, nan, 34.764624 , ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 34.1793056 , ..., 34.48518809, 34.91430343, 34.78505587], [ nan, nan, 35.26896139, ..., 34.14557923, 34.54970547, 34.6049128 ], [ nan, nan, 36.17607756, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- ALK_obs(basins, z_t, lat_t)float64nan nan 2.382e+03 ... nan nan nan
- long_name :
- seawater alkalinity expressed as mole equivalent per unit mass
- units :
- mmol m$^{-3}$
- time_period :
- For all surfaces (1-33) data from the years 1972-2013 inclusive have been used for mapping
array([[[ nan, nan, 2381.6453554 , ..., 2269.73092531, 2263.24456873, 2254.22085007], [ nan, nan, 2380.61858496, ..., 2265.18994051, 2258.4005919 , 2240.64319504], [ nan, nan, 2377.26557354, ..., 2278.74346011, 2272.55519948, 2289.42073359], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 2397.06338312, ..., 2269.73092531, 2263.24456873, 2254.22085007], [ nan, nan, 2396.89977785, ..., 2265.18994051, 2258.4005919 , 2240.64319504], [ nan, nan, 2392.69994515, ..., 2278.74346011, 2272.55519948, 2289.42073359], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_v1pGruber2019_obs(basins, z_t, lat_t)float64...
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
ds_za.pCFC11_obs.isel(basins=1).plot()
<matplotlib.collections.QuadMesh at 0x2b065c3d27d0>

ds_za.Cant_obs.isel(basins=0).plot()
<matplotlib.collections.QuadMesh at 0x2b065c72f350>

(ds_za.Cant_v1_obs - ds_za.Cant_obs).isel(basins=0).plot()
<matplotlib.collections.QuadMesh at 0x2b065cabd050>

ds_za.Del14C_obs.isel(basins=0).plot()
<matplotlib.collections.QuadMesh at 0x2b065d3f4910>

Load data from CESM integrations¶
cluster, client = utils.get_ClusterClient()
cluster.scale(12) #adapt(minimum_jobs=0, maximum_jobs=24)
client
Client
|
Cluster
|
time_slice_glodapv2 = slice('2002-01-15', '2003-01-15')
time_slice_glodapv1 = slice('1990-01-15', '2001-01-15')
time_slice_Cant_v1pGruber2019 = slice('2007-01-15', '2008-01-15')
cesm_fields = dict(
Cant=time_slice_glodapv2,
Cant_v1=time_slice_glodapv1,
Cant_v1pGruber2019=time_slice_Cant_v1pGruber2019,
ALK=time_slice_glodapv2,
pCFC11=time_slice_glodapv1,
pCFC12=time_slice_glodapv1,
Del14C=time_slice_glodapv1,
)
ds_cesm = {}
for variable, time_slice in cesm_fields.items():
xp_func = xp.persist_ds(cu.read_CESM_var, name=f'{variable}', trust_cache=True)
ds_cesm[variable] = xp_func(
time_slice,
variable,
mean_dims=['member_id', 'time'],
)
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/Cant.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/Cant_v1.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/Cant_v1pGruber2019.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/ALK.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/pCFC11.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/pCFC12.nc
assuming cache is correct
reading cached file: /glade/p/cgd/oce/projects/cesm2-marbl/xpersist_cache/3d_fields/Del14C.nc
After Compute, Spin Down Cluster¶
client.close()
cluster.close()
del client
del cluster
ds_cesm.keys()
dict_keys(['Cant', 'Cant_v1', 'Cant_v1pGruber2019', 'ALK', 'pCFC11', 'pCFC12', 'Del14C'])
grid = pop_tools.get_grid('POP_gx1v7')
vol = grid.dz * grid.TAREA * 1e-6
vol = vol.where(mask2d > 0).fillna(0.)
vol = vol.drop(['z_t'])
Compute global inventories of Cant¶
ds = glodap.open_glodap('GLODAPv2.2016b_MappedClimatologies')
ds.Cant.isel(depth=0).plot()
<matplotlib.collections.QuadMesh at 0x2b065cb6d490>

mmol_to_PgC = 12. * 1e-3 * 1e-15
products = ['GLODAPv2.2016b_MappedClimatologies', 'GLODAPv1', 'GLODAPv1+Gruber2019']
product_short_names = {
'GLODAPv2.2016b_MappedClimatologies': 'GLODAPv2',
'GLODAPv1': 'GLODAPv1',
'GLODAPv1+Gruber2019': 'Gruber et al. (2019)',
}
µmolkg_to_mmolm3 = 1026. * 1e-3
lines = []
for product in products:
if product == 'GLODAPv1':
v = 'Cant_v1'
elif product == 'GLODAPv1+Gruber2019':
v = 'Cant_v1pGruber2019'
else:
v = 'Cant'
entry = dict(product=product_short_names[product])
# compute on native grid
ds = glodap.open_glodap(product)
masked_vol = ds.dz.drop('depth') * ds.area * ds[v].notnull().drop('depth')
var = ds[v].where(ds[v] > 0.).fillna(0.).drop('depth')
inv = (var * µmolkg_to_mmolm3 * masked_vol).sum().values * mmol_to_PgC
entry['Obs (native)'] = inv
# compute on POP grid
ds = glodap.open_glodap_pop_grid(product)
masked_vol = vol * ds[v].notnull().drop(['z_t'])
pop_mask = masked_vol
var = ds[v].where(ds[v] > 0.).fillna(0.).drop(['z_t'])
inv = (var * µmolkg_to_mmolm3 * masked_vol).sum().values * mmol_to_PgC
entry['Obs (POP)'] = inv
# compute model inventories
var = ds_cesm[v][v].where(ds_cesm[v][v] > 0.).fillna(0.).drop(['z_t'])
inv = (var * pop_mask).sum().values * mmol_to_PgC
entry['CESM (obs-mask)'] = inv
inv = (var * vol).sum().values * mmol_to_PgC
entry['CESM'] = inv
lines.append(entry)
df = pd.DataFrame(lines).set_index('product')
df
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv2.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv1.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
exists: /glade/work/mgrover/adhoc-regridding/POP_gx1v7.nc
exists: /glade/work/mgrover/adhoc-regridding/latlon_glodapv1.nc
source grid dims: (180, 360)
destination grid dims: (384, 320)
Obs (native) | Obs (POP) | CESM (obs-mask) | CESM | |
---|---|---|---|---|
product | ||||
GLODAPv2 | 166.290771 | 166.756835 | 101.532239 | 103.764172 |
GLODAPv1 | 107.141279 | 107.787029 | 84.708898 | 90.440270 |
Gruber et al. (2019) | 135.269590 | 137.383126 | 106.488575 | 114.485979 |
[v for v in ds_za.data_vars if 'Gruber' in v]
ds_tmp = xr.merge([ds for ds in ds_cesm.values()])
ds_tmp = utils.zonal_mean_via_fortran(ds_tmp,
','.join(ds_cesm.keys()), grid='POP_gx1v7',
region_mask=mask2d)
ds_tmp['z_t'] = ds_za.z_t
ds_za = xr.merge((ds_tmp, ds_za))
for v in ['pCFC11', 'pCFC12', 'Cant', 'Cant_v1', 'Cant_v1pGruber2019', 'Del14C']:
ds_za[f'{v}_bias'] = ds_za[v] - ds_za[f'{v}_obs']
ds_za
za ran successfully, writing netcdf output
<xarray.Dataset> Dimensions: (basins: 4, lat_t: 394, lat_t_edges: 395, z_t: 60) Coordinates: * basins (basins) object 'Global' ... 'Indian Ocean' * lat_t (lat_t) float32 -79.22 -78.69 -78.15 ... 89.37 89.9 * lat_t_edges (lat_t_edges) float32 -79.49 -78.95 ... 89.64 90.0 * z_t (z_t) float64 500.0 1.5e+03 ... 5.125e+05 5.375e+05 Data variables: (12/20) Cant (basins, z_t, lat_t) float32 nan nan ... nan nan Cant_v1 (basins, z_t, lat_t) float32 nan nan ... nan nan Cant_v1pGruber2019 (basins, z_t, lat_t) float32 nan nan ... nan nan ALK (basins, z_t, lat_t) float32 nan nan ... nan nan pCFC11 (basins, z_t, lat_t) float32 nan nan ... nan nan pCFC12 (basins, z_t, lat_t) float32 nan nan ... nan nan ... ... pCFC11_bias (basins, z_t, lat_t) float64 nan nan ... nan nan pCFC12_bias (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_bias (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_v1_bias (basins, z_t, lat_t) float64 nan nan ... nan nan Cant_v1pGruber2019_bias (basins, z_t, lat_t) float64 nan nan ... nan nan Del14C_bias (basins, z_t, lat_t) float64 nan nan ... nan nan
xarray.Dataset
- basins: 4
- lat_t: 394
- lat_t_edges: 395
- z_t: 60
- basins(basins)object'Global' ... 'Indian Ocean'
array(['Global', 'Atlantic Ocean', 'Pacific Ocean', 'Indian Ocean'], dtype=object)
- lat_t(lat_t)float32-79.22 -78.69 -78.15 ... 89.37 89.9
- long_name :
- Latitude Cell Centers
- units :
- degrees_north
- edges :
- lat_t_edges
array([-79.22052 , -78.68631 , -78.15209 , ..., 88.836334, 89.370575, 89.904816], dtype=float32)
- lat_t_edges(lat_t_edges)float32-79.49 -78.95 -78.42 ... 89.64 90.0
array([-79.48714 , -78.952896, -78.418655, ..., 89.103455, 89.637695, 90. ], dtype=float32)
- z_t(z_t)float64500.0 1.5e+03 ... 5.375e+05
- units :
- cm
- long_name :
- depth from surface to midpoint of layer
- positive :
- down
array([5.000000e+02, 1.500000e+03, 2.500000e+03, 3.500000e+03, 4.500000e+03, 5.500000e+03, 6.500000e+03, 7.500000e+03, 8.500000e+03, 9.500000e+03, 1.050000e+04, 1.150000e+04, 1.250000e+04, 1.350000e+04, 1.450000e+04, 1.550000e+04, 1.650984e+04, 1.754790e+04, 1.862913e+04, 1.976603e+04, 2.097114e+04, 2.225783e+04, 2.364088e+04, 2.513702e+04, 2.676542e+04, 2.854837e+04, 3.051192e+04, 3.268680e+04, 3.510935e+04, 3.782276e+04, 4.087847e+04, 4.433777e+04, 4.827367e+04, 5.277280e+04, 5.793729e+04, 6.388626e+04, 7.075633e+04, 7.870025e+04, 8.788252e+04, 9.847059e+04, 1.106204e+05, 1.244567e+05, 1.400497e+05, 1.573946e+05, 1.764003e+05, 1.968944e+05, 2.186457e+05, 2.413972e+05, 2.649001e+05, 2.889385e+05, 3.133405e+05, 3.379794e+05, 3.627670e+05, 3.876452e+05, 4.125768e+05, 4.375393e+05, 4.625190e+05, 4.875083e+05, 5.125028e+05, 5.375000e+05])
- Cant(basins, z_t, lat_t)float32...
- long_name :
- Anthropogenic CO$_2$
- units :
- mmol/m^3
- grid_loc :
- 3111
- cell_methods :
- time: mean
array([[[ nan, nan, ..., 35.54513 , 35.566673], [ nan, nan, ..., 35.521404, 35.54196 ], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 35.54513 , 35.566673], [ nan, nan, ..., 35.521404, 35.54196 ], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- Cant_v1(basins, z_t, lat_t)float32...
- long_name :
- Anthropogenic CO$_2$
- units :
- mmol/m^3
- grid_loc :
- 3111
- cell_methods :
- time: mean
array([[[ nan, nan, ..., 30.320127, 30.347637], [ nan, nan, ..., 30.308672, 30.335844], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 30.320127, 30.347637], [ nan, nan, ..., 30.308672, 30.335844], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- Cant_v1pGruber2019(basins, z_t, lat_t)float32...
- long_name :
- Anthropogenic CO$_2$
- units :
- mmol/m^3
- grid_loc :
- 3111
- cell_methods :
- time: mean
array([[[ nan, nan, ..., 39.53727, 39.56421], [ nan, nan, ..., 39.51763, 39.54364], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 39.53727, 39.56421], [ nan, nan, ..., 39.51763, 39.54364], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- ALK(basins, z_t, lat_t)float32...
- long_name :
- Alkalinity
- units :
- meq/m^3
- grid_loc :
- 3111
- cell_methods :
- time: mean
array([[[ nan, nan, ..., 2183.586 , 2182.9753], [ nan, nan, ..., 2186.9585, 2186.4329], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 2183.586 , 2182.9753], [ nan, nan, ..., 2186.9585, 2186.4329], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- pCFC11(basins, z_t, lat_t)float32...
- long_name :
- pCFC-11
- units :
- patm
array([[[ nan, nan, ..., 220.70512, 220.97702], [ nan, nan, ..., 220.58131, 220.84933], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 220.70512, 220.97702], [ nan, nan, ..., 220.58131, 220.84933], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- pCFC12(basins, z_t, lat_t)float32...
- long_name :
- pCFC-12
- units :
- patm
array([[[ nan, nan, ..., 427.85675, 428.42303], [ nan, nan, ..., 427.57755, 428.1357 ], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 427.85675, 428.42303], [ nan, nan, ..., 427.57755, 428.1357 ], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- Del14C(basins, z_t, lat_t)float32...
- long_name :
- $\Delta^{14}$C
- units :
- permille
- grid_loc :
- 3111
- cell_methods :
- time: mean
array([[[ nan, nan, ..., 39.14853 , 39.26028 ], [ nan, nan, ..., 39.03216 , 39.141552], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., 39.14853 , 39.26028 ], [ nan, nan, ..., 39.03216 , 39.141552], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]], [[ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan], ..., [ nan, nan, ..., nan, nan], [ nan, nan, ..., nan, nan]]], dtype=float32)
- pCFC11_obs(basins, z_t, lat_t)float64nan nan 215.6 216.1 ... nan nan nan
- long_name :
- pCFC-11
- units :
- patm
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- pCFC12_obs(basins, z_t, lat_t)float64nan nan 415.1 418.3 ... nan nan nan
- long_name :
- pCFC-12
- units :
- patm
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- Del14C_obs(basins, z_t, lat_t)float64nan nan -23.11 ... nan nan nan
- long_name :
- $^{14}$C
- units :
- permille
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- Cant_v1_obs(basins, z_t, lat_t)float64nan nan 26.13 26.78 ... nan nan nan
- units :
- mmol m$^{-3}$
array([[[ nan, nan, 26.12513246, ..., nan, nan, nan], [ nan, nan, 25.70800719, ..., nan, nan, nan], [ nan, nan, 24.34805168, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 21.60995085, ..., nan, nan, nan], [ nan, nan, 21.07229263, ..., nan, nan, nan], [ nan, nan, 20.36618903, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_obs(basins, z_t, lat_t)float64nan nan 34.09 35.43 ... nan nan nan
- long_name :
- moles of anthropogenic carbon content per unit mass in seawater
- units :
- mmol m$^{-3}$
- Description :
- The GLODAPv2.2016b input data were normalized to the year 2002 using anthropogenic carbon calculated with the TTD method prior to mapping.
- time_period :
- For all surfaces (1-33) data from the years 1972-2013 inclusive have been used for mapping
array([[[ nan, nan, 34.0910502 , ..., 34.48518809, 34.91430343, 34.78505587], [ nan, nan, 34.57719095, ..., 34.14557923, 34.54970547, 34.6049128 ], [ nan, nan, 34.764624 , ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 34.1793056 , ..., 34.48518809, 34.91430343, 34.78505587], [ nan, nan, 35.26896139, ..., 34.14557923, 34.54970547, 34.6049128 ], [ nan, nan, 36.17607756, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- ALK_obs(basins, z_t, lat_t)float64nan nan 2.382e+03 ... nan nan nan
- long_name :
- seawater alkalinity expressed as mole equivalent per unit mass
- units :
- mmol m$^{-3}$
- time_period :
- For all surfaces (1-33) data from the years 1972-2013 inclusive have been used for mapping
array([[[ nan, nan, 2381.6453554 , ..., 2269.73092531, 2263.24456873, 2254.22085007], [ nan, nan, 2380.61858496, ..., 2265.18994051, 2258.4005919 , 2240.64319504], [ nan, nan, 2377.26557354, ..., 2278.74346011, 2272.55519948, 2289.42073359], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 2397.06338312, ..., 2269.73092531, 2263.24456873, 2254.22085007], [ nan, nan, 2396.89977785, ..., 2265.18994051, 2258.4005919 , 2240.64319504], [ nan, nan, 2392.69994515, ..., 2278.74346011, 2272.55519948, 2289.42073359], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_v1pGruber2019_obs(basins, z_t, lat_t)float64nan nan 31.68 31.78 ... nan nan nan
array([[[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]], [[nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan], ..., [nan, nan, ..., nan, nan], [nan, nan, ..., nan, nan]]])
- pCFC11_bias(basins, z_t, lat_t)float64nan nan -11.27 ... nan nan nan
array([[[ nan, nan, -11.2694527 , ..., nan, nan, nan], [ nan, nan, -10.69744663, ..., nan, nan, nan], [ nan, nan, -4.80728823, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, -13.14674279, ..., nan, nan, nan], [ nan, nan, -10.07194482, ..., nan, nan, nan], [ nan, nan, -1.2958076 , ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- pCFC12_bias(basins, z_t, lat_t)float64nan nan -16.48 ... nan nan nan
array([[[ nan, nan, -16.48129185, ..., nan, nan, nan], [ nan, nan, -12.2954294 , ..., nan, nan, nan], [ nan, nan, -7.70736349, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, -9.87846678, ..., nan, nan, nan], [ nan, nan, -3.54449369, ..., nan, nan, nan], [ nan, nan, 7.9565601 , ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_bias(basins, z_t, lat_t)float64nan nan -3.921 ... nan nan nan
array([[[ nan, nan, -3.92079072, ..., 1.06707707, 0.63082825, 0.78161741], [ nan, nan, -4.52722032, ..., 1.38435088, 0.9716988 , 0.93704887], [ nan, nan, -4.94679296, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, -4.73661189, ..., 1.06707707, 0.63082825, 0.78161741], [ nan, nan, -5.92943998, ..., 1.38435088, 0.9716988 , 0.93704887], [ nan, nan, -7.00083418, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_v1_bias(basins, z_t, lat_t)float64nan nan -0.1748 ... nan nan nan
array([[[ nan, nan, -0.17477884, ..., nan, nan, nan], [ nan, nan, 0.15579858, ..., nan, nan, nan], [ nan, nan, 1.33462464, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 3.45538347, ..., nan, nan, nan], [ nan, nan, 3.93491524, ..., nan, nan, nan], [ nan, nan, 4.54925821, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Cant_v1pGruber2019_bias(basins, z_t, lat_t)float64nan nan 1.862 ... nan nan nan
array([[[ nan, nan, 1.86200929, ..., nan, nan, nan], [ nan, nan, 2.29099521, ..., nan, nan, nan], [ nan, nan, 2.73112081, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, 0.36020017, ..., nan, nan, nan], [ nan, nan, 0.35919793, ..., nan, nan, nan], [ nan, nan, 0.49685681, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
- Del14C_bias(basins, z_t, lat_t)float64nan nan -16.61 ... nan nan nan
array([[[ nan, nan, -16.61321794, ..., nan, nan, nan], [ nan, nan, -31.65999991, ..., nan, nan, nan], [ nan, nan, -19.59671795, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, -3.98522353, ..., nan, nan, nan], [ nan, nan, -30.5694628 , ..., nan, nan, nan], [ nan, nan, -22.73869959, ..., nan, nan, nan], ... [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]], [[ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], ..., [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan], [ nan, nan, nan, ..., nan, nan, nan]]])
ds_za.Cant.isel(basins=0).plot()
<matplotlib.collections.QuadMesh at 0x2ac45592ca50>

import plot
levels = dict(
Cant=np.arange(0, 63, 3),
Cant_v1=np.arange(0, 63, 3),
Cant_v1pGruber2019=np.arange(0, 63, 3),
pCFC11=np.arange(0, 310, 10),
pCFC12=np.arange(0, 520, 20),
Del14C=np.arange(-300, 120, 20),
ALK=np.arange(1800, 2600, 200),
)
levels_bias = dict(
Cant=np.arange(-24, 27, 3),
Cant_v1=np.arange(-24, 27, 3),
Cant_v1pGruber2019=np.arange(-24, 27, 3),
pCFC11=np.arange(-80, 90, 10),
pCFC12=np.arange(-300, 320, 20),
Del14C=np.arange(-120, 130, 10),
)
for field in ['Del14C', 'Cant', 'Cant_v1', 'Cant_v1pGruber2019', 'pCFC11', 'pCFC12',]:
glodap_str = (
'GLODAPv2' if field == 'Cant' else
'GLODAP (2007)' if field == 'Cant_v1pGruber2019'
else 'GLODAPv1'
)
plot.za_obs_comparison(
ds_za,
field=field,
levels=levels[field],
levels_bias=levels_bias[field],
col_name=['CESM2', glodap_str, 'bias'],
)
utils.savefig(f'za-obs-comparison-{field}.pdf')





