import xarray as xr
import xgcm
import numpy as np
import xroms
import matplotlib.pyplot as plt
Matplotlib is building the font cache; this may take a moment.

How to calculate with xarray and xroms#

Here we demonstrate a number of calculations built into xroms, through accessors to DataArrays and Datasets.

xarray Datasets#

Use an xarray accessor in xroms to easily perform calculations with syntax

ds.xroms.[method]

Importantly, the xroms accessor to a Dataset is initialized with an xgcm grid object (or you can input a previously-calculated grid object), stored at ds.xroms.xgrid, which is used to perform the basic grid calculations. More on this under “How to set up grid” below.

The built-in native calculations are properties of the xroms accessor and are not functions.

The accessor functions can take in the horizontal then vertical grid label you want the calculation to be on as options:

ds.xroms.ddz('u', hcoord='rho', scoord='s_rho')  # to make sure result is on rho horizontal grid and s_rho vertical grid, a function

or

ds.xroms.dudz  # return on native grid it is calculated on, a property

Other inputs are available for functions when the calculation involves a derivative and there is a choice for how to treat the boundary (hboundary and hfill_value for horizontal calculations and sboundary and sfill_value for vertical calculations). More information on those inputs can be found in the docs for xgcm such as under found under:

ds.xroms.xgrid.interp?

xarray DataArrays#

A few of the more basic methods in xroms are available to DataArrays too. xroms methods for DataArrays require the grid object to be input:

ds.temp.xroms.to_grid(xgrid, hcoord='psi', scoord='s_w')

Attributes#

xroms provides attributes as metadata to track calculations, provide context, and to be used as indicators for plots.

The option to always keep attributes in xarray is turned on in the call to xroms.

cf-xarray#

Some functionality is added by using the package cf-xarray. Necessary attributes are added to datasets when the following call is run:

ds, xgrid = xroms.roms_dataset(ds)

For example, when all CF Convention attributes are available in the Dataset, you can refer to dimensions and coordinates generically, regardless of the actual variable names.

  • For dimensions:

    • ds.cf[“T”], ds.cf[“Z”], ds.cf[“Y”], ds.cf[“X”]

  • For coordinates:

    • ds.cf[“time], ds.cf[“vertical”], ds.cf[“latitude”], ds.cf[“longitude”]

Load in data#

More information on input/output in input/output page. For model output available at , you can find your dataset with and chunks according to the dataset itself (though if none are known by the dataset this will use no chunks):

ds = xr.open_dataset(url, chunks={})

Also, an example ROMS dataset is available with xroms that we will read in for this tutorial.

ds = xroms.datasets.fetch_ROMS_example_full_grid()
ds
Downloading file 'ROMS_example_full_grid.nc' from 'https://github.com/xoceanmodel/xroms/raw/main/xroms/data/ROMS_example_full_grid.nc' to '/home/docs/.cache/xroms'.
<xarray.Dataset> Size: 62MB
Dimensions:     (eta_rho: 191, xi_rho: 300, s_rho: 30, s_w: 31, ocean_time: 2,
                 eta_u: 191, xi_u: 299, eta_v: 190, xi_v: 300)
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
    lon_u       (eta_u, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
    lat_u       (eta_u, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
    lon_v       (eta_v, xi_v) float64 456kB dask.array<chunksize=(190, 300), meta=np.ndarray>
    lat_v       (eta_v, xi_v) float64 456kB dask.array<chunksize=(190, 300), meta=np.ndarray>
Dimensions without coordinates: eta_rho, xi_rho, eta_u, xi_u, eta_v, xi_v
Data variables: (12/17)
    angle       (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    hc          float64 8B ...
    Cs_r        (s_rho) float64 240B dask.array<chunksize=(30,), meta=np.ndarray>
    zeta        (ocean_time, eta_rho, xi_rho) float32 458kB dask.array<chunksize=(2, 191, 300), meta=np.ndarray>
    h           (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    Cs_w        (s_w) float64 248B dask.array<chunksize=(31,), meta=np.ndarray>
    ...          ...
    temp        (ocean_time, s_rho, eta_rho, xi_rho) float32 14MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
    salt        (ocean_time, s_rho, eta_rho, xi_rho) float32 14MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
    Vtransform  int32 4B ...
    pm          (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    pn          (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    f           (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
Attributes: (12/29)
    file:              ocean_his_0150.nc
    format:            netCDF-3 classic file
    Conventions:       CF-1.4
    type:              ROMS/TOMS history file
    title:             Texas and Louisiana Shelf case (Nesting)
    rst_file:          ocean_rst.nc
    ...                ...
    compiler_command:  /g/software/openmpi/1.4.3/intel/bin/mpif90
    compiler_flags:    -heap-arrays -fp-model precise -assume 2underscores -c...
    tiling:            016x032
    history:           ROMS/TOMS, Version 3.4, Sunday - December 4, 2011 -  7...
    ana_file:          /scratch/zhangxq/projects/txla_nesting6/Functionals/an...
    CPP_options:       TXLA, ANA_BSFLUX, ANA_BTFLUX, ASSUMED_SHAPE, BULK_FLUX...
ds, xgrid = xroms.roms_dataset(ds, include_cell_volume=True)
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
# add grid to xrom accessor explicitly
ds.xroms.set_grid(xgrid)
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
ds.xroms.xgrid
<xgcm.Grid>
X Axis (not periodic, boundary=None):
  * center   xi_rho --> inner
  * inner    xi_u --> center
Y Axis (not periodic, boundary=None):
  * center   eta_rho --> inner
  * inner    eta_v --> center
Z Axis (not periodic, boundary=None):
  * center   s_rho --> outer
  * outer    s_w --> center

xgcm grid and extra ROMS coordinates#

How to set up grid#

The package xcgm has many nice grid functions for ROMS users, however, a bit of set up is required to connect from ROMS to the xgcm standardds. This grid set up does that.

The grid object contains metrics (X, Y, Z) with distances for each grid (‘dx’, ‘dx_u’, ‘dx_v’, ‘dx_psi’, and ‘dz’, ‘dz_u’, ‘dz_v’, ‘dz_w’, ‘dz_w_u’, ‘dz_w_v’, ‘dz_psi’, ‘dz_w_psi’), and all of these as grid coordinates too.

After setting up your Dataset, you should add coordinates and other information to the dataset and set up an xgcm grid object with:

ds, xgrid = xroms.roms_dataset(ds, include_cell_volume=True)

If you want to use the xroms accessor, add the grid object explicitly with:

ds.xroms.set_grid(xgrid)

If you don’t do this step, the first time the grid object is required it will be set up, though you can’t choose which input flags to use in that case.

The xgcm grid object is then available at

ds.xroms.xgrid

Grid lengths#

Distances between grid nodes on every ROMS grid can be calculated and set up in the xgcm grid object — some by default and some have to be requested by the user with optional flags.

  • Horizontal grids:

  • inverse distances between nodes are given in an analogous way to distance (i.e., ds.pm and ds.pn_psi)

  • distances between nodes are given in meters by dx’s and dy’s stored in ds, such as: ds.dx for the rho grid and ds.dy_psi for the psi grid, calculated from inverse distances

  • Vertical grids:

  • There are lazily-evaluated z-coordinates for both rho and w vertical grids for each horizontal grid.

  • There are also arrays of z distances between nodes, called dz’s, available for each combination of grids. For example, there is ds.dz_u for z distances on the u horizontal and rho vertical grid, and there is ds.dz_w_v for z distances on the v horizontal and w vertical grid. These are [ocean_time x s_* x eta_* x xi_*] arrays.

  • Arrays of z distances relative to a sea level of 0 are also available. They have analogous names to the previous entries but with “0” on the end. They are computationally faster to use because they do not vary in time. They are also less accurate for this reason but it depends on your use as to how much that matters.

Grid areas#

  • Horizontal

    • rho grid ds.dA, psi grid ds.dA_psi, u grid ds.dA_u, v grid ds.dA_v

  • Vertical

    • These aren’t built in but can easily be calculated. For example, for cell areas in the x direction on the rho horizontal and rho vertical grids: ds.dx * ds.dz.

Grid volumes#

Time varying: All 8 combinations of 4 horizontal grids and 2 vertical grids are available if include_cell_volume==True in roms_dataset(), such as: ds.dV (rho horizontal, rho vertical), and ds.dV_w_v (w vertical, v horizontal).

A user can easily calculate the same but for time-constant dz’s, for example as:

ds['dV_w'] = ds.dx * ds.dy * ds.dz_w0  # w vertical, rho horizontal, constant in time

You can calculate the full domain volume in time with:

ds.dV.sum(('s_rho', 'eta_rho', 'xi_rho'))

Or, using cf-xarray with:

ds.dV.cf.sum(('Z', 'Y', 'X'))
ds.dV.cf.sum(('Z', 'Y', 'X'))  # with cf-xarray accessor
<xarray.DataArray 'dV' (ocean_time: 2)> Size: 16B
dask.array<sum-aggregate, shape=(2,), dtype=float64, chunksize=(2,), chunktype=numpy.ndarray>
Coordinates:
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
Attributes:
    long_name:  volume metric in XI and ETA and S on RHO/RHO grids
    units:      meter3
    field:      dV, scalar

Change grids#

A ROMS user frequently needs to move between horizontal and vertical grids, so it is built into many of the function wrappers, but you can also do it as a separate function. It can also be done directly to Datasets with the xroms accessor. Here we change salinity from its default grids to be on the psi grid horizontally and the s_w grid vertically:

ds.xroms.to_grid('salt', 'psi', 's_w')

You can also use the xroms function directly instead of using the xarray accessor if you prefer to have more options. Here is the equivalent call to the accessor, using the same defaults:

xroms.to_grid(ds["salt"], xgrid,
              hcoord="psi", scoord="s_w",
              hboundary="extend", hfill_value=None,
              sboundary="extend", sfill_value=None)
ds.xroms.to_grid('salt', 'psi', 's_w')
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'salt' (ocean_time: 2, s_w: 31, eta_v: 190, xi_u: 299)> Size: 14MB
dask.array<transpose, shape=(2, 31, 190, 299), dtype=float32, chunksize=(2, 31, 190, 299), chunktype=numpy.ndarray>
Coordinates:
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_u        (xi_u) int64 2kB 0 1 2 3 4 5 6 7 ... 292 293 294 295 296 297 298
  * eta_v       (eta_v) int64 2kB 0 1 2 3 4 5 6 ... 183 184 185 186 187 188 189
    z_w_psi     (ocean_time, s_w, eta_v, xi_u) float64 28MB dask.array<chunksize=(2, 31, 190, 299), meta=np.ndarray>
Attributes:
    long_name:  salinity
    time:       ocean_time
    field:      salinity, scalar, series
    name:       salt
    units:      units

Dimension ordering convention#

By convention, ROMS DataArrays should be in the order [‘T’, ‘Z’, ‘Y’, ‘X’], for however many of these dimensions they contain. The following function does this for you:

xroms.order(ds.temp);  # function call

ds.temp.xroms.order();  # accessor
ds.temp.xroms.order()  # accessor
<xarray.DataArray 'temp' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 14MB
dask.array<open_dataset-temp, shape=(2, 30, 191, 300), dtype=float32, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  potential temperature
    units:      Celsius
    time:       ocean_time
    field:      temperature, scalar, series

Basic computations#

These are all functions, not properties.

xarray#

Many computations are built into xarray itself. Often it is possible to input the dimension over which to perform a computation by name, such as:

arr.sum(dim="xi_rho")

or

arr.sum(dim=("xi_rho","eta_rho"))

Note that many basic xarray calculations should be used with caution when using with ROMS output, since a ROMS grid can be stretched both horizontally and vertically. When using these functions, consider if your calculation should account for variable grid cell distances, areas, or volumes. Additionally, it is straight-forward to use basic grid functions from xarray on a ROMS time dimension (resampling, differentiation, interpolation, etc), however, be careful before using these functions on spatial dimensions for the same reasons as before.

ds.salt.mean(dim=("xi_rho","eta_rho"))

# same call but using cf-xarray
ds.salt.cf.mean(("Y","X"))
ds.salt.cf.mean(("Y","X"))
<xarray.DataArray 'salt' (ocean_time: 2, s_rho: 30)> Size: 240B
dask.array<mean_agg-aggregate, shape=(2, 30), dtype=float32, chunksize=(2, 30), chunktype=numpy.ndarray>
Coordinates:
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
Attributes:
    long_name:  salinity
    time:       ocean_time
    field:      salinity, scalar, series

xroms grid-based metrics#

Spatial metrics that account for the variable grid cell sizing in ROMS (both curvilinear horizontal and s vertical) are available by wrapping xgcm functions. These also have the additional benefit that the user can change grids and attributes are tracked. The available functions are:

  • gridsum

  • gridmean

Example usage:

xroms.gridsum(ds.temp, xgrid, dim)  # function call

ds['temp'].xroms.gridsum(xgrid, dim)  # accessor

where dimension names in the xgcm convention are ‘Z’, ‘Y’, or ‘X’. dim can be a string, list, or tuple of combinations of these names for dimensions to average over.

sum#
uint = ds.u.xroms.gridsum(xgrid, "Z")
uint.xroms.gridsum(xgrid, 'Y')
<xarray.DataArray (ocean_time: 2, xi_u: 299)> Size: 5kB
dask.array<sum-aggregate, shape=(2, 299), dtype=float64, chunksize=(2, 299), chunktype=numpy.ndarray>
Coordinates:
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_u        (xi_u) int64 2kB 0 1 2 3 4 5 6 7 ... 292 293 294 295 296 297 298
Attributes:
    long_name:  u-momentum component
    units:      meter second-1
    time:       ocean_time
    field:      u-velocity, scalar, series
mean#
vint = ds.v.xroms.gridmean(xgrid, "Z")
vint.xroms.gridmean(xgrid, "Y")
<xarray.DataArray 'v' (ocean_time: 2, xi_rho: 300)> Size: 5kB
dask.array<truediv, shape=(2, 300), dtype=float64, chunksize=(2, 300), chunktype=numpy.ndarray>
Coordinates:
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
Attributes:
    long_name:  v-momentum component
    units:      meter second-1
    time:       ocean_time
    field:      v-velocity, scalar, series

Derivatives#

Vertical#

Syntax is:

ds.xroms.ddz("salt")  # accessor to dataset

xroms.ddz(ds.salt, xgrid)  # No accessor

Other options:

ds.xroms.ddz('salt', hcoord='psi', scoord='s_rho', sboundary='extend', sfill_value=np.nan);  # Dataset

xroms.ddz(ds.salt, xgrid, hcoord='psi', scoord='s_rho', sboundary='extend', sfill_value=np.nan);  # No accessor
ds.xroms.ddz('salt')  # Dataset
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'dsaltdz' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<truediv, shape=(2, 31, 191, 300), dtype=float64, chunksize=(2, 31, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w         (ocean_time, s_w, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  vertical derivative of salinity
    time:       ocean_time
    field:      salinity, scalar, series
    name:       dsaltdz
    units:      1/m * units

Horizontal#

Syntax:

ds.xroms.ddxi('u');  # horizontal xi-direction gradient (accessor)

ds.xroms.ddeta('u');  #  horizontal eta-direction gradient (accessor)

dtempdxi, dtempdeta = xroms.hgrad(ds.temp, xgrid)  # both gradients simultaneously, as function

xroms.ddxi(ds.temp, xgrid)  # individual derivative, as function

xroms.ddeta(ds.temp, xgrid)  # individual derivative, as function
ds.xroms.ddxi('u')  # horizontal xi-direction gradient
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'dudxi' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<sub, shape=(2, 31, 191, 300), dtype=float64, chunksize=(2, 31, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w         (ocean_time, s_w, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  horizontal xi derivative of u-momentum component
    units:      1/m * meter second-1
    time:       ocean_time
    field:      u-velocity, scalar, series
    name:       dudxi

Time#

Use xarray directly for this.

ddt = ds.differentiate('ocean_time', datetime_unit='s')
ddt
<xarray.Dataset> Size: 734MB
Dimensions:     (eta_rho: 191, xi_rho: 300, s_rho: 30, s_w: 31, ocean_time: 2,
                 xi_u: 299, eta_v: 190)
Coordinates: (12/21)
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
    lon_u       (eta_rho, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
    ...          ...
    z_w_v       (ocean_time, s_w, eta_v, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 190, 300), meta=np.ndarray>
    z_w_psi     (ocean_time, s_w, eta_v, xi_u) float64 28MB dask.array<chunksize=(2, 31, 190, 299), meta=np.ndarray>
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
    z_rho_u     (ocean_time, s_rho, eta_rho, xi_u) float64 27MB dask.array<chunksize=(2, 30, 191, 299), meta=np.ndarray>
    z_rho_v     (ocean_time, s_rho, eta_v, xi_rho) float64 27MB dask.array<chunksize=(2, 30, 190, 300), meta=np.ndarray>
    z_rho_psi   (ocean_time, s_rho, eta_v, xi_u) float64 27MB dask.array<chunksize=(2, 30, 190, 299), meta=np.ndarray>
Data variables: (12/45)
    angle       (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    hc          float64 8B ...
    Cs_r        (s_rho) float64 240B dask.array<chunksize=(30,), meta=np.ndarray>
    zeta        (ocean_time, eta_rho, xi_rho) float32 458kB dask.array<chunksize=(2, 191, 300), meta=np.ndarray>
    h           (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    Cs_w        (s_w) float64 248B dask.array<chunksize=(31,), meta=np.ndarray>
    ...          ...
    dV_w_u      (ocean_time, s_w, eta_rho, xi_u) float64 28MB dask.array<chunksize=(2, 31, 191, 299), meta=np.ndarray>
    dV_v        (ocean_time, s_rho, eta_v, xi_rho) float64 27MB dask.array<chunksize=(2, 30, 190, 300), meta=np.ndarray>
    dV_w_v      (ocean_time, s_w, eta_v, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 190, 300), meta=np.ndarray>
    dV_psi      (ocean_time, s_rho, eta_v, xi_u) float64 27MB dask.array<chunksize=(2, 30, 190, 299), meta=np.ndarray>
    dV_w_psi    (ocean_time, s_w, eta_v, xi_u) float64 28MB dask.array<chunksize=(2, 31, 190, 299), meta=np.ndarray>
    rho0        int64 8B 1025
Attributes: (12/29)
    file:              ocean_his_0150.nc
    format:            netCDF-3 classic file
    Conventions:       CF-1.4
    type:              ROMS/TOMS history file
    title:             Texas and Louisiana Shelf case (Nesting)
    rst_file:          ocean_rst.nc
    ...                ...
    compiler_command:  /g/software/openmpi/1.4.3/intel/bin/mpif90
    compiler_flags:    -heap-arrays -fp-model precise -assume 2underscores -c...
    tiling:            016x032
    history:           ROMS/TOMS, Version 3.4, Sunday - December 4, 2011 -  7...
    ana_file:          /scratch/zhangxq/projects/txla_nesting6/Functionals/an...
    CPP_options:       TXLA, ANA_BSFLUX, ANA_BTFLUX, ASSUMED_SHAPE, BULK_FLUX...

Built-in Physical Calculations#

These are all properties of the accessor, so should be called without (). Demonstrated below are the calculations using the accessor and not using the accessor.

Horizontal speed#

ds.xroms.speed  # accessor

xroms.speed(ds.u, ds.v, xgrid)  # function
ds.xroms.speed
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'speed' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 14MB
dask.array<sqrt, shape=(2, 30, 191, 300), dtype=float32, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  horizontal speed
    units:      m/s
    time:       ocean_time
    field:      u-velocity, scalar, series
    name:       speed

Kinetic energy#

ds.xroms.KE  # accessor

# without the accessor you need to manage this yourself — first calculate speed to then calculate KE
speed = xroms.speed(ds.u, ds.v, xgrid)
xroms.KE(ds.rho0, speed)
ds.xroms.KE
<xarray.DataArray 'KE' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<multiply, shape=(2, 30, 191, 300), dtype=float64, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    name:       KE
    long_name:  kinetic energy
    units:      kg/(m*s^2)

Geostrophic velocities#

ds.xroms.ug  # accessor, u component
ds.xroms.vg  # accessor, v component

ug, vg = xroms.uv_geostrophic(ds.zeta, ds.f, xgrid)  # function
ds.xroms.ug
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'ug' (ocean_time: 2, eta_rho: 191, xi_u: 299)> Size: 914kB
dask.array<truediv, shape=(2, 191, 299), dtype=float64, chunksize=(2, 191, 299), chunktype=numpy.ndarray>
Coordinates:
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
    lon_u       (eta_rho, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
    lat_u       (eta_rho, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
  * xi_u        (xi_u) int64 2kB 0 1 2 3 4 5 6 7 ... 292 293 294 295 296 297 298
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
Attributes:
    long_name:  geostrophic u velocity
    units:      m/s
    time:       ocean_time
    field:      free-surface, scalar, series
    name:       ug

Eddy kinetic energy (EKE)#

ds.xroms.EKE  # accessor

ug, vg = xroms.uv_geostrophic(ds.zeta, ds.f, xgrid)
xroms.EKE(ug, vg, xgrid)
ds.xroms.EKE
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'EKE' (ocean_time: 2, eta_rho: 191, xi_rho: 300)> Size: 917kB
dask.array<mul, shape=(2, 191, 300), dtype=float64, chunksize=(2, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
Attributes:
    long_name:  eddy kinetic energy
    units:      m^2/s^2
    time:       ocean_time
    field:      free-surface, scalar, series
    name:       EKE

Vertical shear#

Since it is a common use case, there are specific methods to return the u and v components of vertical shear on their own grids. These are just available for Datasets.

ds.xroms.dudz
ds.xroms.dvdz

xroms.dudz(ds.u, xgrid)
xroms.dvdz(ds.v, xgrid)

# already on same grid:
ds.xroms.vertical_shear

dudz = xroms.dudz(ds.u, xgrid)
dvdz = xroms.dvdz(ds.v, xgrid)
xroms.vertical_shear(dudz, dvdz, xgrid)
ds.xroms.dudz
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'dudz' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_u: 299)> Size: 28MB
dask.array<truediv, shape=(2, 31, 191, 299), dtype=float64, chunksize=(2, 31, 191, 299), chunktype=numpy.ndarray>
Coordinates:
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
    lon_u       (eta_rho, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
    lat_u       (eta_rho, xi_u) float64 457kB dask.array<chunksize=(191, 299), meta=np.ndarray>
  * xi_u        (xi_u) int64 2kB 0 1 2 3 4 5 6 7 ... 292 293 294 295 296 297 298
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w_u       (ocean_time, s_w, eta_rho, xi_u) float64 28MB dask.array<chunksize=(2, 31, 191, 299), meta=np.ndarray>
Attributes:
    name:       dudz
    long_name:  u component of vertical shear
    units:      1/s

The magnitude of the vertical shear is also a built-in derived variable for the xroms accessor:

ds.xroms.vertical_shear
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'shear' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<sqrt, shape=(2, 31, 191, 300), dtype=float64, chunksize=(2, 31, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w         (ocean_time, s_w, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 191, 300), meta=np.ndarray>
Attributes:
    name:       shear
    long_name:  vertical shear
    units:      1/s

Vertical vorticity#

ds.xroms.vort

xroms.relative_vorticity(ds.u, ds.v, xgrid)
ds.xroms.vort
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'vort' (ocean_time: 2, s_w: 31, eta_v: 190, xi_u: 299)> Size: 28MB
dask.array<sub, shape=(2, 31, 190, 299), dtype=float64, chunksize=(2, 31, 190, 299), chunktype=numpy.ndarray>
Coordinates:
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_u        (xi_u) int64 2kB 0 1 2 3 4 5 6 7 ... 292 293 294 295 296 297 298
  * eta_v       (eta_v) int64 2kB 0 1 2 3 4 5 6 ... 183 184 185 186 187 188 189
    z_w_psi     (ocean_time, s_w, eta_v, xi_u) float64 28MB dask.array<chunksize=(2, 31, 190, 299), meta=np.ndarray>
Attributes:
    long_name:  vertical component of vorticity
    units:      1/s
    time:       ocean_time
    field:      v-velocity, scalar, series
    name:       vort

Horizontal convergence#

Horizontal component of the currents convergence.

ds.xroms.convergence

xroms.convergence(ds.u, ds.v, xgrid)
ds.xroms.convergence
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'convergence' (ocean_time: 2, s_rho: 30, eta_rho: 191,
                                 xi_rho: 300)> Size: 28MB
dask.array<add, shape=(2, 30, 191, 300), dtype=float64, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  horizontal convergence
    units:      1/s
    time:       ocean_time
    field:      u-velocity, scalar, series
    name:       convergence

Normalized surface convergence#

Horizontal component of the currents convergence at the surface, normalized by $f$. This is only available through the accessor.

ds.xroms.convergence_norm
ds.xroms.convergence_norm
<xarray.DataArray 'convergence_norm' (ocean_time: 2, eta_rho: 191, xi_rho: 300)> Size: 917kB
dask.array<truediv, shape=(2, 191, 300), dtype=float64, chunksize=(2, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
Attributes:
    name:       convergence_norm
    long_name:  normalized surface horizontal convergence
    units:      

Ertel potential vorticity#

The accessor assumes you want the Ertel potential vorticity of the buoyancy:

ds.xroms.ertel

sig0 = xroms.potential_density(ds.temp, ds.salt)
buoyancy = xroms.buoyancy(sig0, rho0=ds.rho0)
xroms.ertel(buoyancy, ds.u, ds.v, ds.f, xgrid, scoord='s_w')

Alternatively, the user can access the original function and use a different tracer for this calculation (in this example, “dye_01”), and can return the result on a different vertical grid, for example:

xroms.ertel(ds.dye_01, ds.u, ds.v, ds.f, xgrid, scoord='s_w')
ds.xroms.ertel
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'ertel' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<add, shape=(2, 30, 191, 300), dtype=float64, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    name:       ertel
    long_name:  ertel potential vorticity
    units:      tracer/(m*s)

Density#

ds.xroms.rho

xroms.density(ds.temp, ds.salt)
ds.xroms.rho
<xarray.DataArray 'rho' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<truediv, shape=(2, 30, 191, 300), dtype=float64, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  density
    units:      kg/m^3
    time:       ocean_time
    field:      temperature, scalar, series
    name:       rho

Potential density#

ds.xroms.sig0

xroms.potential_density(ds.temp, ds.salt)
ds.xroms.sig0
<xarray.DataArray 'sig0' (ocean_time: 2, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 14MB
dask.array<truediv, shape=(2, 30, 191, 300), dtype=float32, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  potential density
    units:      kg/m^3
    time:       ocean_time
    field:      temperature, scalar, series
    name:       sig0

Buoyancy#

ds.xroms.buoyancy

sig0 = xroms.potential_density(ds.temp, ds.salt);
xroms.buoyancy(sig0)
ds.xroms.buoyancy
<xarray.DataArray 'buoyancy' (ocean_time: 2, s_rho: 30, eta_rho: 191,
                              xi_rho: 300)> Size: 28MB
dask.array<truediv, shape=(2, 30, 191, 300), dtype=float64, chunksize=(2, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_rho       (ocean_time, s_rho, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 30, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  buoyancy
    units:      m/s^2
    time:       ocean_time
    field:      temperature, scalar, series
    name:       buoyancy

Buoyancy frequency#

Also called vertical buoyancy gradient.

ds.xroms.N2

rho = xroms.density(ds.temp, ds.salt)  # calculate rho if not in output
xroms.N2(rho, xgrid)
ds.xroms.N2
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'N2' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<truediv, shape=(2, 31, 191, 300), dtype=float64, chunksize=(2, 31, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w         (ocean_time, s_w, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  buoyancy frequency squared, or vertical buoyancy gradient
    units:      1/s^2
    time:       ocean_time
    field:      temperature, scalar, series
    name:       N2

Horizontal buoyancy gradient#

ds.xroms.M2

rho = xroms.density(ds.temp, ds.salt)  # calculate rho if not in output
xroms.M2(rho, xgrid)
ds.xroms.M2
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid_ufunc.py:832: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  out_dim: grid._ds.dims[out_dim] for arg in out_core_dims for out_dim in arg
<xarray.DataArray 'M2' (ocean_time: 2, s_w: 31, eta_rho: 191, xi_rho: 300)> Size: 28MB
dask.array<truediv, shape=(2, 31, 191, 300), dtype=float64, chunksize=(2, 31, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_w         (s_w) float64 248B -1.0 -0.9667 -0.9333 ... -0.03333 0.0
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    z_w         (ocean_time, s_w, eta_rho, xi_rho) float64 28MB dask.array<chunksize=(2, 31, 191, 300), meta=np.ndarray>
Attributes:
    long_name:  horizontal buoyancy gradient
    units:      1/s^2
    time:       ocean_time
    field:      temperature, scalar, series
    name:       M2

Mixed layer depth#

This is not a property since the threshold is a parameter and needs to be input.

ds.xroms.mld(thresh=0.03)

sig0 = xroms.potential_density(ds.temp, ds.salt);
xroms.mld(sig0, xgrid, ds.h, ds.mask_rho, thresh=0.03)
ds.xroms.mld(thresh=0.03)
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid.py:989: FutureWarning: From version 0.8.0 the Axis computation methods will be removed, in favour of using the Grid computation methods instead. i.e. use `Grid.transform` instead of `Axis.transform`
  warnings.warn(
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xgcm/grid.py:989: FutureWarning: From version 0.8.0 the Axis computation methods will be removed, in favour of using the Grid computation methods instead. i.e. use `Grid.transform` instead of `Axis.transform`
  warnings.warn(
<xarray.DataArray 'mld' (ocean_time: 2, eta_rho: 191, xi_rho: 300)> Size: 917kB
dask.array<abs, shape=(2, 191, 300), dtype=float64, chunksize=(2, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * ocean_time  (ocean_time) datetime64[ns] 16B 2009-11-19T12:00:00 2009-11-1...
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
    sig0        float64 8B 0.0
    z_rho       (ocean_time, eta_rho, xi_rho) float64 917kB dask.array<chunksize=(2, 191, 300), meta=np.ndarray>
Attributes:
    long_name:      mixed layer depth
    time:           ocean_time
    field:          z_rho, scalar, series
    units:          m
    positive:       up
    standard_name:  depth
    name:           mld

Other calculations#

Rotations#

If your ROMS grid is curvilinear, you’ll need to rotate your u and v velocities from along the grid axes to being eastward and northward. You can do this with

ds.xroms.east

ds.xroms.north

Additionally, if you want to rotate your velocity to be a different orientation, for example to be along-channel, you can do that with

ds.xroms.east_rotated(angle)

ds.xroms.north_rotated(angle)

Time-based calculations including climatologies#

Rolling averages in time#

Here is an example of computing a rolling average in time. Nothing happens in this example because we only have two time steps to use, however, it does demonstrate the syntax. If more time steps were available we would update ds.salt.rolling(ocean_time=1) to include more time steps to average over in a rolling sense.

More information about rolling operations is available.

roll = ds.salt.rolling(ocean_time=1, center=True, min_periods=1).mean()
roll.isel(s_rho=-1, eta_rho=10, xi_rho=20).plot(alpha=0.5, lw=2)
ds.salt.isel(s_rho=-1, eta_rho=10, xi_rho=20).plot(ls=":", lw=2)
[<matplotlib.lines.Line2D at 0x7f93b8594d00>]
_images/d47068db2b86020f980669ccb8821c6b5aa22536eb3853f7a024cf486f037834.png

Resampling in time#

Can’t have any chunks in the time dimension to do this. More info: http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html

Upsample#

Upsample to a higher resolution in time. Makes sense to interpolate to fill in data when upsampling, but can also forward or backfill, or just add nan’s.

dstest = ds.resample(ocean_time='30min', restore_coord_dims=True).interpolate()

Plot to visually inspect results

ds.salt.cf.isel(Y=30, X=20, Z=-1).plot(marker='o')
dstest.salt.cf.isel(Y=30, X=20, Z=-1).plot(marker='x')
[<matplotlib.lines.Line2D at 0x7f93b82d6290>]
_images/ac6dabcc56446700e1f5b1b0f4610ececad6d55a9861e3deb52055cedcd1a24e.png

Downsample#

Resample down to lower resolution in time. This requires appending a method to aggregate the extra data, such as a mean. Note that other options can be used to shift the result within the interval of aggregation in various ways. Just the syntax is shown here since we only have two time steps to work with.

dstest = ds.resample(ocean_time='6H').mean()
ds.salt.cf.isel(Y=30, X=20, Z=-1).plot(marker='o')
dstest.salt.cf.isel(Y=30, X=20, Z=-1).plot(marker='x')

Seasonal average, over time#

This is an example of resampling.

da.cf.resample({'T': [time frequency string]}).reduce([aggregation function])

For example, calculate the mean temperature every quarter in time with the following:

ds.temp.cf.resample({'T': 'QS'}).reduce(np.mean)

or the aggregation function can be appended on the end directly with:

ds.temp.cf.resample({'T': 'QS'}).mean()

The result of this calculation is a time series of downsampled chunks of output in time, the frequency of which is selected by input “time frequency string”, and aggregated by input “aggregation function”.

Examples of the time frequency string are:

  • “QS”: quarters, starting in January of each year and averaging three months.

    • Also available are selections like “QS-DEC”, quarters but starting with December to better align with seasons. Other months are input options as well.

  • “MS”: monthly

  • “D”: daily

  • “H”: hourly

  • Many more options are given here.

Examples of aggregation functions are:

  • np.mean

  • np.max

  • np.min

  • np.sum

  • np.std

Result of downsampling a 4D salt array from hourly to 6-hourly, for example, gives: [ocean_time x s_rho x eta_rho x xi_rho], where ocean_time has about 1/6 of the number of entries reflecting the aggregation in time.

ds.temp.cf.resample(indexer={'T': '6H'}).reduce(np.mean)
/home/docs/checkouts/readthedocs.org/user_builds/xroms/conda/latest/lib/python3.10/site-packages/xarray/core/groupby.py:532: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  index_grouper = pd.Grouper(
<xarray.DataArray 'temp' (ocean_time: 1, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 7MB
dask.array<stack, shape=(1, 30, 191, 300), dtype=float32, chunksize=(1, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho     (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho       (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * xi_rho      (xi_rho) int64 2kB 0 1 2 3 4 5 6 ... 293 294 295 296 297 298 299
  * eta_rho     (eta_rho) int64 2kB 0 1 2 3 4 5 6 ... 185 186 187 188 189 190
  * ocean_time  (ocean_time) datetime64[ns] 8B 2009-11-19T12:00:00
Attributes:
    long_name:  potential temperature
    units:      Celsius
    time:       ocean_time
    field:      temperature, scalar, series

Seasonal mean over all available time#

This is how to average over the full dataset period by certain time groupings using xarray groupby which is like pandas version. In this case we show the seasonal mean averaged across the full model time period. The syntax for this is:

da.salt.cf.groupby('T.[time string]').reduce([aggregation function])

For example, to average salt by season:

da.salt.cf.groupby('T.season').reduce(np.mean)

or

da.salt.cf.groupby('T.season').mean()

Options for the time string include:

  • ‘season’

  • ‘year’

  • ‘month’

  • ‘day’

  • ‘hour’

  • ‘minute’

  • ‘second’

  • ‘dayofyear’

  • ‘week’

  • ‘dayofweek’

  • ‘weekday’

  • ‘quarter’

More information about options for time (including “derived” datetime coordinates) is here.

Examples of aggregation functions are:

  • np.mean

  • np.max

  • np.min

  • np.sum

  • np.std

Result of averaging over seasons for a 4D salt array returns, for example: [season x s_rho x eta_rho x xi_rho], where season has 4 entries, each covering 3 months of the year.

# this example has only 1 season because it is a short example file
ds.temp.cf.groupby('T.season').mean()
<xarray.DataArray 'temp' (season: 1, s_rho: 30, eta_rho: 191, xi_rho: 300)> Size: 7MB
dask.array<stack, shape=(1, 30, 191, 300), dtype=float32, chunksize=(1, 30, 191, 300), chunktype=numpy.ndarray>
Coordinates:
    lon_rho  (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
    lat_rho  (eta_rho, xi_rho) float64 458kB dask.array<chunksize=(191, 300), meta=np.ndarray>
  * s_rho    (s_rho) float64 240B -0.9833 -0.95 -0.9167 ... -0.05 -0.01667
  * xi_rho   (xi_rho) int64 2kB 0 1 2 3 4 5 6 7 ... 293 294 295 296 297 298 299
  * eta_rho  (eta_rho) int64 2kB 0 1 2 3 4 5 6 7 ... 184 185 186 187 188 189 190
  * season   (season) object 8B 'SON'
Attributes:
    long_name:  potential temperature
    units:      Celsius
    time:       ocean_time
    field:      temperature, scalar, series