diff --git a/.git_archival.txt b/.git_archival.txt
new file mode 100644
index 0000000000..3994ec0a83
--- /dev/null
+++ b/.git_archival.txt
@@ -0,0 +1,4 @@
+node: $Format:%H$
+node-date: $Format:%cI$
+describe-name: $Format:%(describe:tags=true)$
+ref-names: $Format:%D$
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..82bf71c1c5
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+.git_archival.txt export-subst
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 500a2183d2..84af305034 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -4,3 +4,6 @@ contact_links:
- name: 💬 Iris GitHub Discussions
url: https://github.com/SciTools/iris/discussions
about: Engage with the Iris community to discuss your issue
+ - name: ❓ Usage Question
+ url: https://github.com/SciTools/iris/discussions/categories/q-a
+ about: Raise a question about how to use Iris in the Q&A section of Discussions
diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml
index 9ebc7a4c45..c0baabe572 100644
--- a/.github/workflows/benchmark.yml
+++ b/.github/workflows/benchmark.yml
@@ -6,6 +6,12 @@ on:
schedule:
# Runs every day at 23:00.
- cron: "0 23 * * *"
+ workflow_dispatch:
+ inputs:
+ first_commit:
+ description: "Argument to be passed to the overnight benchmark script."
+ required: false
+ type: string
jobs:
benchmark:
@@ -15,7 +21,7 @@ jobs:
env:
IRIS_TEST_DATA_LOC_PATH: benchmarks
IRIS_TEST_DATA_PATH: benchmarks/iris-test-data
- IRIS_TEST_DATA_VERSION: "2.14"
+ IRIS_TEST_DATA_VERSION: "2.15"
# Lets us manually bump the cache to rebuild
ENV_CACHE_BUILD: "0"
TEST_DATA_CACHE_BUILD: "2"
@@ -64,7 +70,12 @@ jobs:
- name: Run overnight benchmarks
run: |
- first_commit=$(git log --after="$(date -d "1 day ago" +"%Y-%m-%d") 23:00:00" --pretty=format:"%h" | tail -n 1)
+ first_commit=${{ inputs.first_commit }}
+ if [ "$first_commit" == "" ]
+ then
+ first_commit=$(git log --after="$(date -d "1 day ago" +"%Y-%m-%d") 23:00:00" --pretty=format:"%h" | tail -n 1)
+ fi
+
if [ "$first_commit" != "" ]
then
nox --session="benchmarks(overnight)" -- $first_commit
diff --git a/.github/workflows/ci-docs-tests.yml b/.github/workflows/ci-docs-tests.yml
deleted file mode 100644
index c2e3fcfcf8..0000000000
--- a/.github/workflows/ci-docs-tests.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-# reference:
-# - https://github.com/actions/cache
-# - https://github.com/actions/checkout
-# - https://github.com/marketplace/actions/setup-miniconda
-
-name: ci-docs-tests
-
-on:
- push:
- branches:
- - "main"
- - "v*x"
- tags:
- - "v*"
- pull_request:
- branches:
- - "*"
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- tests:
- name: "${{ matrix.session }} ${{ matrix.os }} py${{ matrix.python-version }}"
-
- runs-on: ${{ matrix.os }}
-
- defaults:
- run:
- shell: bash -l {0}
-
- strategy:
- fail-fast: false
- matrix:
- os: ["ubuntu-latest"]
- python-version: ["3.8"]
- session: ["doctest", "gallery", "linkcheck"]
-
- env:
- IRIS_TEST_DATA_VERSION: "2.14"
- ENV_NAME: "ci-docs-tests"
-
- steps:
- - name: "checkout"
- uses: actions/checkout@v3
-
- - name: "environment configure"
- env:
- # Maximum cache period (in weeks) before forcing a cache refresh.
- CACHE_WEEKS: 2
- run: |
- echo "CACHE_PERIOD=$(date +%Y).$(expr $(date +%U) / ${CACHE_WEEKS})" >> ${GITHUB_ENV}
- echo "LOCK_FILE=requirements/ci/nox.lock/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV}
-
- - name: "data cache"
- uses: ./.github/workflows/composite/iris-data-cache
- with:
- cache_build: 1
- env_name: ${{ env.ENV_NAME }}
- version: ${{ env.IRIS_TEST_DATA_VERSION }}
-
- - name: "conda package cache"
- uses: ./.github/workflows/composite/conda-pkg-cache
- with:
- cache_build: 1
- cache_period: ${{ env.CACHE_PERIOD }}
- env_name: ${{ env.ENV_NAME }}
-
- - name: "conda install"
- uses: conda-incubator/setup-miniconda@v2
- with:
- miniforge-version: latest
- channels: conda-forge,defaults
- activate-environment: ${{ env.ENV_NAME }}
- auto-update-conda: false
- use-only-tar-bz2: true
-
- - name: "conda environment cache"
- uses: ./.github/workflows/composite/conda-env-cache
- with:
- cache_build: 1
- cache_period: ${{ env.CACHE_PERIOD }}
- env_name: ${{ env.ENV_NAME }}
- install_packages: "cartopy nox pip"
-
- - name: "conda info"
- run: |
- conda info
- conda list
-
- - name: "cartopy cache"
- uses: ./.github/workflows/composite/cartopy-cache
- with:
- cache_build: 1
- cache_period: ${{ env.CACHE_PERIOD }}
- env_name: ${{ env.ENV_NAME }}
-
- - name: "nox cache"
- uses: ./.github/workflows/composite/nox-cache
- with:
- cache_build: 1
- env_name: ${{ env.ENV_NAME }}
- lock_file: ${{ env.LOCK_FILE }}
-
- # TODO: drop use of site.cfg and explicit use of mplrc
- - name: "iris configure"
- env:
- SITE_CFG: lib/iris/etc/site.cfg
- MPL_RC: ${HOME}/.config/matplotlib/matplotlibrc
- run: |
- mkdir -p $(dirname ${SITE_CFG})
- echo ${SITE_CFG}
- echo "[Resources]" >> ${SITE_CFG}
- echo "test_data_dir = ${HOME}/iris-test-data/test_data" >> ${SITE_CFG}
- echo "doc_dir = ${GITHUB_WORKSPACE}/docs" >> ${SITE_CFG}
- cat ${SITE_CFG}
- mkdir -p $(dirname ${MPL_RC})
- echo ${MPL_RC}
- echo "backend : agg" >> ${MPL_RC}
- echo "image.cmap : viridis" >> ${MPL_RC}
- cat ${MPL_RC}
-
- - name: "iris ${{ matrix.session }}"
- env:
- PY_VER: ${{ matrix.python-version }}
- run: |
- nox --session ${{ matrix.session }} -- --verbose
diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml
index 18cb1f5e21..270046164e 100644
--- a/.github/workflows/ci-tests.yml
+++ b/.github/workflows/ci-tests.yml
@@ -3,7 +3,7 @@
# - https://github.com/actions/checkout
# - https://github.com/marketplace/actions/setup-miniconda
-name: ci-tests
+name: ci-tests
on:
push:
@@ -23,7 +23,7 @@ concurrency:
jobs:
tests:
- name: "${{ matrix.session }} ${{ matrix.os }} py${{ matrix.python-version }}"
+ name: "${{ matrix.session }} (py${{ matrix.python-version }} ${{ matrix.os }})"
runs-on: ${{ matrix.os }}
@@ -35,11 +35,18 @@ jobs:
fail-fast: false
matrix:
os: ["ubuntu-latest"]
- python-version: ["3.8"]
- session: ["tests"]
+ python-version: ["3.10"]
+ session: ["tests", "doctest", "gallery", "linkcheck"]
+ include:
+ - os: "ubuntu-latest"
+ python-version: "3.9"
+ session: "tests"
+ - os: "ubuntu-latest"
+ python-version: "3.8"
+ session: "tests"
env:
- IRIS_TEST_DATA_VERSION: "2.14"
+ IRIS_TEST_DATA_VERSION: "2.17"
ENV_NAME: "ci-tests"
steps:
@@ -57,14 +64,14 @@ jobs:
- name: "data cache"
uses: ./.github/workflows/composite/iris-data-cache
with:
- cache_build: 1
+ cache_build: 0
env_name: ${{ env.ENV_NAME }}
version: ${{ env.IRIS_TEST_DATA_VERSION }}
- name: "conda package cache"
uses: ./.github/workflows/composite/conda-pkg-cache
with:
- cache_build: 1
+ cache_build: 0
cache_period: ${{ env.CACHE_PERIOD }}
env_name: ${{ env.ENV_NAME }}
@@ -80,7 +87,7 @@ jobs:
- name: "conda environment cache"
uses: ./.github/workflows/composite/conda-env-cache
with:
- cache_build: 1
+ cache_build: 0
cache_period: ${{ env.CACHE_PERIOD }}
env_name: ${{ env.ENV_NAME }}
install_packages: "cartopy nox pip"
@@ -93,14 +100,14 @@ jobs:
- name: "cartopy cache"
uses: ./.github/workflows/composite/cartopy-cache
with:
- cache_build: 1
+ cache_build: 0
cache_period: ${{ env.CACHE_PERIOD }}
env_name: ${{ env.ENV_NAME }}
- name: "nox cache"
uses: ./.github/workflows/composite/nox-cache
with:
- cache_build: 1
+ cache_build: 0
env_name: ${{ env.ENV_NAME }}
lock_file: ${{ env.LOCK_FILE }}
@@ -108,6 +115,7 @@ jobs:
- name: "iris configure"
env:
SITE_CFG: lib/iris/etc/site.cfg
+ MPL_RC: ${HOME}/.config/matplotlib/matplotlibrc
run: |
mkdir -p $(dirname ${SITE_CFG})
echo ${SITE_CFG}
@@ -115,6 +123,11 @@ jobs:
echo "test_data_dir = ${HOME}/iris-test-data/test_data" >> ${SITE_CFG}
echo "doc_dir = ${GITHUB_WORKSPACE}/docs" >> ${SITE_CFG}
cat ${SITE_CFG}
+ mkdir -p $(dirname ${MPL_RC})
+ echo ${MPL_RC}
+ echo "backend : agg" >> ${MPL_RC}
+ echo "image.cmap : viridis" >> ${MPL_RC}
+ cat ${MPL_RC}
- name: "iris ${{ matrix.session }}"
env:
diff --git a/.github/workflows/ci-wheels.yml b/.github/workflows/ci-wheels.yml
new file mode 100644
index 0000000000..a00833b118
--- /dev/null
+++ b/.github/workflows/ci-wheels.yml
@@ -0,0 +1,166 @@
+# Reference:
+# - https://github.com/actions/checkout
+# - https://github.com/actions/download-artifact
+# - https://github.com/actions/upload-artifact
+# - https://github.com/pypa/build
+# - https://github.com/pypa/gh-action-pypi-publish
+# - https://test.pypi.org/help/#apitoken
+
+name: ci-wheels
+
+on:
+ pull_request:
+
+ push:
+ tags:
+ - "v*"
+ branches-ignore:
+ - "auto-update-lockfiles"
+ - "pre-commit-ci-update-config"
+ - "dependabot/*"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ build:
+ name: "build sdist & wheel"
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: "building"
+ shell: bash
+ run: |
+ # require build with explicit --sdist and --wheel in order to
+ # get correct version associated with sdist and bdist artifacts
+ pipx run build --sdist --wheel
+
+ - uses: actions/upload-artifact@v3
+ with:
+ name: pypi-artifacts
+ path: ${{ github.workspace }}/dist/*
+
+ test-wheel:
+ needs: build
+ name: "test wheel (py${{ matrix.python-version }})"
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash -l {0}
+ strategy:
+ fail-fast: false
+ matrix:
+ python-version: ["3.8", "3.9", "3.10"]
+ session: ["wheel"]
+ env:
+ ENV_NAME: "ci-wheels"
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - uses: actions/download-artifact@v3
+ with:
+ name: pypi-artifacts
+ path: ${{ github.workspace }}/dist
+
+ - name: "environment configure"
+ env:
+ # Maximum cache period (in weeks) before forcing a cache refresh.
+ CACHE_WEEKS: 2
+ run: |
+ echo "CACHE_PERIOD=$(date +%Y).$(expr $(date +%U) / ${CACHE_WEEKS})" >> ${GITHUB_ENV}
+ echo "LOCK_FILE=requirements/ci/nox.lock/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV}
+
+ - name: "conda package cache"
+ uses: ./.github/workflows/composite/conda-pkg-cache
+ with:
+ cache_build: 0
+ cache_period: ${{ env.CACHE_PERIOD }}
+ env_name: ${{ env.ENV_NAME }}
+
+ - name: "conda install"
+ uses: conda-incubator/setup-miniconda@v2
+ with:
+ miniforge-version: latest
+ channels: conda-forge,defaults
+ activate-environment: ${{ env.ENV_NAME }}
+ auto-update-conda: false
+ use-only-tar-bz2: true
+
+ - name: "conda environment cache"
+ uses: ./.github/workflows/composite/conda-env-cache
+ with:
+ cache_build: 0
+ cache_period: ${{ env.CACHE_PERIOD }}
+ env_name: ${{ env.ENV_NAME }}
+ install_packages: "nox pip"
+
+ - name: "nox cache"
+ uses: ./.github/workflows/composite/nox-cache
+ with:
+ cache_build: 0
+ env_name: ${{ env.ENV_NAME }}
+ lock_file: ${{ env.LOCK_FILE }}
+
+ - name: "nox install and test wheel"
+ env:
+ PY_VER: ${{ matrix.python-version }}
+ run: |
+ nox --session ${{ matrix.session }} -- --verbose
+
+ show-artifacts:
+ needs: build
+ name: "show artifacts"
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ name: pypi-artifacts
+ path: ${{ github.workspace }}/dist
+
+ - shell: bash
+ run: |
+ ls -l ${{ github.workspace }}/dist
+
+ publish-artifacts-test-pypi:
+ needs: test-wheel
+ name: "publish to test.pypi"
+ runs-on: ubuntu-latest
+ # upload to Test PyPI for every commit on main branch
+ if: github.event_name == 'push' && github.event.ref == 'refs/heads/main'
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ name: pypi-artifacts
+ path: ${{ github.workspace }}/dist
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ user: __token__
+ password: ${{ secrets.TEST_PYPI_API_TOKEN }}
+ repository_url: https://test.pypi.org/legacy/
+ skip_existing: true
+ print_hash: true
+
+ publish-artifacts-pypi:
+ needs: test-wheel
+ name: "publish to pypi"
+ runs-on: ubuntu-latest
+ # upload to PyPI for every tag starting with 'v'
+ if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v')
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ name: pypi-artifacts
+ path: ${{ github.workspace }}/dist
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_API_TOKEN }}
+ print_hash: true
diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml
index e817131c5e..a45cccfeab 100644
--- a/.github/workflows/refresh-lockfiles.yml
+++ b/.github/workflows/refresh-lockfiles.yml
@@ -33,7 +33,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- id: get_py
- run: echo "::set-output name=matrix::$(ls -1 requirements/ci/py??.yml | xargs -n1 basename | sed 's/....$//' | jq -cnR '[inputs]')"
+ run: echo "::set-output name=matrix::$(ls -1 requirements/ci/py*.yml | xargs -n1 basename | sed 's/....$//' | jq -cnR '[inputs]')"
gen_lockfiles:
# this is a matrix job: it splits to create new lockfiles for each
@@ -48,11 +48,13 @@ jobs:
steps:
- uses: actions/checkout@v3
- - name: install conda-lock
+ - name: install requirements
run: |
source $CONDA/bin/activate base
- conda install -y -c conda-forge conda-lock
+ conda install -y -c conda-forge conda-libmamba-solver conda-lock
- name: generate lockfile
+ env:
+ CONDA_EXPERIMENTAL_SOLVER: libmamba
run: |
$CONDA/bin/conda-lock lock -k explicit -p linux-64 -f requirements/ci/${{matrix.python}}.yml
mv conda-linux-64.lock ${{matrix.python}}-linux-64.lock
@@ -89,7 +91,7 @@ jobs:
- name: Create Pull Request
id: cpr
- uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27
+ uses: peter-evans/create-pull-request@671dc9c9e0c2d73f07fa45a3eb0220e1622f0c5f
with:
token: ${{ steps.generate-token.outputs.token }}
commit-message: Updated environment lockfiles
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 008fe56deb..c65f37284f 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -14,7 +14,7 @@ jobs:
if: "github.repository == 'SciTools/iris'"
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v5
+ - uses: actions/stale@v6
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 1791caf3f3..512fbab231 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
*.py[co]
+# setuptools-scm
+_version.py
+
# Environment file which should be autogenerated
*conda_requirements.txt*
@@ -55,6 +58,9 @@ lib/iris/tests/results/imagerepo.lock
/.idea
*.cover
+# vscode files
+.vscode
+
# Auto generated documentation files
docs/src/_build/*
docs/src/generated
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c2563497de..b7746edb43 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -13,7 +13,7 @@ minimum_pre_commit_version: 1.21.0
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.2.0
+ rev: v4.3.0
hooks:
# Prevent giant files from being committed.
- id: check-added-large-files
@@ -29,14 +29,14 @@ repos:
- id: no-commit-to-branch
- repo: https://github.com/psf/black
- rev: 22.3.0
+ rev: 22.10.0
hooks:
- id: black
pass_filenames: false
args: [--config=./pyproject.toml, .]
- repo: https://github.com/PyCQA/flake8
- rev: 4.0.1
+ rev: 5.0.4
hooks:
- id: flake8
types: [file, python]
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 63c4798050..95f828a873 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -4,6 +4,19 @@ build:
os: ubuntu-20.04
tools:
python: mambaforge-4.10
+ jobs:
+ post_checkout:
+ # The SciTools/iris repository is shallow i.e., has a .git/shallow,
+ # therefore complete the repository with a full history in order
+ # to allow setuptools-scm to correctly auto-discover the version.
+ - git fetch --unshallow
+ - git fetch --all
+ # Need to stash the local changes that Read the Docs makes so that
+ # setuptools_scm can generate the correct Iris version.
+ pre_install:
+ - git stash
+ post_install:
+ - git stash pop
conda:
environment: requirements/ci/readthedocs.yml
diff --git a/MANIFEST.in b/MANIFEST.in
index 52492b17b2..ad28df9c7c 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,15 +1,13 @@
# Top-level files
include CHANGES COPYING COPYING.LESSER
+prune .github
+exclude .gitignore
-# Files from setup.py package_data that are not automatically added to source distributions
-recursive-include lib/iris/tests/results *.cml *.cdl *.txt *.xml *.json
-recursive-include lib/iris/etc *
-include lib/iris/tests/stock/file_headers/*
-
+# Files required for conda package management
recursive-include requirements *
-# File required to build docs
-recursive-include docs Makefile *.js *.png *.py *.rst
+# Files required to build docs
+recursive-include docs *
prune docs/src/_build
prune docs/src/generated
prune docs/gallery_tests
@@ -18,6 +16,5 @@ prune docs/gallery_tests
include tools/generate_std_names.py
include etc/cf-standard-name-table.xml
-global-exclude *.pyc
-global-exclude __pycache__
-global-exclude iris_image_test_output
+global-exclude *.py[cod]
+global-exclude __pycache__
\ No newline at end of file
diff --git a/README.md b/README.md
index 1217cd9b38..ac2781f469 100644
--- a/README.md
+++ b/README.md
@@ -13,9 +13,6 @@
-
-
diff --git a/benchmarks/benchmarks/experimental/ugrid/regions_combine.py b/benchmarks/benchmarks/experimental/ugrid/regions_combine.py
index 8ebf210416..3b2d77a80a 100644
--- a/benchmarks/benchmarks/experimental/ugrid/regions_combine.py
+++ b/benchmarks/benchmarks/experimental/ugrid/regions_combine.py
@@ -11,8 +11,7 @@
* minimal: enables detection of regressions in parts of the run-time that do
NOT scale with data size.
* large: large enough to exclusively detect regressions in parts of the
- run-time that scale with data size. Aim for benchmark time ~20x
- that of the minimal benchmark.
+ run-time that scale with data size.
"""
import os
diff --git a/benchmarks/benchmarks/generate_data/__init__.py b/benchmarks/benchmarks/generate_data/__init__.py
index 78b971d9de..52a5aceca8 100644
--- a/benchmarks/benchmarks/generate_data/__init__.py
+++ b/benchmarks/benchmarks/generate_data/__init__.py
@@ -113,7 +113,7 @@ def load_realised():
file loading, but some benchmarks are only meaningful if starting with real
arrays.
"""
- from iris.fileformats.netcdf import _get_cf_var_data as pre_patched
+ from iris.fileformats.netcdf.loader import _get_cf_var_data as pre_patched
def patched(cf_var, filename):
return as_concrete_data(pre_patched(cf_var, filename))
diff --git a/benchmarks/benchmarks/import_iris.py b/benchmarks/benchmarks/import_iris.py
index ad54c23122..fc32ac289b 100644
--- a/benchmarks/benchmarks/import_iris.py
+++ b/benchmarks/benchmarks/import_iris.py
@@ -5,10 +5,30 @@
# licensing details.
from importlib import import_module, reload
+################
+# Prepare info for reset_colormaps:
+
+# Import and capture colormaps.
+from matplotlib import colormaps # isort:skip
+
+_COLORMAPS_ORIG = set(colormaps)
+
+# Import iris.palette, which modifies colormaps.
+import iris.palette
+
+# Derive which colormaps have been added by iris.palette.
+_COLORMAPS_MOD = set(colormaps)
+COLORMAPS_EXTRA = _COLORMAPS_MOD - _COLORMAPS_ORIG
+
+# Touch iris.palette to prevent linters complaining.
+_ = iris.palette
+
+################
+
class Iris:
@staticmethod
- def _import(module_name):
+ def _import(module_name, reset_colormaps=False):
"""
Have experimented with adding sleep() commands into the imported
modules. The results reveal:
@@ -25,6 +45,13 @@ def _import(module_name):
and the repetitions are therefore no faster than the first run.
"""
mod = import_module(module_name)
+
+ if reset_colormaps:
+ # Needed because reload() will attempt to register new colormaps a
+ # second time, which errors by default.
+ for cm_name in COLORMAPS_EXTRA:
+ colormaps.unregister(cm_name)
+
reload(mod)
def time_iris(self):
@@ -205,7 +232,7 @@ def time_iterate(self):
self._import("iris.iterate")
def time_palette(self):
- self._import("iris.palette")
+ self._import("iris.palette", reset_colormaps=True)
def time_plot(self):
self._import("iris.plot")
diff --git a/benchmarks/benchmarks/load/ugrid.py b/benchmarks/benchmarks/load/ugrid.py
index 8227a4c5a0..350a78e128 100644
--- a/benchmarks/benchmarks/load/ugrid.py
+++ b/benchmarks/benchmarks/load/ugrid.py
@@ -10,8 +10,7 @@
* minimal: enables detection of regressions in parts of the run-time that do
NOT scale with data size.
* large: large enough to exclusively detect regressions in parts of the
- run-time that scale with data size. Aim for benchmark time ~20x
- that of the minimal benchmark.
+ run-time that scale with data size.
"""
@@ -39,7 +38,7 @@ def load_mesh(*args, **kwargs):
class BasicLoading:
- params = [1, int(4.1e6)]
+ params = [1, int(2e5)]
param_names = ["number of faces"]
def setup_common(self, **kwargs):
@@ -58,6 +57,9 @@ def time_load_mesh(self, *args):
class BasicLoadingTime(BasicLoading):
"""Same as BasicLoading, but scaling over a time series - an unlimited dimension."""
+ # NOTE iris#4834 - careful how big the time dimension is (time dimension
+ # is UNLIMITED).
+
param_names = ["number of time steps"]
def setup(self, *args):
@@ -75,7 +77,7 @@ class DataRealisation:
warmup_time = 0.0
timeout = 300.0
- params = [1, int(4e6)]
+ params = [1, int(2e5)]
param_names = ["number of faces"]
def setup_common(self, **kwargs):
@@ -102,7 +104,7 @@ def setup(self, *args):
class Callback:
- params = [1, int(4.5e6)]
+ params = [1, int(2e5)]
param_names = ["number of faces"]
def setup_common(self, **kwargs):
diff --git a/benchmarks/benchmarks/save.py b/benchmarks/benchmarks/save.py
index bb1d2d8c82..3551c72528 100644
--- a/benchmarks/benchmarks/save.py
+++ b/benchmarks/benchmarks/save.py
@@ -10,8 +10,7 @@
* minimal: enables detection of regressions in parts of the run-time that do
NOT scale with data size.
* large: large enough to exclusively detect regressions in parts of the
- run-time that scale with data size. Aim for benchmark time ~20x
- that of the minimal benchmark.
+ run-time that scale with data size.
"""
from iris import save
diff --git a/docs/Makefile b/docs/Makefile
index 44c89206d2..47f3e740fa 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -55,8 +55,8 @@ linkcheck:
echo "Running linkcheck in $$i..."; \
(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) linkcheck); done
-gallerytest:
- @echo
- @echo "Running \"gallery\" tests..."
- @echo
- python -m unittest discover -v -t .
+show:
+ @for i in $(SUBDIRS); do \
+ echo "Running show in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) show); done
+
diff --git a/docs/gallery_code/general/plot_custom_file_loading.py b/docs/gallery_code/general/plot_custom_file_loading.py
index 025f395789..4b817aea66 100644
--- a/docs/gallery_code/general/plot_custom_file_loading.py
+++ b/docs/gallery_code/general/plot_custom_file_loading.py
@@ -57,7 +57,7 @@
import datetime
-from cf_units import CALENDAR_GREGORIAN, Unit
+from cf_units import CALENDAR_STANDARD, Unit
import matplotlib.pyplot as plt
import numpy as np
@@ -225,7 +225,7 @@ def NAME_to_cube(filenames, callback):
# define the time unit and use it to serialise the datetime for the
# time coordinate
- time_unit = Unit("hours since epoch", calendar=CALENDAR_GREGORIAN)
+ time_unit = Unit("hours since epoch", calendar=CALENDAR_STANDARD)
time_coord = icoords.AuxCoord(
time_unit.date2num(field_headings["time"]),
standard_name="time",
diff --git a/docs/gallery_code/general/plot_zonal_means.py b/docs/gallery_code/general/plot_zonal_means.py
new file mode 100644
index 0000000000..08a9578e63
--- /dev/null
+++ b/docs/gallery_code/general/plot_zonal_means.py
@@ -0,0 +1,89 @@
+"""
+Zonal Mean Diagram of Air Temperature
+=====================================
+This example demonstrates aligning a linear plot and a cartographic plot using Matplotlib.
+"""
+
+import cartopy.crs as ccrs
+import matplotlib.pyplot as plt
+from mpl_toolkits.axes_grid1 import make_axes_locatable
+import numpy as np
+
+import iris
+from iris.analysis import MEAN
+import iris.plot as iplt
+import iris.quickplot as qplt
+
+
+def main():
+
+ # Loads air_temp.pp and "collapses" longitude into a single, average value.
+ fname = iris.sample_data_path("air_temp.pp")
+ temperature = iris.load_cube(fname)
+ collapsed_temp = temperature.collapsed("longitude", MEAN)
+
+ # Set y-axes with -90 and 90 limits and steps of 15 per tick.
+ start, stop, step = -90, 90, 15
+ yticks = np.arange(start, stop + step, step)
+ ylim = [start, stop]
+
+ # Plot "temperature" on a cartographic plot and set the ticks and titles
+ # on the axes.
+ fig = plt.figure(figsize=[12, 4])
+
+ ax1 = fig.add_subplot(111, projection=ccrs.PlateCarree())
+ im = iplt.contourf(temperature, cmap="RdYlBu_r")
+ ax1.coastlines()
+ ax1.gridlines()
+ ax1.set_xticks([-180, -90, 0, 90, 180])
+ ax1.set_yticks(yticks)
+ ax1.set_title("Air Temperature")
+ ax1.set_ylabel(f"Latitude / {temperature.coord('latitude').units}")
+ ax1.set_xlabel(f"Longitude / {temperature.coord('longitude').units}")
+ ax1.set_ylim(*ylim)
+
+ # Create a Matplotlib AxesDivider object to allow alignment of other
+ # Axes objects.
+ divider = make_axes_locatable(ax1)
+
+ # Gives the air temperature bar size, colour and a title.
+ ax2 = divider.new_vertical(
+ size="5%", pad=0.5, axes_class=plt.Axes, pack_start=True
+ ) # creates 2nd axis
+ fig.add_axes(ax2)
+ cbar = plt.colorbar(
+ im, cax=ax2, orientation="horizontal"
+ ) # puts colour bar on second axis
+ cbar.ax.set_xlabel(f"{temperature.units}") # labels colour bar
+
+ # Plot "collapsed_temp" on the mean graph and set the ticks and titles
+ # on the axes.
+ ax3 = divider.new_horizontal(
+ size="30%", pad=0.4, axes_class=plt.Axes
+ ) # create 3rd axis
+ fig.add_axes(ax3)
+ qplt.plot(
+ collapsed_temp, collapsed_temp.coord("latitude")
+ ) # plots temperature collapsed over longitude against latitude
+ ax3.axhline(0, color="k", linewidth=0.5)
+
+ # Creates zonal mean details
+ ax3.set_title("Zonal Mean")
+ ax3.yaxis.set_label_position("right")
+ ax3.yaxis.tick_right()
+ ax3.set_yticks(yticks)
+ ax3.grid()
+
+ # Round each tick for the third ax to the nearest 20 (ready for use).
+ data_max = collapsed_temp.data.max()
+ x_max = data_max - data_max % -20
+ data_min = collapsed_temp.data.min()
+ x_min = data_min - data_min % 20
+ ax3.set_xlim(x_min, x_max)
+ ax3.set_ylim(*ylim)
+
+ plt.show()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/gallery_tests/conftest.py b/docs/gallery_tests/conftest.py
new file mode 100644
index 0000000000..a218b305a2
--- /dev/null
+++ b/docs/gallery_tests/conftest.py
@@ -0,0 +1,67 @@
+# Copyright Iris contributors
+#
+# This file is part of Iris and is released under the LGPL license.
+# See COPYING and COPYING.LESSER in the root of the repository for full
+# licensing details.
+
+"""Pytest fixtures for the gallery tests."""
+
+import pathlib
+
+import matplotlib.pyplot as plt
+import pytest
+
+import iris
+
+CURRENT_DIR = pathlib.Path(__file__).resolve()
+GALLERY_DIR = CURRENT_DIR.parents[1] / "gallery_code"
+
+
+@pytest.fixture
+def image_setup_teardown():
+ """
+ Setup and teardown fixture.
+
+ Ensures all figures are closed before and after test to prevent one test
+ polluting another if it fails with a figure unclosed.
+
+ """
+ plt.close("all")
+ yield
+ plt.close("all")
+
+
+@pytest.fixture
+def import_patches(monkeypatch):
+ """
+ Replace plt.show() with a function that does nothing, also add all the
+ gallery examples to sys.path.
+
+ """
+
+ def no_show():
+ pass
+
+ monkeypatch.setattr(plt, "show", no_show)
+
+ for example_dir in GALLERY_DIR.iterdir():
+ if example_dir.is_dir():
+ monkeypatch.syspath_prepend(example_dir)
+
+ yield
+
+
+@pytest.fixture
+def iris_future_defaults():
+ """
+ Create a fixture which resets all the iris.FUTURE settings to the defaults,
+ as otherwise changes made in one test can affect subsequent ones.
+
+ """
+ # Run with all default settings in iris.FUTURE.
+ default_future_kwargs = iris.Future().__dict__.copy()
+ for dead_option in iris.Future.deprecated_options:
+ # Avoid a warning when setting these !
+ del default_future_kwargs[dead_option]
+ with iris.FUTURE.context(**default_future_kwargs):
+ yield
diff --git a/docs/gallery_tests/gallerytest_util.py b/docs/gallery_tests/gallerytest_util.py
deleted file mode 100644
index eb2736f194..0000000000
--- a/docs/gallery_tests/gallerytest_util.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-"""
-Provides context managers which are fundamental to the ability
-to run the gallery tests.
-
-"""
-
-import contextlib
-import os.path
-import sys
-import warnings
-
-import matplotlib.pyplot as plt
-
-import iris
-from iris._deprecation import IrisDeprecation
-import iris.plot as iplt
-import iris.quickplot as qplt
-
-GALLERY_DIRECTORY = os.path.join(
- os.path.dirname(os.path.dirname(__file__)), "gallery_code"
-)
-GALLERY_DIRECTORIES = [
- os.path.join(GALLERY_DIRECTORY, the_dir)
- for the_dir in os.listdir(GALLERY_DIRECTORY)
-]
-
-
-@contextlib.contextmanager
-def add_gallery_to_path():
- """
- Creates a context manager which can be used to add the iris gallery
- to the PYTHONPATH. The gallery entries are only importable throughout the lifetime
- of this context manager.
-
- """
- orig_sys_path = sys.path
- sys.path = sys.path[:]
- sys.path += GALLERY_DIRECTORIES
- yield
- sys.path = orig_sys_path
-
-
-@contextlib.contextmanager
-def show_replaced_by_check_graphic(test_case):
- """
- Creates a context manager which can be used to replace the functionality
- of matplotlib.pyplot.show with a function which calls the check_graphic
- method on the given test_case (iris.tests.IrisTest.check_graphic).
-
- """
-
- def replacement_show():
- # form a closure on test_case and tolerance
- test_case.check_graphic()
-
- orig_show = plt.show
- plt.show = iplt.show = qplt.show = replacement_show
- yield
- plt.show = iplt.show = qplt.show = orig_show
-
-
-@contextlib.contextmanager
-def fail_any_deprecation_warnings():
- """
- Create a context in which any deprecation warning will cause an error.
-
- The context also resets all the iris.FUTURE settings to the defaults, as
- otherwise changes made in one test can affect subsequent ones.
-
- """
- with warnings.catch_warnings():
- # Detect and error all and any Iris deprecation warnings.
- warnings.simplefilter("error", IrisDeprecation)
- # Run with all default settings in iris.FUTURE.
- default_future_kwargs = iris.Future().__dict__.copy()
- for dead_option in iris.Future.deprecated_options:
- # Avoid a warning when setting these !
- del default_future_kwargs[dead_option]
- with iris.FUTURE.context(**default_future_kwargs):
- yield
diff --git a/docs/gallery_tests/test_gallery_examples.py b/docs/gallery_tests/test_gallery_examples.py
new file mode 100644
index 0000000000..0d0793a7da
--- /dev/null
+++ b/docs/gallery_tests/test_gallery_examples.py
@@ -0,0 +1,44 @@
+# Copyright Iris contributors
+#
+# This file is part of Iris and is released under the LGPL license.
+# See COPYING and COPYING.LESSER in the root of the repository for full
+# licensing details.
+
+import importlib
+
+import matplotlib.pyplot as plt
+import pytest
+
+from iris.tests import _RESULT_PATH
+from iris.tests.graphics import check_graphic
+
+from .conftest import GALLERY_DIR
+
+
+def gallery_examples():
+ """Generator to yield all current gallery examples."""
+
+ for example_file in GALLERY_DIR.glob("*/plot*.py"):
+ yield example_file.stem
+
+
+@pytest.mark.filterwarnings("error::iris.IrisDeprecation")
+@pytest.mark.parametrize("example", gallery_examples())
+def test_plot_example(
+ example,
+ image_setup_teardown,
+ import_patches,
+ iris_future_defaults,
+):
+ """Test that all figures from example code match KGO."""
+
+ module = importlib.import_module(example)
+
+ # Run example.
+ module.main()
+ # Loop through open figures and set each to be the current figure so check_graphic
+ # will find it.
+ for fig_num in plt.get_fignums():
+ plt.figure(fig_num)
+ image_id = f"gallery_tests.test_{example}.{fig_num - 1}"
+ check_graphic(image_id, _RESULT_PATH)
diff --git a/docs/gallery_tests/test_plot_COP_1d.py b/docs/gallery_tests/test_plot_COP_1d.py
deleted file mode 100644
index 9771e10fb1..0000000000
--- a/docs/gallery_tests/test_plot_COP_1d.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestCOP1DPlot(tests.GraphicsTest):
- """Test the COP_1d_plot gallery code."""
-
- def test_plot_COP_1d(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_COP_1d
- with show_replaced_by_check_graphic(self):
- plot_COP_1d.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_COP_maps.py b/docs/gallery_tests/test_plot_COP_maps.py
deleted file mode 100644
index a01e12527f..0000000000
--- a/docs/gallery_tests/test_plot_COP_maps.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestCOPMaps(tests.GraphicsTest):
- """Test the COP_maps gallery code."""
-
- def test_plot_cop_maps(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_COP_maps
- with show_replaced_by_check_graphic(self):
- plot_COP_maps.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_SOI_filtering.py b/docs/gallery_tests/test_plot_SOI_filtering.py
deleted file mode 100644
index 1da731122a..0000000000
--- a/docs/gallery_tests/test_plot_SOI_filtering.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestSOIFiltering(tests.GraphicsTest):
- """Test the SOI_filtering gallery code."""
-
- def test_plot_soi_filtering(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_SOI_filtering
- with show_replaced_by_check_graphic(self):
- plot_SOI_filtering.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_TEC.py b/docs/gallery_tests/test_plot_TEC.py
deleted file mode 100644
index cfc1fb8eec..0000000000
--- a/docs/gallery_tests/test_plot_TEC.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestTEC(tests.GraphicsTest):
- """Test the TEC gallery code."""
-
- def test_plot_TEC(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_TEC
- with show_replaced_by_check_graphic(self):
- plot_TEC.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_anomaly_log_colouring.py b/docs/gallery_tests/test_plot_anomaly_log_colouring.py
deleted file mode 100644
index 41f76cc774..0000000000
--- a/docs/gallery_tests/test_plot_anomaly_log_colouring.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestAnomalyLogColouring(tests.GraphicsTest):
- """Test the anomaly colouring gallery code."""
-
- def test_plot_anomaly_log_colouring(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_anomaly_log_colouring
- with show_replaced_by_check_graphic(self):
- plot_anomaly_log_colouring.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_atlantic_profiles.py b/docs/gallery_tests/test_plot_atlantic_profiles.py
deleted file mode 100644
index fdcb5fb1d1..0000000000
--- a/docs/gallery_tests/test_plot_atlantic_profiles.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestAtlanticProfiles(tests.GraphicsTest):
- """Test the atlantic_profiles gallery code."""
-
- def test_plot_atlantic_profiles(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_atlantic_profiles
- with show_replaced_by_check_graphic(self):
- plot_atlantic_profiles.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_coriolis.py b/docs/gallery_tests/test_plot_coriolis.py
deleted file mode 100644
index 2e4cea8a74..0000000000
--- a/docs/gallery_tests/test_plot_coriolis.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-
-import iris.tests as tests
-
-from . import gallerytest_util
-
-with gallerytest_util.add_gallery_to_path():
- import plot_coriolis
-
-
-class TestCoriolisPlot(tests.GraphicsTest):
- """Test the Coriolis Plot gallery code."""
-
- def test_plot_coriolis(self):
- with gallerytest_util.show_replaced_by_check_graphic(self):
- plot_coriolis.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_cross_section.py b/docs/gallery_tests/test_plot_cross_section.py
deleted file mode 100644
index b0878d10bc..0000000000
--- a/docs/gallery_tests/test_plot_cross_section.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestCrossSection(tests.GraphicsTest):
- """Test the cross_section gallery code."""
-
- def test_plot_cross_section(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_cross_section
- with show_replaced_by_check_graphic(self):
- plot_cross_section.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_custom_aggregation.py b/docs/gallery_tests/test_plot_custom_aggregation.py
deleted file mode 100644
index 9d0a40dd3c..0000000000
--- a/docs/gallery_tests/test_plot_custom_aggregation.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestCustomAggregation(tests.GraphicsTest):
- """Test the custom aggregation gallery code."""
-
- def test_plot_custom_aggregation(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_custom_aggregation
- with show_replaced_by_check_graphic(self):
- plot_custom_aggregation.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_custom_file_loading.py b/docs/gallery_tests/test_plot_custom_file_loading.py
deleted file mode 100644
index 4d0d603a22..0000000000
--- a/docs/gallery_tests/test_plot_custom_file_loading.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestCustomFileLoading(tests.GraphicsTest):
- """Test the custom_file_loading gallery code."""
-
- def test_plot_custom_file_loading(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_custom_file_loading
- with show_replaced_by_check_graphic(self):
- plot_custom_file_loading.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_deriving_phenomena.py b/docs/gallery_tests/test_plot_deriving_phenomena.py
deleted file mode 100644
index ef2f8cec87..0000000000
--- a/docs/gallery_tests/test_plot_deriving_phenomena.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestDerivingPhenomena(tests.GraphicsTest):
- """Test the deriving_phenomena gallery code."""
-
- def test_plot_deriving_phenomena(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_deriving_phenomena
- with show_replaced_by_check_graphic(self):
- plot_deriving_phenomena.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_global_map.py b/docs/gallery_tests/test_plot_global_map.py
deleted file mode 100644
index 16f769deae..0000000000
--- a/docs/gallery_tests/test_plot_global_map.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestGlobalMap(tests.GraphicsTest):
- """Test the global_map gallery code."""
-
- def test_plot_global_map(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_global_map
- with show_replaced_by_check_graphic(self):
- plot_global_map.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_hovmoller.py b/docs/gallery_tests/test_plot_hovmoller.py
deleted file mode 100644
index 29c0e72e05..0000000000
--- a/docs/gallery_tests/test_plot_hovmoller.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestGlobalMap(tests.GraphicsTest):
- """Test the hovmoller gallery code."""
-
- def test_plot_hovmoller(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_hovmoller
- with show_replaced_by_check_graphic(self):
- plot_hovmoller.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_inset.py b/docs/gallery_tests/test_plot_inset.py
deleted file mode 100644
index 739e0a3224..0000000000
--- a/docs/gallery_tests/test_plot_inset.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestInsetPlot(tests.GraphicsTest):
- """Test the inset plot gallery code."""
-
- def test_plot_inset(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_inset
- with show_replaced_by_check_graphic(self):
- plot_inset.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_lagged_ensemble.py b/docs/gallery_tests/test_plot_lagged_ensemble.py
deleted file mode 100644
index f0a0201613..0000000000
--- a/docs/gallery_tests/test_plot_lagged_ensemble.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestLaggedEnsemble(tests.GraphicsTest):
- """Test the lagged ensemble gallery code."""
-
- def test_plot_lagged_ensemble(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_lagged_ensemble
- with show_replaced_by_check_graphic(self):
- plot_lagged_ensemble.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_lineplot_with_legend.py b/docs/gallery_tests/test_plot_lineplot_with_legend.py
deleted file mode 100644
index 5677667026..0000000000
--- a/docs/gallery_tests/test_plot_lineplot_with_legend.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestLineplotWithLegend(tests.GraphicsTest):
- """Test the lineplot_with_legend gallery code."""
-
- def test_plot_lineplot_with_legend(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_lineplot_with_legend
- with show_replaced_by_check_graphic(self):
- plot_lineplot_with_legend.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_load_nemo.py b/docs/gallery_tests/test_plot_load_nemo.py
deleted file mode 100644
index f250dc46b4..0000000000
--- a/docs/gallery_tests/test_plot_load_nemo.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestLoadNemo(tests.GraphicsTest):
- """Test the load_nemo gallery code."""
-
- def test_plot_load_nemo(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_load_nemo
- with show_replaced_by_check_graphic(self):
- plot_load_nemo.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_orca_projection.py b/docs/gallery_tests/test_plot_orca_projection.py
deleted file mode 100644
index c4058c996e..0000000000
--- a/docs/gallery_tests/test_plot_orca_projection.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestOrcaProjection(tests.GraphicsTest):
- """Test the orca projection gallery code."""
-
- def test_plot_orca_projection(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_orca_projection
- with show_replaced_by_check_graphic(self):
- plot_orca_projection.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_polar_stereo.py b/docs/gallery_tests/test_plot_polar_stereo.py
deleted file mode 100644
index 4d32ee5830..0000000000
--- a/docs/gallery_tests/test_plot_polar_stereo.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestPolarStereo(tests.GraphicsTest):
- """Test the polar_stereo gallery code."""
-
- def test_plot_polar_stereo(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_polar_stereo
- with show_replaced_by_check_graphic(self):
- plot_polar_stereo.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_polynomial_fit.py b/docs/gallery_tests/test_plot_polynomial_fit.py
deleted file mode 100644
index b522dcf43c..0000000000
--- a/docs/gallery_tests/test_plot_polynomial_fit.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestPolynomialFit(tests.GraphicsTest):
- """Test the polynomial_fit gallery code."""
-
- def test_plot_polynomial_fit(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_polynomial_fit
- with show_replaced_by_check_graphic(self):
- plot_polynomial_fit.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_projections_and_annotations.py b/docs/gallery_tests/test_plot_projections_and_annotations.py
deleted file mode 100644
index 1c24202251..0000000000
--- a/docs/gallery_tests/test_plot_projections_and_annotations.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestProjectionsAndAnnotations(tests.GraphicsTest):
- """Test the atlantic_profiles gallery code."""
-
- def test_plot_projections_and_annotations(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_projections_and_annotations
- with show_replaced_by_check_graphic(self):
- plot_projections_and_annotations.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_rotated_pole_mapping.py b/docs/gallery_tests/test_plot_rotated_pole_mapping.py
deleted file mode 100644
index cd9b04fc66..0000000000
--- a/docs/gallery_tests/test_plot_rotated_pole_mapping.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestRotatedPoleMapping(tests.GraphicsTest):
- """Test the rotated_pole_mapping gallery code."""
-
- def test_plot_rotated_pole_mapping(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_rotated_pole_mapping
- with show_replaced_by_check_graphic(self):
- plot_rotated_pole_mapping.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_wind_barbs.py b/docs/gallery_tests/test_plot_wind_barbs.py
deleted file mode 100644
index 6003860a5e..0000000000
--- a/docs/gallery_tests/test_plot_wind_barbs.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests # isort:skip
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestWindBarbs(tests.GraphicsTest):
- """Test the wind_barbs example code."""
-
- def test_wind_barbs(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_wind_barbs
- with show_replaced_by_check_graphic(self):
- plot_wind_barbs.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/gallery_tests/test_plot_wind_speed.py b/docs/gallery_tests/test_plot_wind_speed.py
deleted file mode 100644
index ebaf97adbe..0000000000
--- a/docs/gallery_tests/test_plot_wind_speed.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright Iris contributors
-#
-# This file is part of Iris and is released under the LGPL license.
-# See COPYING and COPYING.LESSER in the root of the repository for full
-# licensing details.
-
-# Import Iris tests first so that some things can be initialised before
-# importing anything else.
-import iris.tests as tests
-
-from .gallerytest_util import (
- add_gallery_to_path,
- fail_any_deprecation_warnings,
- show_replaced_by_check_graphic,
-)
-
-
-class TestWindSpeed(tests.GraphicsTest):
- """Test the wind_speed gallery code."""
-
- def test_plot_wind_speed(self):
- with fail_any_deprecation_warnings():
- with add_gallery_to_path():
- import plot_wind_speed
- with show_replaced_by_check_graphic(self):
- plot_wind_speed.main()
-
-
-if __name__ == "__main__":
- tests.main()
diff --git a/docs/src/Makefile b/docs/src/Makefile
index c693a2c900..37c2e9e3e6 100644
--- a/docs/src/Makefile
+++ b/docs/src/Makefile
@@ -16,7 +16,7 @@ PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-.PHONY: help clean html html-noplot dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+.PHONY: help clean html html-noplot dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest show
help:
@echo "Please use \`make ' where is one of"
@@ -36,6 +36,7 @@ help:
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " show to open the built documentation in the default browser"
clean:
-rm -rf $(BUILDDIR)
@@ -153,3 +154,6 @@ doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
+
+show:
+ @python -c "import webbrowser; webbrowser.open_new_tab('file://$(shell pwd)/$(BUILDDIR)/html/index.html')"
\ No newline at end of file
diff --git a/docs/src/_templates/custom_sidebar_logo_version.html b/docs/src/_templates/custom_sidebar_logo_version.html
index 48bbe604a0..c9d9ac6e2e 100644
--- a/docs/src/_templates/custom_sidebar_logo_version.html
+++ b/docs/src/_templates/custom_sidebar_logo_version.html
@@ -1,20 +1,26 @@
{% if on_rtd %}
{% if rtd_version == 'latest' %}
-
+
{% elif rtd_version == 'stable' %}
-
+
+
+ {% elif rtd_version_type == 'tag' %}
+ {# Covers builds for specific tags, including RC's. #}
+
+
{% else %}
-
-
+ {# Anything else build by RTD will be the HEAD of an activated branch #}
+
+
{% endif %}
{%- else %}
{# not on rtd #}
-
-
+
+
{%- endif %}
diff --git a/docs/src/common_links.inc b/docs/src/common_links.inc
index 7ae2463ca9..ec7e1efd6d 100644
--- a/docs/src/common_links.inc
+++ b/docs/src/common_links.inc
@@ -53,6 +53,7 @@
.. _@cpelley: https://github.com/cpelley
.. _@djkirkham: https://github.com/djkirkham
.. _@DPeterK: https://github.com/DPeterK
+.. _@ESadek-MO: https://github.com/ESadek-MO
.. _@esc24: https://github.com/esc24
.. _@jamesp: https://github.com/jamesp
.. _@jonseddon: https://github.com/jonseddon
diff --git a/docs/src/conf.py b/docs/src/conf.py
index 4fe2513bb1..33864c4658 100644
--- a/docs/src/conf.py
+++ b/docs/src/conf.py
@@ -20,15 +20,16 @@
# ----------------------------------------------------------------------------
import datetime
+from importlib.metadata import version as get_version
import ntpath
import os
from pathlib import Path
import re
+from subprocess import run
import sys
+from urllib.parse import quote
import warnings
-import iris
-
# function to write useful output to stdout, prefixing the source.
def autolog(message):
@@ -43,11 +44,21 @@ def autolog(message):
# This is the rtd reference to the version, such as: latest, stable, v3.0.1 etc
rtd_version = os.environ.get("READTHEDOCS_VERSION")
+if rtd_version is not None:
+ # Make rtd_version safe for use in shields.io badges.
+ rtd_version = rtd_version.replace("_", "__")
+ rtd_version = rtd_version.replace("-", "--")
+ rtd_version = quote(rtd_version)
+
+# branch, tag, external (for pull request builds), or unknown.
+rtd_version_type = os.environ.get("READTHEDOCS_VERSION_TYPE")
# For local testing purposes we can force being on RTD and the version
# on_rtd = True # useful for testing
# rtd_version = "latest" # useful for testing
# rtd_version = "stable" # useful for testing
+# rtd_version_type = "tag" # useful for testing
+# rtd_version = "my_branch" # useful for testing
if on_rtd:
autolog("Build running on READTHEDOCS server")
@@ -85,21 +96,11 @@ def autolog(message):
author = "Iris Developers"
# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-
-# The short X.Y version.
-if iris.__version__ == "dev":
- version = "dev"
-else:
- # major.minor.patch-dev -> major.minor.patch
- version = ".".join(iris.__version__.split("-")[0].split(".")[:3])
-
-# The full version, including alpha/beta/rc tags.
-release = iris.__version__
-
-autolog("Iris Version = {}".format(version))
-autolog("Iris Release = {}".format(release))
+# |version|, also used in various other places throughout the built documents.
+version = get_version("scitools-iris")
+release = version
+autolog(f"Iris Version = {version}")
+autolog(f"Iris Release = {release}")
# -- General configuration ---------------------------------------------------
@@ -233,6 +234,7 @@ def _dotv(version):
"numpy": ("https://numpy.org/doc/stable/", None),
"python": ("https://docs.python.org/3/", None),
"scipy": ("https://docs.scipy.org/doc/scipy/", None),
+ "pandas": ("https://pandas.pydata.org/docs/", None),
}
# The name of the Pygments (syntax highlighting) style to use.
@@ -310,6 +312,9 @@ def _dotv(version):
"show_toc_level": 1,
}
+rev_parse = run(["git", "rev-parse", "--short", "HEAD"], capture_output=True)
+commit_sha = rev_parse.stdout.decode().strip()
+
html_context = {
# pydata_theme
"github_repo": "iris",
@@ -319,9 +324,11 @@ def _dotv(version):
# custom
"on_rtd": on_rtd,
"rtd_version": rtd_version,
+ "rtd_version_type": rtd_version_type,
"version": version,
"copyright_years": copyright_years,
"python_version": build_python_version,
+ "commit_sha": commit_sha,
}
# Add any paths that contain custom static files (such as style sheets) here,
@@ -376,6 +383,11 @@ def _dotv(version):
"ignore_pattern": r"__init__\.py",
# force gallery building, unless overridden (see src/Makefile)
"plot_gallery": "'True'",
+ # force re-registering of nc-time-axis with matplotlib for each example,
+ # required for sphinx-gallery>=0.11.0
+ "reset_modules": (
+ lambda gallery_conf, fname: sys.modules.pop("nc_time_axis", None),
+ ),
}
# -----------------------------------------------------------------------------
diff --git a/docs/src/developers_guide/contributing_documentation_full.rst b/docs/src/developers_guide/contributing_documentation_full.rst
index 46f9c563d1..41314e80ac 100755
--- a/docs/src/developers_guide/contributing_documentation_full.rst
+++ b/docs/src/developers_guide/contributing_documentation_full.rst
@@ -61,7 +61,10 @@ If you wish to run a full clean build you can run::
make clean
make html
-This is useful for a final test before committing your changes.
+This is useful for a final test before committing your changes. Having built
+the documentation, you can view them in your default browser via::
+
+ make show
.. note:: In order to preserve a clean build for the html, all **warnings**
have been promoted to be **errors** to ensure they are addressed.
@@ -72,14 +75,20 @@ This is useful for a final test before committing your changes.
Testing
~~~~~~~
-There are a ways to test various aspects of the documentation. The
-``make`` commands shown below can be run in the ``docs`` or
-``docs/src`` directory.
+There are various ways to test aspects of the documentation.
Each :ref:`contributing.documentation.gallery` entry has a corresponding test.
-To run the tests::
+To run all the gallery tests::
+
+ pytest -v docs/gallery_tests/test_gallery_examples.py
+
+To run a test for a single gallery example, use the ``pytest -k`` option for
+pattern matching, e.g.::
+
+ pytest -v -k plot_coriolis docs/gallery_tests/test_gallery_examples.py
- make gallerytest
+The ``make`` commands shown below can be run in the ``docs`` or ``docs/src``
+directory.
Many documentation pages includes python code itself that can be run to ensure
it is still valid or to demonstrate examples. To ensure these tests pass
@@ -147,7 +156,7 @@ can exclude the module from the API documentation. Add the entry to the
Gallery
~~~~~~~
-The Iris :ref:`sphx_glr_generated_gallery` uses a sphinx extension named
+The Iris :ref:`gallery_index` uses a sphinx extension named
`sphinx-gallery `_
that auto generates reStructuredText (rst) files based upon a gallery source
directory that abides directory and filename convention.
diff --git a/docs/src/developers_guide/contributing_running_tests.rst b/docs/src/developers_guide/contributing_running_tests.rst
index b9b89b3336..f60cedba05 100644
--- a/docs/src/developers_guide/contributing_running_tests.rst
+++ b/docs/src/developers_guide/contributing_running_tests.rst
@@ -5,13 +5,22 @@
Running the Tests
*****************
-Using setuptools for Testing Iris
-=================================
+There are two options for running the tests:
-.. warning:: The `setuptools`_ ``test`` command was deprecated in `v41.5.0`_. See :ref:`using nox`.
+* Use an environment you created yourself. This requires more manual steps to
+ set up, but gives you more flexibility. For example, you can run a subset of
+ the tests or use ``python`` interactively to investigate any issues. See
+ :ref:`test manual env`.
-A prerequisite of running the tests is to have the Python environment
-setup. For more information on this see :ref:`installing_from_source`.
+* Use ``nox``. This will automatically generate an environment and run test
+ sessions consistent with our GitHub continuous integration. See :ref:`using nox`.
+
+.. _test manual env:
+
+Testing Iris in a Manually Created Environment
+==============================================
+
+To create a suitable environment for running the tests, see :ref:`installing_from_source`.
Many Iris tests will use data that may be defined in the test itself, however
this is not always the case as sometimes example files may be used. Due to
@@ -32,74 +41,69 @@ The example command below uses ``~/projects`` as the parent directory::
git clone git@github.com:SciTools/iris-test-data.git
export OVERRIDE_TEST_DATA_REPOSITORY=~/projects/iris-test-data/test_data
-All the Iris tests may be run from the root ``iris`` project directory via::
-
- python setup.py test
-
-You can also run a specific test, the example below runs the tests for
-mapping::
-
- cd lib/iris/tests
- python test_mapping.py
-
-When running the test directly as above you can view the command line options
-using the commands ``python test_mapping.py -h`` or
-``python test_mapping.py --help``.
-
-.. tip:: A useful command line option to use is ``-d``. This will display
- matplotlib_ figures as the tests are run. For example::
-
- python test_mapping.py -d
+All the Iris tests may be run from the root ``iris`` project directory using
+``pytest``. For example::
- You can also use the ``-d`` command line option when running all
- the tests but this will take a while to run and will require the
- manual closing of each of the figures for the tests to continue.
+ pytest -n 2
-The output from running the tests is verbose as it will run ~5000 separate
-tests. Below is a trimmed example of the output::
+will run the tests across two processes. For more options, use the command
+``pytest -h``. Below is a trimmed example of the output::
- running test
- Running test suite(s): default
+ ============================= test session starts ==============================
+ platform linux -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
+ rootdir: /path/to/git/clone/iris, configfile: pyproject.toml, testpaths: lib/iris
+ plugins: xdist-2.5.0, forked-1.4.0
+ gw0 I / gw1 I
+ gw0 [6361] / gw1 [6361]
- Running test discovery on iris.tests with 2 processors.
- test_circular_subset (iris.tests.experimental.regrid.test_regrid_area_weighted_rectilinear_src_and_grid.TestAreaWeightedRegrid) ... ok
- test_cross_section (iris.tests.experimental.regrid.test_regrid_area_weighted_rectilinear_src_and_grid.TestAreaWeightedRegrid) ... ok
- test_different_cs (iris.tests.experimental.regrid.test_regrid_area_weighted_rectilinear_src_and_grid.TestAreaWeightedRegrid) ... ok
+ ........................................................................ [ 1%]
+ ........................................................................ [ 2%]
+ ........................................................................ [ 3%]
...
+ .......................ssssssssssssssssss............................... [ 99%]
+ ........................ [100%]
+ =============================== warnings summary ===============================
...
- test_ellipsoid (iris.tests.unit.experimental.raster.test_export_geotiff.TestProjection) ... SKIP: Test requires 'gdal'.
- test_no_ellipsoid (iris.tests.unit.experimental.raster.test_export_geotiff.TestProjection) ... SKIP: Test requires 'gdal'.
+ -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
+ =========================== short test summary info ============================
+ SKIPPED [1] lib/iris/tests/experimental/test_raster.py:152: Test requires 'gdal'.
+ SKIPPED [1] lib/iris/tests/experimental/test_raster.py:155: Test requires 'gdal'.
...
- ...
- test_slice (iris.tests.test_util.TestAsCompatibleShape) ... ok
- test_slice_and_transpose (iris.tests.test_util.TestAsCompatibleShape) ... ok
- test_transpose (iris.tests.test_util.TestAsCompatibleShape) ... ok
-
- ----------------------------------------------------------------------
- Ran 4762 tests in 238.649s
-
- OK (SKIP=22)
+ ========= 6340 passed, 21 skipped, 1659 warnings in 193.57s (0:03:13) ==========
There may be some tests that have been **skipped**. This is due to a Python
decorator being present in the test script that will intentionally skip a test
if a certain condition is not met. In the example output above there are
-**22** skipped tests, at the point in time when this was run this was primarily
-due to an experimental dependency not being present.
-
+**21** skipped tests. At the point in time when this was run this was due to an
+experimental dependency not being present.
.. tip::
The most common reason for tests to be skipped is when the directory for the
``iris-test-data`` has not been set which would shows output such as::
- test_coord_coord_map (iris.tests.test_plot.Test1dScatter) ... SKIP: Test(s) require external data.
- test_coord_coord (iris.tests.test_plot.Test1dScatter) ... SKIP: Test(s) require external data.
- test_coord_cube (iris.tests.test_plot.Test1dScatter) ... SKIP: Test(s) require external data.
-
+ SKIPPED [1] lib/iris/tests/unit/fileformats/test_rules.py:157: Test(s) require external data.
+ SKIPPED [1] lib/iris/tests/unit/fileformats/pp/test__interpret_field.py:97: Test(s) require external data.
+ SKIPPED [1] lib/iris/tests/unit/util/test_demote_dim_coord_to_aux_coord.py:29: Test(s) require external data.
+
All Python decorators that skip tests will be defined in
``lib/iris/tests/__init__.py`` with a function name with a prefix of
``skip_``.
+You can also run a specific test module. The example below runs the tests for
+mapping::
+
+ cd lib/iris/tests
+ python test_mapping.py
+
+When running the test directly as above you can view the command line options
+using the commands ``python test_mapping.py -h`` or
+``python test_mapping.py --help``.
+
+.. tip:: A useful command line option to use is ``-d``. This will display
+ matplotlib_ figures as the tests are run. For example::
+
+ python test_mapping.py -d
.. _using nox:
diff --git a/docs/src/developers_guide/github_app.rst b/docs/src/developers_guide/github_app.rst
index 338166fd76..402cfe0c75 100644
--- a/docs/src/developers_guide/github_app.rst
+++ b/docs/src/developers_guide/github_app.rst
@@ -8,6 +8,15 @@ Token GitHub App
This section of the documentation is applicable only to GitHub `SciTools`_
Organisation **owners** and **administrators**.
+.. note::
+
+ The ``iris-actions`` GitHub App has been rebranded with the more generic
+ name ``scitools-ci``, as the app can be used for any `SciTools`_ repository,
+ not just ``iris`` specifically.
+
+ All of the following instructions are still applicable.
+
+
This section describes how to create, configure, install and use our `SciTools`_
GitHub App for generating tokens for use with *GitHub Actions* (GHA).
@@ -269,4 +278,4 @@ to generate a token for use with the `create-pull-request`_ GHA:
.. _conda-lock: https://github.com/conda-incubator/conda-lock
.. _create-pull-request: https://github.com/peter-evans/create-pull-request
.. _github-app-token: https://github.com/tibdex/github-app-token
-.. _refresh-lockfiles: https://github.com/SciTools/iris/blob/main/.github/workflows/refresh-lockfiles.yml
\ No newline at end of file
+.. _refresh-lockfiles: https://github.com/SciTools/iris/blob/main/.github/workflows/refresh-lockfiles.yml
diff --git a/docs/src/developers_guide/release.rst b/docs/src/developers_guide/release.rst
index b2de9106a2..de7aa6c719 100644
--- a/docs/src/developers_guide/release.rst
+++ b/docs/src/developers_guide/release.rst
@@ -100,12 +100,14 @@ Steps to achieve this can be found in the :ref:`iris_development_releases_steps`
The Release
-----------
-The final steps of the release are to change the version string ``__version__``
-in the source of :literal:`iris.__init__.py` and ensure the release date and details
+The final steps of the release are to ensure that the release date and details
are correct in the relevant ``whatsnew`` page within the documentation.
-Once all checks are complete, the release is cut by the creation of a new tag
-in the ``SciTools/iris`` repository.
+There is no need to update the ``iris.__version__``, as this is managed
+automatically by `setuptools-scm`_.
+
+Once all checks are complete, the release is published on GitHub by
+creating a new tag in the ``SciTools/iris`` repository.
Update conda-forge
@@ -121,6 +123,14 @@ conda package on the `conda-forge Anaconda channel`_.
Update PyPI
-----------
+.. note::
+
+ As part of our Continuous-Integration (CI), the building and publishing of
+ PyPI artifacts is now automated by a dedicated GitHub Action.
+
+ The following instructions **no longer** require to be performed manually,
+ but remain part of the documentation for reference purposes only.
+
Update the `scitools-iris`_ project on PyPI with the latest Iris release.
To do this perform the following steps.
@@ -179,14 +189,14 @@ For further details on how to test Iris, see :ref:`developer_running_tests`.
Merge Back
----------
-After the release is cut, the changes from the release branch should be merged
+After the release is published, the changes from the release branch should be merged
back onto the ``SciTools/iris`` ``main`` branch.
To achieve this, first cut a local branch from the latest ``main`` branch,
and `git merge` the :literal:`.x` release branch into it. Ensure that the
-``iris.__version__``, ``docs/src/whatsnew/index.rst``,
-and ``docs/src/whatsnew/latest.rst`` are correct, before committing these changes
-and then proposing a pull-request on the ``main`` branch of ``SciTools/iris``.
+``docs/src/whatsnew/index.rst`` and ``docs/src/whatsnew/latest.rst`` are
+correct, before committing these changes and then proposing a pull-request
+on the ``main`` branch of ``SciTools/iris``.
Point Releases
@@ -199,6 +209,11 @@ branch, and then released by tagging ``v1.9.1``.
New features shall not be included in a point release, these are for bug fixes.
+``whatsnew`` entries should be added to the existing
+``docs/src/whatsnew/v1.9.rst`` file in a new ``v1.9.1`` section. A template for
+this bugfix patches section can be found in the
+``docs/src/whatsnew/latest.rst.template`` file.
+
A point release does not require a release candidate, but the rest of the
release process is to be followed, including the merge back of changes into
``main``.
@@ -214,17 +229,14 @@ These steps assume a release for ``1.9.0`` is to be created.
Release Steps
~~~~~~~~~~~~~
-#. Create the release feature branch ``v1.9.x`` on `SciTools/iris`_.
- The only exception is for a point/bugfix release, as it should already exist
-#. Update the ``iris.__init__.py`` version string e.g., to ``1.9.0``
#. Update the ``whatsnew`` for the release:
* Use ``git`` to rename ``docs/src/whatsnew/latest.rst`` to the release
version file ``v1.9.rst``
- * Update ``docs/src/whatsnews/index.rst`` to rename ``latest.rst`` in the
- include statement and toctree.
* Use ``git`` to delete the ``docs/src/whatsnew/latest.rst.template`` file
* In ``v1.9.rst`` remove the ``[unreleased]`` caption from the page title.
+ Replace this with ``[release candidate]`` for the release candidate and
+ remove this for the actual release.
Note that, the Iris version and release date are updated automatically
when the documentation is built
* Review the file for correctness
@@ -243,6 +255,9 @@ Release Steps
#. Once all the above steps are complete, the release is cut, using
the :guilabel:`Draft a new release` button on the
`Iris release page `_
+ and targeting the release branch if it exists
+#. Create the release feature branch ``v1.9.x`` on `SciTools/iris`_ if it doesn't
+ already exist. For point/bugfix releases use the branch which already exists
Post Release Steps
@@ -250,17 +265,18 @@ Post Release Steps
#. Check the documentation has built on `Read The Docs`_. The build is
triggered by any commit to ``main``. Additionally check that the versions
- available in the pop out menu in the bottom left corner include the new
+ available in the pop out menu in the bottom right corner include the new
release version. If it is not present you will need to configure the
versions available in the **admin** dashboard in `Read The Docs`_.
#. Review the `Active Versions`_ for the ``scitools-iris`` project on
`Read The Docs`_ to ensure that the appropriate versions are ``Active``
and/or ``Hidden``. To do this ``Edit`` the appropriate version e.g.,
see `Editing v3.0.0rc0`_ (must be logged into Read the Docs).
-#. Make a new ``latest.rst`` from ``latest.rst.template`` and update the include
- statement and the toctree in ``index.rst`` to point at the new
+#. Merge back to ``main``. This should be done after all releases, including
+ the release candidate, and also after major changes to the release branch.
+#. On main, make a new ``latest.rst`` from ``latest.rst.template`` and update
+ the include statement and the toctree in ``index.rst`` to point at the new
``latest.rst``.
-#. Merge back to ``main``
.. _SciTools/iris: https://github.com/SciTools/iris
@@ -274,4 +290,5 @@ Post Release Steps
.. _rc_iris: https://anaconda.org/conda-forge/iris/labels
.. _Generating Distribution Archives: https://packaging.python.org/tutorials/packaging-projects/#generating-distribution-archives
.. _Packaging Your Project: https://packaging.python.org/guides/distributing-packages-using-setuptools/#packaging-your-project
-.. _latest CF standard names: http://cfconventions.org/standard-names.html
\ No newline at end of file
+.. _latest CF standard names: http://cfconventions.org/standard-names.html
+.. _setuptools-scm: https://github.com/pypa/setuptools_scm
diff --git a/docs/src/developers_guide/testing_tools.rst b/docs/src/developers_guide/testing_tools.rst
index f4faee084f..dd628d37fc 100755
--- a/docs/src/developers_guide/testing_tools.rst
+++ b/docs/src/developers_guide/testing_tools.rst
@@ -24,8 +24,7 @@ Custom assertions
=================
:class:`iris.tests.IrisTest` supports a variety of custom unittest-style
-assertions, such as :meth:`~iris.tests.IrisTest_nometa.assertStringEqual`,
-:meth:`~iris.tests.IrisTest_nometa.assertArrayEqual`,
+assertions, such as :meth:`~iris.tests.IrisTest_nometa.assertArrayEqual`,
:meth:`~iris.tests.IrisTest_nometa.assertArrayAlmostEqual`.
.. _create-missing:
diff --git a/docs/src/further_topics/ugrid/images/orca_grid.png b/docs/src/further_topics/ugrid/images/orca_grid.png
new file mode 100644
index 0000000000..6676e84fbb
Binary files /dev/null and b/docs/src/further_topics/ugrid/images/orca_grid.png differ
diff --git a/docs/src/further_topics/ugrid/other_meshes.rst b/docs/src/further_topics/ugrid/other_meshes.rst
index e6f477624e..38abeeca03 100644
--- a/docs/src/further_topics/ugrid/other_meshes.rst
+++ b/docs/src/further_topics/ugrid/other_meshes.rst
@@ -221,5 +221,140 @@ as the **nodes** when creating the Iris
+
+.. _ORCA_example:
+
+`NEMO`_ data on ORCA tripolar grid
+----------------------------------
+.. figure:: images/orca_grid.png
+ :width: 300
+ :alt: Plot of ORCA-gridded data from NEMO.
+
+NEMO can use various grids, but is frequently used with ORCA type grids.
+ORCA grids store global data in 2-dimensional ny * nx arrays. All cells are
+four-sided. The grids are based on tri-polar layouts, but X and Y spacings are
+irregular and not given by any defined functional forms.
+
+* arrays (ny, nx) of face-located data variables
+* arrays (ny, nx) of X+Y face centre coordinates
+* arrays (ny, nx, 4) of X+Y face corner coordinates
+ (all faces are quadrilaterals)
+
+For simplicity, we treat each face corner as an independent node, and use a face-node
+connectivity which simply lists the nodes in sequence,
+i.e. [[0, 1, 2, 3], [4, 5, 6, 7], ...].
+
+.. Note::
+ This is the simplest solution, but produces approx 4x more nodes than
+ necessary, since the coordinate bounds contain many duplicate locations.
+ Removing the duplicates is quite easy, but often not necessary.
+
+To make an unstructured cube, the data must be 'flattened' to convert the given X and Y
+dimensions into a single mesh dimension. Since Iris cubes don't support a "reshape" or
+"flatten" operations, we create a new cube from the flattened data.
+
+.. dropdown:: :opticon:`code`
+
+ .. code-block:: python
+
+ >>> import numpy as np
+ >>> import iris
+ >>> from iris.coords import AuxCoord, CellMeasure
+ >>> from iris.cube import Cube
+ >>> from iris.experimental.ugrid.mesh import Mesh, Connectivity
+
+
+ >>> filepath = iris.sample_data_path('orca2_votemper.nc')
+ >>> cube = iris.load_cube(filepath)
+ >>> print(cube)
+ sea_water_potential_temperature / (degC) (-- : 148; -- : 180)
+ Auxiliary coordinates:
+ latitude x x
+ longitude x x
+ Scalar coordinates:
+ depth 4.999938 m, bound=(0.0, 10.0) m
+ time 0001-01-01 12:00:00
+ Cell methods:
+ mean time
+ Attributes:
+ Conventions 'CF-1.5'
+
+
+ >>> co_x = cube.coord("longitude")
+ >>> co_y = cube.coord("latitude")
+ >>> ny, nx = co_x.shape
+ >>> n_faces = ny * nx
+
+ >>> # Create face coords from flattened face-points
+ >>> face_x_co = AuxCoord(co_x.points.flatten())
+ >>> face_y_co = AuxCoord(co_y.points.flatten())
+ >>> assert face_x_co.shape == (n_faces,)
+ >>> face_x_co.metadata = co_x.metadata
+ >>> face_y_co.metadata = co_y.metadata
+
+ >>> # Create node coordinates from bound points.
+ >>> n_nodes = n_faces * 4
+ >>> node_x_co = AuxCoord(co_x.bounds.flatten())
+ >>> node_y_co = AuxCoord(co_y.bounds.flatten())
+ >>> assert node_x_co.shape == (n_nodes,)
+ >>> node_x_co.metadata = co_x.metadata
+ >>> node_y_co.metadata = co_y.metadata
+
+ >>> # Create a face-node Connectivity matching the order of nodes in the bounds array
+ >>> face_node_inds = np.arange(n_nodes).reshape((n_faces, 4))
+ >>> face_nodes_conn = Connectivity(
+ ... indices=face_node_inds,
+ ... cf_role='face_node_connectivity',
+ ... long_name='face_inds', units='1',
+ ... )
+
+ >>> # Create a mesh object.
+ >>> mesh = Mesh(
+ ... topology_dimension=2,
+ ... node_coords_and_axes=[(node_x_co, 'x'), (node_y_co, 'y')],
+ ... connectivities=face_nodes_conn,
+ ... face_coords_and_axes=[(face_x_co, 'x'), (face_y_co, 'y')]
+ ... )
+ >>> print(mesh)
+ Mesh : 'unknown'
+ topology_dimension: 2
+ node
+ node_dimension: 'Mesh2d_node'
+ node coordinates
+
+
+ face
+ face_dimension: 'Mesh2d_face'
+ face_node_connectivity:
+ face coordinates
+
+
+
+
+ >>> # Create an unstructured version of the input with flattened data
+ >>> meshcube = Cube(cube.core_data().flatten())
+ >>> meshcube.metadata = cube.metadata
+
+ >>> # Attach the mesh by adding the mesh 'face' MeshCoords into the cube
+ >>> mesh_dim = meshcube.ndim - 1
+ >>> for co in mesh.to_MeshCoords('face'):
+ ... meshcube.add_aux_coord(co, mesh_dim)
+ ...
+
+ >>> print(meshcube)
+ sea_water_potential_temperature / (degC) (-- : 26640)
+ Mesh coordinates:
+ latitude x
+ longitude x
+ Mesh:
+ name unknown
+ location face
+ Cell methods:
+ mean time
+ Attributes:
+ Conventions 'CF-1.5'
+
+
.. _WAVEWATCH III: https://github.com/NOAA-EMC/WW3
.. _FESOM 1.4: https://fesom.de/models/fesom14/
+.. _NEMO: https://www.nemo-ocean.eu/
\ No newline at end of file
diff --git a/docs/src/installing.rst b/docs/src/installing.rst
index 33b15610fa..6a2d2f6131 100644
--- a/docs/src/installing.rst
+++ b/docs/src/installing.rst
@@ -119,9 +119,9 @@ Running the Tests
To ensure your setup is configured correctly you can run the test suite using
the command::
- python setup.py test
+ pytest
-For more information see :ref:`developer_running_tests`.
+For more information see :ref:`test manual env`.
Custom Site Configuration
diff --git a/docs/src/techpapers/um_files_loading.rst b/docs/src/techpapers/um_files_loading.rst
index 72d34962ce..f8c94cab08 100644
--- a/docs/src/techpapers/um_files_loading.rst
+++ b/docs/src/techpapers/um_files_loading.rst
@@ -350,7 +350,7 @@ information is contained in the :attr:`~iris.coords.Coord.units` property.
always 1st Jan 1970 (times before this are represented as negative values).
The units.calendar property of time coordinates is set from the lowest decimal
-digit of LBTIM, known as LBTIM.IC. Note that the non-gregorian calendars (e.g.
+digit of LBTIM, known as LBTIM.IC. Note that the non-standard calendars (e.g.
360-day 'model' calendar) are defined in CF, not udunits.
There are a number of different time encoding methods used in UM data, but the
diff --git a/docs/src/userguide/glossary.rst b/docs/src/userguide/glossary.rst
new file mode 100644
index 0000000000..818ef0c7ad
--- /dev/null
+++ b/docs/src/userguide/glossary.rst
@@ -0,0 +1,210 @@
+.. _glossary:
+
+Glossary
+=============
+
+.. glossary::
+
+ Cartopy
+ A python package for producing maps, and other geospatial data.
+ Allows plotting on these maps, over a range of projections.
+
+ | **Related:** :term:`Matplotlib`
+ | **More information:** `CartoPy Site `_
+ |
+
+ CF Conventions
+ Rules for storing meteorological Climate and Forecast data in
+ :term:`NetCDF Format` files, defining a standard metadata format to
+ describe what the data is.
+ This also forms the data model which iris is based on.
+
+ | **Related:** :term:`NetCDF Format`
+ | **More information:** `CF Conventions `_
+ |
+
+ Coordinate
+ A container for data points, comes in three main flavours.
+
+ - Dimensional Coordinate -
+ A coordinate that describes a single data dimension of a cube.
+ They can only contain numerical values, in a sorted order (ascending
+ or descending).
+ - Auxiliary Coordinate -
+ A coordinate that can map to multiple data dimensions. Can
+ contain any type of data.
+ - Scalar Coordinate -
+ A coordinate that is not mapped to any data dimension, instead
+ representing the cube as a whole.
+
+ | **Related:** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Cube
+ Cubes are the main method of storing data in Iris. A cube can consist of:
+
+ - Array of :term:`Phenomenon` Data (Required)
+ - :term:`Coordinates `
+ - :term:`Standard Name`
+ - :term:`Long Name`
+ - :term:`Unit`
+ - :term:`Cell Methods `
+ - :term:`Coordinate Factories `
+
+ | **Related:** :term:`NumPy`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Cell Method
+ A cell method represents that a cube's data has been derived from
+ a past statistical operation, such as a
+ MEAN or SUM operation.
+
+ | **Related:** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Coordinate Factory
+ A coordinate factory derives coordinates (sometimes referred to as
+ derived coordinates) from the values of existing coordinates.
+ E.g. A hybrid height factory might use "height above sea level"
+ and "height at ground level" coordinate data to calculate a
+ "height above ground level" coordinate.
+
+ | **Related:** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+
+ Dask
+ A data analytics python library. Iris predominantly uses Dask Arrays;
+ a collection of NumPy-esque arrays. The data is operated in batches,
+ so that not all data is in RAM at once.
+
+ | **Related:** :term:`Lazy Data` **|** :term:`NumPy`
+ | **More information:** :doc:`real_and_lazy_data`
+ |
+
+ Fields File (FF) Format
+ A meteorological file format, the output of the Unified Model.
+
+ | **Related:** :term:`GRIB Format`
+ **|** :term:`Post Processing (PP) Format` **|** :term:`NetCDF Format`
+ | **More information:** `Unified Model `_
+ |
+
+ GRIB Format
+ A WMO-standard meteorological file format.
+
+ | **Related:** :term:`Fields File (FF) Format`
+ **|** :term:`Post Processing (PP) Format` **|** :term:`NetCDF Format`
+ | **More information:** `GRIB 1 User Guide `_
+ **|** `GRIB 2 User Guide.pdf `_
+ |
+
+ Lazy Data
+ Data stored in hard drive, and then temporarily loaded into RAM in
+ batches when needed. Allows of less memory usage and faster performance,
+ thanks to parallel processing.
+
+ | **Related:** :term:`Dask` **|** :term:`Real Data`
+ | **More information:** :doc:`real_and_lazy_data`
+ |
+
+ Long Name
+ A name describing a :term:`phenomenon`, not limited to the
+ the same restraints as :term:`standard name`.
+
+ | **Related:** :term:`Standard Name` **|** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Matplotlib
+ A python package for plotting and projecting data in a wide variety
+ of formats.
+
+ | **Related:** :term:`CartoPy` **|** :term:`NumPy`
+ | **More information:** `Matplotlib `_
+ |
+
+ Metadata
+ The information which describes a phenomenon.
+ Within Iris specifically, all information which
+ distinguishes one phenomenon from another,
+ e.g. :term:`units ` or :term:`Cell Methods | `
+
+ | **Related:** :term:`Phenomenon` **|** :term:`Cube`
+ | **More information:** :doc:`../further_topics/metadata`
+ |
+
+ NetCDF Format
+ A flexible file format for storing multi-dimensional array-like data.
+ When Iris loads this format, it also especially recognises and interprets data
+ encoded according to the :term:`CF Conventions`.
+
+ | **Related:** :term:`Fields File (FF) Format`
+ **|** :term:`GRIB Format` **|** :term:`Post Processing (PP) Format`
+ | **More information:** `NetCDF-4 Python Git `_
+ |
+
+ NumPy
+ A mathematical Python library, predominantly based around
+ multi-dimensional arrays.
+
+ | **Related:** :term:`Dask` **|** :term:`Cube`
+ **|** :term:`Xarray`
+ | **More information:** `NumPy.org `_
+ |
+
+ Phenomenon
+ The primary data which is measured, usually within a cube, e.g.
+ air temperature.
+
+ | **Related:** :term:`Metadata`
+ **|** :term:`Standard Name` **|** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Post Processing (PP) Format
+ A meteorological file format, created from a post processed
+ :term:`Fields File (FF) Format`.
+
+ | **Related:** :term:`GRIB Format` **|** :term:`NetCDF Format`
+ | **More information:** `PP Wikipedia Page `_
+ |
+
+ Real Data
+ Data that has been loaded into RAM, as opposed to sitting
+ on the hard drive.
+
+ | **Related:** :term:`Lazy Data` **|** :term:`NumPy`
+ | **More information:** :doc:`real_and_lazy_data`
+ |
+
+ Standard Name
+ A name describing a :term:`phenomenon`, one from a fixed list
+ defined at `CF Standard Names `_.
+
+ | **Related:** :term:`Long Name` **|** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Unit
+ The unit with which the :term:`phenomenon` is measured e.g. m / sec.
+
+ | **Related:** :term:`Cube`
+ | **More information:** :doc:`iris_cubes`
+ |
+
+ Xarray
+ A python library for sophisticated labelled multi-dimensional operations.
+ Has a broader scope than Iris - it is not focused on meteorological data.
+
+ | **Related:** :term:`NumPy`
+ | **More information:** `Xarray Documentation `_
+ |
+
+----
+
+`To top `_
diff --git a/docs/src/userguide/index.rst b/docs/src/userguide/index.rst
index 08923e7662..fdd0c4d03e 100644
--- a/docs/src/userguide/index.rst
+++ b/docs/src/userguide/index.rst
@@ -35,6 +35,7 @@ they may serve as a useful reference for future exploration.
cube_maths
citation
code_maintenance
+ glossary
.. toctree::
diff --git a/docs/src/userguide/subsetting_a_cube.rst b/docs/src/userguide/subsetting_a_cube.rst
index 6523ab1cd7..c4f55490af 100644
--- a/docs/src/userguide/subsetting_a_cube.rst
+++ b/docs/src/userguide/subsetting_a_cube.rst
@@ -172,7 +172,7 @@ objects for ease of calendar-based testing.
>>> cube_all = iris.load_cube(filename, 'air_potential_temperature')
>>> print('All times :\n' + str(cube_all.coord('time')))
All times :
- DimCoord : time / (hours since 1970-01-01 00:00:00, gregorian calendar)
+ DimCoord : time / (hours since 1970-01-01 00:00:00, standard calendar)
points: [2009-11-19 10:00:00, 2009-11-19 11:00:00, 2009-11-19 12:00:00]
shape: (3,)
dtype: float64
@@ -182,7 +182,7 @@ objects for ease of calendar-based testing.
>>> cube_11 = cube_all.extract(hour_11)
>>> print('Selected times :\n' + str(cube_11.coord('time')))
Selected times :
- DimCoord : time / (hours since 1970-01-01 00:00:00, gregorian calendar)
+ DimCoord : time / (hours since 1970-01-01 00:00:00, standard calendar)
points: [2009-11-19 11:00:00]
shape: (1,)
dtype: float64
@@ -210,7 +210,7 @@ The previous constraint example can now be written as:
>>> print(iris.load_cube(
... iris.sample_data_path('uk_hires.pp'),
... 'air_potential_temperature' & the_11th_hour).coord('time'))
- DimCoord : time / (hours since 1970-01-01 00:00:00, gregorian calendar)
+ DimCoord : time / (hours since 1970-01-01 00:00:00, standard calendar)
points: [2009-11-19 11:00:00]
shape: (1,)
dtype: float64
@@ -234,7 +234,7 @@ day of every week for many years:
:options: +NORMALIZE_WHITESPACE, +ELLIPSIS
>>> print(long_ts.coord('time'))
- DimCoord : time / (days since 2007-04-09, gregorian calendar)
+ DimCoord : time / (days since 2007-04-09, standard calendar)
points: [
2007-04-09 00:00:00, 2007-04-16 00:00:00, ...,
2010-02-08 00:00:00, 2010-02-15 00:00:00]
@@ -255,7 +255,7 @@ we constrain that coord using :class:`iris.cube.Cube.extract`
... time=lambda cell: d1 <= cell.point < d2)
>>> within_st_swithuns_07 = long_ts.extract(st_swithuns_daterange_07)
>>> print(within_st_swithuns_07.coord('time'))
- DimCoord : time / (days since 2007-04-09, gregorian calendar)
+ DimCoord : time / (days since 2007-04-09, standard calendar)
points: [
2007-07-16 00:00:00, 2007-07-23 00:00:00, 2007-07-30 00:00:00,
2007-08-06 00:00:00, 2007-08-13 00:00:00, 2007-08-20 00:00:00]
@@ -275,7 +275,7 @@ objects.
... time=lambda cell: pdt1 <= cell.point < pdt2)
>>> within_st_swithuns_07 = long_ts.extract(st_swithuns_daterange_07)
>>> print(within_st_swithuns_07.coord('time'))
- DimCoord : time / (days since 2007-04-09, gregorian calendar)
+ DimCoord : time / (days since 2007-04-09, standard calendar)
points: [
2007-07-16 00:00:00, 2007-07-23 00:00:00, 2007-07-30 00:00:00,
2007-08-06 00:00:00, 2007-08-13 00:00:00, 2007-08-20 00:00:00]
@@ -296,7 +296,7 @@ PartialDateTime this becomes simple:
...
>>> # Note: using summary(max_values) to show more of the points
>>> print(within_st_swithuns.coord('time').summary(max_values=100))
- DimCoord : time / (days since 2007-04-09, gregorian calendar)
+ DimCoord : time / (days since 2007-04-09, standard calendar)
points: [
2007-07-16 00:00:00, 2007-07-23 00:00:00, 2007-07-30 00:00:00,
2007-08-06 00:00:00, 2007-08-13 00:00:00, 2007-08-20 00:00:00,
diff --git a/docs/src/whatsnew/3.3.rst b/docs/src/whatsnew/3.3.rst
new file mode 100644
index 0000000000..c2e47f298a
--- /dev/null
+++ b/docs/src/whatsnew/3.3.rst
@@ -0,0 +1,373 @@
+.. include:: ../common_links.inc
+
+v3.3 (1 Sep 2022)
+*****************
+
+This document explains the changes made to Iris for this release
+(:doc:`View all changes `.)
+
+
+.. dropdown:: :opticon:`report` v3.3.0 Release Highlights
+ :container: + shadow
+ :title: text-primary text-center font-weight-bold
+ :body: bg-light
+ :animate: fade-in
+ :open:
+
+ The highlights for this minor release of Iris include:
+
+ * We've added support for datums, loading them from NetCDF when the
+ :obj:`iris.FUTURE.datum_support` flag is set.
+ * We've greatly improved the speed of linear interpolation.
+ * We've added the function :func:`iris.pandas.as_cubes` for richer
+ conversion from Pandas.
+ * We've improved the functionality of :func:`iris.util.mask_cube`.
+ * We've improved the functionality and performance of the
+ :obj:`iris.analysis.PERCENTILE` aggregator.
+ * We've completed implementation of our :ref:`contributing.benchmarks`
+ infrastructure.
+
+ And finally, get in touch with us on :issue:`GitHub` if you have
+ any issues or feature requests for improving Iris. Enjoy!
+
+
+v3.3.1 (29 Sep 2022)
+====================
+
+.. dropdown:: :opticon:`alert` v3.3.1 Patches
+ :container: + shadow
+ :title: text-primary text-center font-weight-bold
+ :body: bg-light
+ :animate: fade-in
+
+ The patches in this release of Iris include:
+
+ #. `@pp-mo`_ fixed the Jupyter notebook display of :class:`~iris.cube.CubeList`.
+ (:issue:`4973`, :pull:`4976`)
+
+ #. `@pp-mo`_ fixed a bug in NAME loaders where data with no associated statistic would
+ load as a cube with invalid cell-methods, which cannot be printed or saved to netcdf.
+ (:issue:`3288`, :pull:`4933`)
+
+ #. `@pp-mo`_ ensured that :data:`iris.cube.Cube.cell_methods` must always be an iterable
+ of :class:`iris.coords.CellMethod` objects (:pull:`4933`).
+
+ #. `@trexfeathers`_ advanced the Cartopy pin to ``>=0.21``, as Cartopy's
+ change to default Transverse Mercator projection affects an Iris test.
+ See `SciTools/cartopy@fcb784d`_ and `SciTools/cartopy@8860a81`_ for more
+ details. (:pull:`4992`)
+
+ #. `@trexfeathers`_ introduced the ``netcdf4!=1.6.1`` pin to avoid a
+ problem with segfaults. (:pull:`4992`)
+
+
+📢 Announcements
+================
+
+#. Welcome to `@krikru`_ who made their first contribution to Iris 🎉
+
+
+✨ Features
+===========
+
+#. `@schlunma`_ added weighted aggregation over "group coordinates":
+ :meth:`~iris.cube.Cube.aggregated_by` now accepts the keyword `weights` if a
+ :class:`~iris.analysis.WeightedAggregator` is used. (:issue:`4581`,
+ :pull:`4589`)
+
+#. `@wjbenfold`_ added support for ``false_easting`` and ``false_northing`` to
+ :class:`~iris.coord_systems.Mercator`. (:issue:`3107`, :pull:`4524`)
+
+#. `@rcomer`_ and `@wjbenfold`_ (reviewer) implemented lazy aggregation for the
+ :obj:`iris.analysis.PERCENTILE` aggregator. (:pull:`3901`)
+
+#. `@pp-mo`_ fixed cube arithmetic operation for cubes with meshes.
+ (:issue:`4454`, :pull:`4651`)
+
+#. `@wjbenfold`_ added support for CF-compliant treatment of
+ ``standard_parallel`` and ``scale_factor_at_projection_origin`` to
+ :class:`~iris.coord_systems.Mercator`. (:issue:`3844`, :pull:`4609`)
+
+#. `@wjbenfold`_ added support datums associated with coordinate systems (e.g.
+ :class:`~iris.coord_systems.GeogCS` other subclasses of
+ :class:`~iris.coord_systems.CoordSystem`). Loading of datum information from
+ a netCDF file only happens when the :obj:`iris.FUTURE.datum_support` flag is
+ set. (:issue:`4619`, :pull:`4704`)
+
+#. `@wjbenfold`_ and `@stephenworsley`_ (reviewer) added a maximum run length
+ aggregator (:class:`~iris.analysis.MAX_RUN`). (:pull:`4676`)
+
+#. `@wjbenfold`_ and `@rcomer`_ (reviewer) added a ``climatological`` keyword to
+ :meth:`~iris.cube.Cube.aggregated_by` that causes the climatological flag to
+ be set and the point for each cell to equal its first bound, thereby
+ preserving the time of year. (:issue:`1422`, :issue:`4098`, :issue:`4665`,
+ :pull:`4723`)
+
+#. `@wjbenfold`_ and `@pp-mo`_ (reviewer) implemented the
+ :class:`~iris.coord_systems.PolarStereographic` CRS. (:issue:`4770`,
+ :pull:`4773`)
+
+#. `@rcomer`_ and `@wjbenfold`_ (reviewer) enabled passing of the
+ :func:`numpy.percentile` keywords through the :obj:`~iris.analysis.PERCENTILE`
+ aggregator. (:pull:`4791`)
+
+#. `@wjbenfold`_ and `@bjlittle`_ (reviewer) implemented
+ :func:`iris.plot.fill_between` and :func:`iris.quickplot.fill_between`.
+ (:issue:`3493`, :pull:`4647`)
+
+#. `@rcomer`_ and `@bjlittle`_ (reviewer) re-wrote :func:`iris.util.mask_cube`
+ to provide lazy evaluation and greater flexibility with respect to input types.
+ (:issue:`3936`, :pull:`4889`)
+
+#. `@stephenworsley`_ and `@lbdreyer`_ added a new kwarg ``expand_extras`` to
+ :func:`iris.util.new_axis` which can be used to specify instances of
+ :class:`~iris.coords.AuxCoord`, :class:`~iris.coords.CellMeasure` and
+ :class:`~iris.coords.AncillaryVariable` which should also be expanded to map
+ to the new axis. (:pull:`4896`)
+
+#. `@stephenworsley`_ updated to the latest CF Standard Names Table ``v79``
+ (19 March 2022). (:pull:`4910`)
+
+#. `@trexfeathers`_ and `@lbdreyer`_ (reviewer) added
+ :func:`iris.pandas.as_cubes`, which provides richer conversion from
+ Pandas :class:`~pandas.Series` / :class:`~pandas.DataFrame`\s to one or more
+ :class:`~iris.cube.Cube`\s. This includes: n-dimensional datasets,
+ :class:`~iris.coords.AuxCoord`\s, :class:`~iris.coords.CellMeasure`\s,
+ :class:`~iris.coords.AncillaryVariable`\s, and multi-dimensional
+ coordinates. (:pull:`4890`)
+
+
+🐛 Bugs Fixed
+=============
+
+#. `@rcomer`_ reverted part of the change from :pull:`3906` so that
+ :func:`iris.plot.plot` no longer defaults to placing a "Y" coordinate (e.g.
+ latitude) on the y-axis of the plot. (:issue:`4493`, :pull:`4601`)
+
+#. `@rcomer`_ enabled passing of scalar objects to :func:`~iris.plot.plot` and
+ :func:`~iris.plot.scatter`. (:pull:`4616`)
+
+#. `@rcomer`_ fixed :meth:`~iris.cube.Cube.aggregated_by` with `mdtol` for 1D
+ cubes where an aggregated section is entirely masked, reported at
+ :issue:`3190`. (:pull:`4246`)
+
+#. `@rcomer`_ ensured that a :class:`matplotlib.axes.Axes`'s position is preserved
+ when Iris replaces it with a :class:`cartopy.mpl.geoaxes.GeoAxes`, fixing
+ :issue:`1157`. (:pull:`4273`)
+
+#. `@rcomer`_ fixed :meth:`~iris.coords.Coord.nearest_neighbour_index` for edge
+ cases where the requested point is float and the coordinate has integer
+ bounds, reported at :issue:`2969`. (:pull:`4245`)
+
+#. `@rcomer`_ modified bounds setting on :obj:`~iris.coords.DimCoord` instances
+ so that the order of the cell bounds is automatically reversed
+ to match the coordinate's direction if necessary. This is consistent with
+ the `Bounds for 1-D coordinate variables` subsection of the `Cell Boundaries`_
+ section of the CF Conventions and ensures that contiguity is preserved if a
+ coordinate's direction is reversed. (:issue:`3249`, :issue:`423`,
+ :issue:`4078`, :issue:`3756`, :pull:`4466`)
+
+#. `@wjbenfold`_ and `@evertrol`_ prevented an ``AttributeError`` being logged
+ to ``stderr`` when a :class:`~iris.fileformats.cf.CFReader` that fails to
+ initialise is garbage collected. (:issue:`3312`, :pull:`4646`)
+
+#. `@wjbenfold`_ fixed plotting of circular coordinates to extend kwarg arrays
+ as well as the data. (:issue:`466`, :pull:`4649`)
+
+#. `@wjbenfold`_ and `@rcomer`_ (reviewer) corrected the axis on which masking
+ is applied when an aggregator adds a trailing dimension. (:pull:`4755`)
+
+#. `@rcomer`_ and `@pp-mo`_ ensured that all methods to create or modify a
+ :class:`iris.cube.CubeList` check that it only contains cubes. According to
+ code comments, this was supposedly already the case, but there were several bugs
+ and loopholes. (:issue:`1897`, :pull:`4767`)
+
+#. `@rcomer`_ modified cube arithmetic to handle mismatches in the cube's data
+ array type. This prevents masks being lost in some cases and therefore
+ resolves :issue:`2987`. (:pull:`3790`)
+
+#. `@krikru`_ and `@rcomer`_ updated :mod:`iris.quickplot` such that the
+ colorbar is added to the correct ``axes`` when specified as a keyword
+ argument to a plotting routine. Otherwise, by default the colorbar will be
+ added to the current axes of the current figure. (:pull:`4894`)
+
+#. `@rcomer`_ and `@bjlittle`_ (reviewer) modified :func:`iris.util.mask_cube` so it
+ either works in place or returns a new cube (:issue:`3717`, :pull:`4889`)
+
+
+💣 Incompatible Changes
+=======================
+
+#. `@rcomer`_ and `@bjlittle`_ (reviewer) updated Iris's calendar handling to be
+ consistent with ``cf-units`` version 3.1. In line with the `Calendar`_
+ section in version 1.9 of the CF Conventions, we now use "standard" rather
+ than the deprecated "gregorian" label for the default calendar. Units may
+ still be instantiated with ``calendar="gregorian"`` but their calendar
+ attribute will be silently changed to "standard". This may cause failures in
+ code that explicitly checks the calendar attribute. (:pull:`4847`)
+
+
+🚀 Performance
+==============
+
+#. `@wjbenfold`_ added caching to the calculation of the points array in a
+ :class:`~iris.coords.DimCoord` created using
+ :meth:`~iris.coords.DimCoord.from_regular`. (:pull:`4698`)
+
+#. `@wjbenfold`_ introduced caching in :func:`_lazy_data._optimum_chunksize` and
+ :func:`iris.fileformats.pp_load_rules._epoch_date_hours` to reduce time spent
+ repeating calculations. (:pull:`4716`)
+
+#. `@pp-mo`_ made :meth:`~iris.cube.Cube.add_aux_factory` faster.
+ (:pull:`4718`)
+
+#. `@wjbenfold`_ and `@rcomer`_ (reviewer) permitted the fast percentile
+ aggregation method to be used on masked data when the missing data tolerance
+ is set to 0. (:issue:`4735`, :pull:`4755`)
+
+#. `@wjbenfold`_ improved the speed of linear interpolation using
+ :meth:`iris.analysis.trajectory.interpolate` (:pull:`4366`)
+
+#. NumPy ``v1.23`` behaviour changes mean that
+ :func:`iris.experimental.ugrid.utils.recombine_submeshes` now uses ~3x as
+ much memory; testing shows a ~16-million point mesh will now use ~600MB.
+ Investigated by `@pp-mo`_ and `@trexfeathers`_. (:issue:`4845`)
+
+
+🔥 Deprecations
+===============
+
+#. `@trexfeathers`_ and `@lbdreyer`_ (reviewer) deprecated
+ :func:`iris.pandas.as_cube` in favour of the new
+ :func:`iris.pandas.as_cubes` - see `✨ Features`_ for more details.
+ (:pull:`4890`)
+
+
+🔗 Dependencies
+===============
+
+#. `@rcomer`_ introduced the ``nc-time-axis >=1.4`` minimum pin, reflecting that
+ we no longer use the deprecated :class:`nc_time_axis.CalendarDateTime`
+ when plotting against time coordinates. (:pull:`4584`)
+
+#. `@wjbenfold`_ and `@bjlittle`_ (reviewer) unpinned ``pillow``. (:pull:`4826`)
+
+#. `@rcomer`_ introduced the ``cf-units >=3.1`` minimum pin, reflecting the
+ alignment of calendar behaviour in the two packages (see Incompatible Changes).
+ (:pull:`4847`)
+
+#. `@bjlittle`_ introduced the ``sphinx-gallery >=0.11.0`` minimum pin.
+ (:pull:`4885`)
+
+#. `@trexfeathers`_ updated the install process to work with setuptools
+ ``>=v64``, making ``v64`` the minimum compatible version. (:pull:`4903`)
+
+#. `@stephenworsley`_ and `@trexfeathers`_ introduced the ``shapely !=1.8.3``
+ pin, avoiding a bug caused by its interaction with cartopy.
+ (:pull:`4911`, :pull:`4917`)
+
+
+📚 Documentation
+================
+
+#. `@tkknight`_ added a page to show the issues that have been voted for. See
+ :ref:`voted_issues_top`. (:issue:`3307`, :pull:`4617`)
+
+#. `@wjbenfold`_ added a note about fixing proxy URLs in lockfiles generated
+ because dependencies have changed. (:pull:`4666`)
+
+#. `@lbdreyer`_ moved most of the User Guide's :class:`iris.Constraint` examples
+ from :ref:`loading_iris_cubes` to :ref:`cube_extraction` and added an
+ example of constraining on bounded time. (:pull:`4656`)
+
+#. `@tkknight`_ adopted the `PyData Sphinx Theme`_ for the documentation.
+ (:discussion:`4344`, :pull:`4661`)
+
+#. `@tkknight`_ updated our developers guidance to show our intent to adopt
+ numpydoc strings and fixed some API documentation rendering.
+ See :ref:`docstrings`. (:issue:`4657`, :pull:`4689`)
+
+#. `@trexfeathers`_ and `@lbdreyer`_ added a page with examples of converting
+ various mesh formats into the Iris Mesh Data Model. (:pull:`4739`)
+
+#. `@rcomer`_ updated the "Load a Time Series of Data From the NEMO Model"
+ gallery example. (:pull:`4741`)
+
+#. `@wjbenfold`_ added developer documentation to highlight some of the
+ utilities offered by :class:`iris.IrisTest` and how to update CML and other
+ output files. (:issue:`4544`, :pull:`4600`)
+
+#. `@trexfeathers`_ and `@abooton`_ modernised the Iris logo to be SVG format.
+ (:pull:`3935`)
+
+
+💼 Internal
+===========
+
+#. `@trexfeathers`_ and `@pp-mo`_ finished implementing a mature benchmarking
+ infrastructure (see :ref:`contributing.benchmarks`), building on 2 hard
+ years of lessons learned 🎉. (:pull:`4477`, :pull:`4562`, :pull:`4571`,
+ :pull:`4583`, :pull:`4621`)
+
+#. `@wjbenfold`_ used the aforementioned benchmarking infrastructure to
+ introduce deep (large 3rd dimension) loading and realisation benchmarks.
+ (:pull:`4654`)
+
+#. `@wjbenfold`_ made :func:`iris.tests.stock.simple_1d` respect the
+ ``with_bounds`` argument. (:pull:`4658`)
+
+#. `@lbdreyer`_ replaced `nose`_ with `pytest`_ as Iris' test runner.
+ (:pull:`4734`)
+
+#. `@bjlittle`_ and `@trexfeathers`_ (reviewer) migrated to GitHub Actions
+ for Continuous-Integration. (:pull:`4503`)
+
+#. `@pp-mo`_ made tests run certain linux executables from the Python env,
+ specifically ncdump and ncgen. These could otherwise fail when run in IDEs
+ such as PyCharm and Eclipse, which don't automatically include the Python env
+ bin in the system PATH.
+ (:pull:`4794`)
+
+#. `@trexfeathers`_ and `@pp-mo`_ improved generation of stock NetCDF files.
+ (:pull:`4827`, :pull:`4836`)
+
+#. `@rcomer`_ removed some now redundant testing functions. (:pull:`4838`,
+ :pull:`4878`)
+
+#. `@bjlittle`_ and `@jamesp`_ (reviewer) and `@lbdreyer`_ (reviewer) extended
+ the GitHub Continuous-Integration to cover testing on ``py38``, ``py39``,
+ and ``py310``. (:pull:`4840`)
+
+#. `@bjlittle`_ and `@trexfeathers`_ (reviewer) adopted `setuptools-scm`_ for
+ automated ``iris`` package versioning. (:pull:`4841`)
+
+#. `@bjlittle`_ and `@trexfeathers`_ (reviewer) added building, testing and
+ publishing of ``iris`` PyPI ``sdist`` and binary ``wheels`` as part of
+ our GitHub Continuous-Integration. (:pull:`4849`)
+
+#. `@rcomer`_ and `@wjbenfold`_ (reviewer) used ``pytest`` parametrization to
+ streamline the gallery test code. (:pull:`4792`)
+
+#. `@trexfeathers`_ improved settings to better working with
+ ``setuptools_scm``. (:pull:`4925`)
+
+
+.. comment
+ Whatsnew author names (@github name) in alphabetical order. Note that,
+ core dev names are automatically included by the common_links.inc:
+
+.. _@evertrol: https://github.com/evertrol
+.. _@krikru: https://github.com/krikru
+
+
+.. comment
+ Whatsnew resources in alphabetical order:
+
+.. _Calendar: https://cfconventions.org/Data/cf-conventions/cf-conventions-1.9/cf-conventions.html#calendar
+.. _Cell Boundaries: https://cfconventions.org/Data/cf-conventions/cf-conventions-1.9/cf-conventions.html#cell-boundaries
+.. _nose: https://nose.readthedocs.io
+.. _PyData Sphinx Theme: https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html
+.. _pytest: https://docs.pytest.org
+.. _setuptools-scm: https://github.com/pypa/setuptools_scm
+.. _SciTools/cartopy@fcb784d: https://github.com/SciTools/cartopy/commit/fcb784daa65d95ed9a74b02ca292801c02bc4108
+.. _SciTools/cartopy@8860a81: https://github.com/SciTools/cartopy/commit/8860a8186d4dc62478e74c83f3b2b3e8f791372e
diff --git a/docs/src/whatsnew/index.rst b/docs/src/whatsnew/index.rst
index 78c0134463..8cff21f32f 100644
--- a/docs/src/whatsnew/index.rst
+++ b/docs/src/whatsnew/index.rst
@@ -12,6 +12,7 @@ What's New in Iris
:hidden:
latest.rst
+ 3.3.rst
3.2.rst
3.1.rst
3.0.rst
diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst
index 0e4d51ffec..b44e740724 100644
--- a/docs/src/whatsnew/latest.rst
+++ b/docs/src/whatsnew/latest.rst
@@ -14,7 +14,7 @@ This document explains the changes made to Iris for this release
:animate: fade-in
:open:
- The highlights for this minor release of Iris include:
+ The highlights for this major/minor release of Iris include:
* N/A
@@ -25,108 +25,43 @@ This document explains the changes made to Iris for this release
📢 Announcements
================
-#. N/A
+#. Welcome to `@ESadek-MO`_ and `@TTV-Intrepid`_ who made their first contributions to Iris 🎉
✨ Features
===========
-#. `@schlunma`_ added weighted aggregation over "group coordinates":
- :meth:`~iris.cube.Cube.aggregated_by` now accepts the keyword `weights` if a
- :class:`~iris.analysis.WeightedAggregator` is used. (:issue:`4581`,
- :pull:`4589`)
-
-#. `@wjbenfold`_ added support for ``false_easting`` and ``false_northing`` to
- :class:`~iris.coord_systems.Mercator`. (:issue:`3107`, :pull:`4524`)
-
-#. `@rcomer`_ and `@wjbenfold`_ (reviewer) implemented lazy aggregation for the
- :obj:`iris.analysis.PERCENTILE` aggregator. (:pull:`3901`)
-
-#. `@pp-mo`_ fixed cube arithmetic operation for cubes with meshes.
- (:issue:`4454`, :pull:`4651`)
-
-#. `@wjbenfold`_ added support for CF-compliant treatment of
- ``standard_parallel`` and ``scale_factor_at_projection_origin`` to
- :class:`~iris.coord_systems.Mercator`. (:issue:`3844`, :pull:`4609`)
-
-#. `@wjbenfold`_ added support datums associated with coordinate systems (e.g.
- :class:`~iris.coord_systems.GeogCS` other subclasses of
- :class:`~iris.coord_systems.CoordSystem`). Loading of datum information from
- a netCDF file only happens when the :obj:`iris.FUTURE.datum_support` flag is
- set. (:issue:`4619`, :pull:`4704`)
-
-#. `@wjbenfold`_ and `@stephenworsley`_ (reviewer) added a maximum run length
- aggregator (:class:`~iris.analysis.MAX_RUN`). (:pull:`4676`)
-
-#. `@wjbenfold`_ and `@rcomer`_ (reviewer) added a ``climatological`` keyword to
- :meth:`~iris.cube.Cube.aggregated_by` that causes the climatological flag to
- be set and the point for each cell to equal its first bound, thereby
- preserving the time of year. (:issue:`1422`, :issue:`4098`, :issue:`4665`,
- :pull:`4723`)
+#. `@ESadek-MO`_ edited :func:`~iris.io.expand_filespecs` to allow expansion of
+ non-existing paths, and added expansion functionality to :func:`~iris.io.save`.
+ (:issue:`4772`, :pull:`4913`)
-#. `@wjbenfold`_ and `@pp-mo`_ (reviewer) implemented the
- :class:`~iris.coord_systems.PolarStereographic` CRS. (:issue:`4770`,
- :pull:`4773`)
-
-#. `@rcomer`_ and `@wjbenfold`_ (reviewer) enabled passing of the
- :func:`numpy.percentile` keywords through the :obj:`~iris.analysis.PERCENTILE`
- aggregator. (:pull:`4791`)
-
-#. `@wjbenfold`_ and `@bjlittle`_ (reviewer) implemented
- :func:`iris.plot.fill_between` and :func:`iris.quickplot.fill_between`.
- (:issue:`3493`, :pull:`4647`)
+#. `@trexfeathers`_ and `Julian Heming`_ added new mappings between CF
+ standard names and UK Met Office LBFC codes. (:pull:`4859`)
🐛 Bugs Fixed
=============
-#. `@rcomer`_ reverted part of the change from :pull:`3906` so that
- :func:`iris.plot.plot` no longer defaults to placing a "Y" coordinate (e.g.
- latitude) on the y-axis of the plot. (:issue:`4493`, :pull:`4601`)
-
-#. `@rcomer`_ enabled passing of scalar objects to :func:`~iris.plot.plot` and
- :func:`~iris.plot.scatter`. (:pull:`4616`)
-
-#. `@rcomer`_ fixed :meth:`~iris.cube.Cube.aggregated_by` with `mdtol` for 1D
- cubes where an aggregated section is entirely masked, reported at
- :issue:`3190`. (:pull:`4246`)
-
-#. `@rcomer`_ ensured that a :class:`matplotlib.axes.Axes`'s position is preserved
- when Iris replaces it with a :class:`cartopy.mpl.geoaxes.GeoAxes`, fixing
- :issue:`1157`. (:pull:`4273`)
-
-#. `@rcomer`_ fixed :meth:`~iris.coords.Coord.nearest_neighbour_index` for edge
- cases where the requested point is float and the coordinate has integer
- bounds, reported at :issue:`2969`. (:pull:`4245`)
-
-#. `@rcomer`_ modified bounds setting on :obj:`~iris.coords.DimCoord` instances
- so that the order of the cell bounds is automatically reversed
- to match the coordinate's direction if necessary. This is consistent with
- the `Bounds for 1-D coordinate variables` subsection of the `Cell Boundaries`_
- section of the CF Conventions and ensures that contiguity is preserved if a
- coordinate's direction is reversed. (:issue:`3249`, :issue:`423`,
- :issue:`4078`, :issue:`3756`, :pull:`4466`)
-
-#. `@wjbenfold`_ and `@evertrol`_ prevented an ``AttributeError`` being logged
- to ``stderr`` when a :class:`~iris.fileformats.cf.CFReader` that fails to
- initialise is garbage collected. (:issue:`3312`, :pull:`4646`)
+#. `@rcomer`_ and `@pp-mo`_ (reviewer) factored masking into the returned
+ sum-of-weights calculation from :obj:`~iris.analysis.SUM`. (:pull:`4905`)
-#. `@stephenworsley`_ aligned the behaviour of :obj:`~iris.coords.Cell` equality
- to match :obj:`~iris.coords.Coord` equality with respect to NaN values.
- Two NaN valued Cells are now considered equal. This fixes :issue:`4681` and
- causes NaN valued scalar coordinates to be able to merge be preserved during
- cube merging. (:pull:`4701`)
+#. `@schlunma`_ fixed a bug which prevented using
+ :meth:`iris.cube.Cube.collapsed` on coordinates whose number of bounds
+ differs from 0 or 2. This enables the use of this method on mesh
+ coordinates. (:issue:`4672`, :pull:`4870`)
-#. `@wjbenfold`_ fixed plotting of circular coordinates to extend kwarg arrays
- as well as the data. (:issue:`466`, :pull:`4649`)
+#. `@bjlittle`_ and `@lbdreyer`_ (reviewer) fixed the building of the CF
+ Standard Names module ``iris.std_names`` for the ``setup.py`` commands
+ ``develop`` and ``std_names``. (:issue:`4951`, :pull:`4952`)
-#. `@wjbenfold`_ and `@rcomer`_ (reviewer) corrected the axis on which masking
- is applied when an aggregator adds a trailing dimension. (:pull:`4755`)
+#. `@lbdreyer`_ and `@pp-mo`_ (reviewer) fixed the cube print out such that
+ scalar ancillary variables are displayed in a dedicated section rather than
+ being added to the vector ancillary variables section. Further, ancillary
+ variables and cell measures that map to a cube dimension of length 1 are now
+ included in the respective vector sections. (:pull:`4945`)
-#. `@rcomer`_ and `@pp-mo`_ ensured that all methods to create or modify a
- :class:`iris.cube.CubeList` check that it only contains cubes. According to
- code comments, this was supposedly already the case, but there were several bugs
- and loopholes. (:issue:`1897`, :pull:`4767`)
+#. `@rcomer`_ removed some old redundant code that prevented determining the
+ order of time cells. (:issue:`4697`, :pull:`4729`)
💣 Incompatible Changes
@@ -138,25 +73,18 @@ This document explains the changes made to Iris for this release
🚀 Performance Enhancements
===========================
-#. `@wjbenfold`_ added caching to the calculation of the points array in a
- :class:`~iris.coords.DimCoord` created using
- :meth:`~iris.coords.DimCoord.from_regular`. (:pull:`4698`)
-
-#. `@wjbenfold`_ introduced caching in :func:`_lazy_data._optimum_chunksize` and
- :func:`iris.fileformats.pp_load_rules._epoch_date_hours` to reduce time spent
- repeating calculations. (:pull:`4716`)
-
-#. `@pp-mo`_ made :meth:`~iris.cube.Cube.add_aux_factory` faster.
- (:pull:`4718`)
-
-#. `@wjbenfold`_ and `@rcomer`_ (reviewer) permitted the fast percentile
- aggregation method to be used on masked data when the missing data tolerance
- is set to 0. (:issue:`4735`, :pull:`4755`)
-
-#. `@wjbenfold`_ improved the speed of linear interpolation using
- :meth:`iris.analysis.trajectory.interpolate` (:pull:`4366`)
+#. `@rcomer`_ and `@pp-mo`_ (reviewer) increased aggregation speed for
+ :obj:`~iris.analysis.SUM`, :obj:`~iris.analysis.COUNT` and
+ :obj:`~iris.analysis.PROPORTION` on real data. (:pull:`4905`)
+#. `@bouweandela`_ made :meth:`iris.coords.Coord.cells` faster for time
+ coordinates. This also affects :meth:`iris.cube.Cube.extract`,
+ :meth:`iris.cube.Cube.subset`, and :meth:`iris.coords.Coord.intersect`.
+ (:pull:`4969`)
+#. `@bouweandela`_ improved the speed of :meth:`iris.cube.Cube.subset` /
+ :meth:`iris.coords.Coord.intersect`.
+ (:pull:`4955`)
🔥 Deprecations
===============
@@ -167,86 +95,72 @@ This document explains the changes made to Iris for this release
🔗 Dependencies
===============
-#. `@rcomer`_ introduced the ``nc-time-axis >=1.4`` minimum pin, reflecting that
- we no longer use the deprecated :class:`nc_time_axis.CalendarDateTime`
- when plotting against time coordinates. (:pull:`4584`)
-
-#. `@wjbenfold`_ and `@bjlittle`_ (reviewer) unpinned ``pillow``. (:pull:`4826`)
-
-
-📚 Documentation
-================
-
-#. `@tkknight`_ added a page to show the issues that have been voted for. See
- :ref:`voted_issues_top`. (:issue:`3307`, :pull:`4617`)
-
-#. `@wjbenfold`_ added a note about fixing proxy URLs in lockfiles generated
- because dependencies have changed. (:pull:`4666`)
-
-#. `@lbdreyer`_ moved most of the User Guide's :class:`iris.Constraint` examples
- from :ref:`loading_iris_cubes` to :ref:`cube_extraction` and added an
- example of constraining on bounded time. (:pull:`4656`)
+#. `@rcomer`_ introduced the ``dask >=2.26`` minimum pin, so that Iris can benefit
+ from Dask's support for `NEP13`_ and `NEP18`_. (:pull:`4905`)
-#. `@tkknight`_ adopted the `PyData Sphinx Theme`_ for the documentation.
- (:discussion:`4344`, :pull:`4661`)
+#. `@trexfeathers`_ advanced the Cartopy pin to ``>=0.21``, as Cartopy's
+ change to default Transverse Mercator projection affects an Iris test.
+ See `SciTools/cartopy@fcb784d`_ and `SciTools/cartopy@8860a81`_ for more
+ details.
+ (:pull:`4968`)
-#. `@tkknight`_ updated our developers guidance to show our intent to adopt
- numpydoc strings and fixed some API documentation rendering.
- See :ref:`docstrings`. (:issue:`4657`, :pull:`4689`)
+#. `@trexfeathers`_ introduced the ``netcdf4!=1.6.1`` pin to avoid a problem
+ with segfaults. (:pull:`4968`)
-#. `@trexfeathers`_ added a page with examples of converting various mesh
- formats into the Iris Mesh Data Model. (:pull:`4739`)
+#. `@trexfeathers`_ updated the Matplotlib colormap registration in
+ :mod:`iris.palette` in response to a deprecation warning. Using the new
+ Matplotlib API also means a ``matplotlib>=3.5`` pin. (:pull:`4998`)
-#. `@rcomer`_ updated the "Load a Time Series of Data From the NEMO Model"
- gallery example. (:pull:`4741`)
-#. `@wjbenfold`_ added developer documentation to highlight some of the
- utilities offered by :class:`iris.IrisTest` and how to update CML and other
- output files. (:issue:`4544`, :pull:`4600`)
+📚 Documentation
+================
-#. `@trexfeathers`_ and `@abooton`_ modernised the Iris logo to be SVG format.
- (:pull:`3935`)
+#. `@ESadek-MO`_, `@TTV-Intrepid`_ and `@trexfeathers`_ added a gallery example for zonal
+ means plotted parallel to a cartographic plot. (:pull:`4871`)
+#. `@Esadek-MO`_ added a key-terms :ref:`glossary` page into the user guide. (:pull:`4902`)
+#. `@pp-mo`_ added a :ref:`code example `
+ for converting ORCA-gridded data to an unstructured cube. (:pull:`5013`)
💼 Internal
===========
-#. `@trexfeathers`_ and `@pp-mo`_ finished implementing a mature benchmarking
- infrastructure (see :ref:`contributing.benchmarks`), building on 2 hard
- years of lessons learned 🎉. (:pull:`4477`, :pull:`4562`, :pull:`4571`,
- :pull:`4583`, :pull:`4621`)
+#. `@rcomer`_ removed the obsolete ``setUpClass`` method from Iris testing.
+ (:pull:`4927`)
-#. `@wjbenfold`_ used the aforementioned benchmarking infrastructure to
- introduce deep (large 3rd dimension) loading and realisation benchmarks.
- (:pull:`4654`)
+#. `@bjlittle`_ and `@lbdreyer`_ (reviewer) removed support for
+ ``python setup.py test``, which is a deprecated approach to executing
+ package tests, see `pypa/setuptools#1684`_. Also performed assorted
+ ``setup.py`` script hygiene. (:pull:`4948`, :pull:`4949`, :pull:`4950`)
-#. `@wjbenfold`_ made :func:`iris.tests.stock.simple_1d` respect the
- ``with_bounds`` argument. (:pull:`4658`)
+#. `@pp-mo`_ split the module :mod:`iris.fileformats.netcdf` into separate
+ :mod:`~iris.fileformats.netcdf.loader` and :mod:`~iris.fileformats.netcdf.saver`
+ submodules, just to make the code easier to handle.
-#. `@bjlittle`_ migrated to GitHub Actions for Continuous-Integration.
- (:pull:`4503`)
+#. `@trexfeathers`_ adapted the benchmark for importing :mod:`iris.palette` to
+ cope with new colormap behaviour in Matplotlib `v3.6`. (:pull:`4998`)
-#. `@pp-mo`_ made tests run certain linux executables from the Python env,
- specifically ncdump and ncgen. These could otherwise fail when run in IDEs
- such as PyCharm and Eclipse, which don't automatically include the Python env
- bin in the system PATH.
- (:pull:`4794`)
-
-#. `@trexfeathers`_ and `@pp-mo`_ fixed the CDL headers for
- :mod:`iris.tests.stock.netcdf` to allow generation of NetCDF-4 files with an
- unlimited time dimension.
- (:pull:`4827`)
+#. `@rcomer`_ removed a now redundant workaround for an old matplotlib bug,
+ highlighted by :issue:`4090`. (:pull:`4999`)
+#. `@rcomer`_ added the ``show`` option to the documentation Makefiles, as a
+ convenient way for contributors to view their built documentation.
+ (:pull:`5000`)
.. comment
Whatsnew author names (@github name) in alphabetical order. Note that,
core dev names are automatically included by the common_links.inc:
-.. _@evertrol: https://github.com/evertrol
+.. _@TTV-Intrepid: https://github.com/TTV-Intrepid
+.. _Julian Heming: https://www.metoffice.gov.uk/research/people/julian-heming
+
.. comment
Whatsnew resources in alphabetical order:
-.. _Cell Boundaries: https://cfconventions.org/Data/cf-conventions/cf-conventions-1.9/cf-conventions.html#cell-boundaries
-.. _PyData Sphinx Theme: https://pydata-sphinx-theme.readthedocs.io/en/stable/index.html
+.. _NEP13: https://numpy.org/neps/nep-0013-ufunc-overrides.html
+.. _NEP18: https://numpy.org/neps/nep-0018-array-function-protocol.html
+.. _pypa/setuptools#1684: https://github.com/pypa/setuptools/issues/1684
+.. _SciTools/cartopy@fcb784d: https://github.com/SciTools/cartopy/commit/fcb784daa65d95ed9a74b02ca292801c02bc4108
+.. _SciTools/cartopy@8860a81: https://github.com/SciTools/cartopy/commit/8860a8186d4dc62478e74c83f3b2b3e8f791372e
diff --git a/docs/src/whatsnew/latest.rst.template b/docs/src/whatsnew/latest.rst.template
index 1b36d3f0b0..661ee47f50 100644
--- a/docs/src/whatsnew/latest.rst.template
+++ b/docs/src/whatsnew/latest.rst.template
@@ -24,7 +24,7 @@ This document explains the changes made to Iris for this release
NOTE: section below is a template for bugfix patches
====================================================
- (Please remove this section when creating an initial 'dev.rst')
+ (Please remove this section when creating an initial 'latest.rst')
v3.X.X (DD MMM YYYY)
====================
@@ -41,8 +41,8 @@ v3.X.X (DD MMM YYYY)
NOTE: section above is a template for bugfix patches
====================================================
- (Please remove this section when creating an initial 'dev.rst')
-
+ (Please remove this section when creating an initial 'latest.rst')
+
📢 Announcements
diff --git a/etc/cf-standard-name-table.xml b/etc/cf-standard-name-table.xml
index bd76168192..9c5fcd9cf0 100644
--- a/etc/cf-standard-name-table.xml
+++ b/etc/cf-standard-name-table.xml
@@ -1,7 +1,7 @@
- 78
- 2021-09-21T11:55:06Z
+ 79
+ 2022-03-19T15:25:54Z
Centre for Environmental Data Analysis
support@ceda.ac.uk
@@ -8014,6 +8014,20 @@
The phrase "magnitude_of_X" means magnitude of a vector X. The surface called "surface" means the lower boundary of the atmosphere. "Surface stress" means the shear stress (force per unit area) exerted by the wind at the surface. A downward stress is a downward flux of momentum. Over large bodies of water, wind stress can drive near-surface currents. "Downward" indicates a vector component which is positive when directed downward (negative upward).
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of 19’-butanoyloxyfucoxanthin is C46H64O8. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/BUTAXXXX/1/.
+
+
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of 19'-hexanoyloxyfucoxanthin is C48H68O8. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/HEXAXXXX/2/.
+
+
kg m-3
@@ -8028,6 +8042,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for aceto-nitrile is CH3CN. The IUPAC name for aceto-nitrile is ethanenitrile.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/ATPXZZDZ/2/.
+
+
kg m-3
@@ -8042,6 +8063,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. Alkenes are unsaturated hydrocarbons as they contain chemical double bonds between adjacent carbon atoms. Alkenes contain only hydrogen and carbon combined in the general proportions C(n)H(2n); "alkenes" is the term used in standard names to describe the group of chemical species having this common structure that are represented within a given model. The list of individual species that are included in a quantity having a group chemical standard name can vary between models. Where possible, the data variable should be accompanied by a complete description of the species represented, for example, by using a comment attribute. Standard names exist for some individual alkene species, e.g., ethene and propene.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of alpha-carotene is C40H56. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/BECAXXP1/2/.
+
+
kg m-3
@@ -8112,6 +8140,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for benzene is C6H6. Benzene is the simplest aromatic hydrocarbon and has a ring structure consisting of six carbon atoms joined by alternating single and double chemical bonds. Each carbon atom is additionally bonded to one hydrogen atom. There are standard names that refer to aromatic_compounds as a group, as well as those for individual species.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of beta-carotene is C40H56. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/BBCAXXP1/2/.
+
+
kg m-3
@@ -8217,6 +8252,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula of carbon tetrachloride is CCl4. The IUPAC name for carbon tetrachloride is tetrachloromethane.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Carotene" refers to the sum of all forms of the carotenoid pigment carotene. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/CAROXXXX/1/.
+
+
kg m-3
@@ -8287,6 +8329,41 @@
'Mass concentration' means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. Chlorophyll-a is the most commonly occurring form of natural chlorophyll. The chemical formula of chlorophyll-a is C55H72O5N4Mg.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/CHLBXXPX/2/.
+
+
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. Chlorophyll c1c2 (sometimes written c1-c2 or c1+c2) means the sum of chlorophyll c1 and chlorophyll c2. The chemical formula of chlorophyll c1 is C35H30MgN4O5, and chlorophyll c2 is C35H28MgN4O5. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/CHLC12PX/3/.
+
+
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. The chemical formula of chlorophyll c3 is C36H44MgN4O7. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/CHLC03PX/2/.
+
+
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. Chlorophyll-c means chlorophyll c1+c2+c3. The chemical formula of chlorophyll c1 is C35H30MgN4O5, and chlorophyll c2 is C35H28MgN4O5. The chemical formula of chlorophyll c3 is C36H44MgN4O7.
+
+
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of chlorophyllide-a is C35H34MgN4O5.
+
+
kg m-3
@@ -8322,6 +8399,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. Condensed water means liquid and ice.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of diadinoxanthin is C40H54O3. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/DIADXXXX/2/.
+
+
kg m-3
@@ -8378,6 +8462,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for dinitrogen pentoxide is N2O5.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen".
+
+
kg m-3
@@ -8455,6 +8546,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for formic acid is HCOOH. The IUPAC name for formic acid is methanoic acid.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of fucoxanthin is C42H58O6. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/FUCXZZZZ/2/.
+
+
kg m-3
@@ -8637,6 +8735,13 @@
Mass concentration means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The mass concentration of liquid water takes into account all cloud droplets and liquid precipitation regardless of drop size or fall speed.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of lutein is C40H56O2.
+
+
kg m-3
@@ -8707,6 +8812,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for molecular hydrogen is H2.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen".
+
+
kg m-3
@@ -8833,6 +8945,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol takes up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the aerosol. "Dry aerosol particles" means aerosol particles without any water uptake. The term "particulate_organic_matter_dry_aerosol" means all particulate organic matter dry aerosol except elemental carbon. It is the sum of primary_particulate_organic_matter_dry_aerosol and secondary_particulate_organic_matter_dry_aerosol.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/PERDXXXX/2/.
+
+
kg m-3
@@ -8861,6 +8980,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. It means the ratio of the mass of X to the mass of Y (including X). A chemical species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Petroleum hydrocarbons are compounds containing just carbon and hydrogen originating from the fossil fuel crude oil.
+
+ kg m-3
+
+
+ Concentration of phaeopigment per unit volume of the water body, where the filtration size or collection method is unspecified (equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/. "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Phaeopigments are a group of non-photosynthetic pigments that are the degradation product of algal chlorophyll pigments. Phaeopigments contain phaeophytin, which fluoresces in response to excitation light, and phaeophorbide, which is colorless and does not fluoresce (source: https://academic.oup.com/plankt/article/24/11/1221/1505482). Phaeopigment concentration commonly increases during the development phase of marine phytoplankton blooms, and declines in the post bloom stage (source: https://www.sciencedirect.com/science/article/pii/0967063793901018).
+
+
kg m-3
@@ -8931,6 +9057,13 @@
Mass concentration means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm2p5 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of prasinoxanthin is C40H56O4. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/PXAPXXXX/2/.
+
+
kg m-3
@@ -9036,6 +9169,13 @@
"Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for toluene is C6H5CH3. Toluene has the same structure as benzene, except that one of the hydrogen atoms is replaced by a methyl group. The IUPAC name for toluene is methylbenzene.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of violaxanthin is C40H56O4.
+
+
kg m-3
@@ -9064,6 +9204,13 @@
Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for xylene is C6H4C2H6. In chemistry, xylene is a generic term for a group of three isomers of dimethylbenzene. The IUPAC names for the isomers are 1,2-dimethylbenzene, 1,3-dimethylbenzene and 1,4-dimethylbenzene. Xylene is an aromatic hydrocarbon. There are standard names that refer to aromatic_compounds as a group, as well as those for individual species.
+
+ kg m-3
+
+
+ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of zeaxanthin is C40H56O2. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/ZEAXXXXX/2/.
+
+
kg m-3
@@ -10737,6 +10884,13 @@
Mole concentration means number of moles per unit volume, also called "molarity", and is used in the construction mole_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for aceto-nitrile is CH3CN. The IUPAC name for aceto-nitrile is ethanenitrile.
+
+ mol m-3
+
+
+ "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/ATPXZZDZ/2/.
+
+
mol m-3
@@ -11185,6 +11339,13 @@
Mole concentration means number of moles per unit volume, also called "molarity", and is used in the construction mole_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The concentration of any chemical species, whether particulate or dissolved, may vary with depth in the ocean. A depth profile may go through one or more local minima in concentration. The mole_concentration_of_molecular_oxygen_in_sea_water_at_shallowest_local_minimum_in_vertical_profile is the mole concentration of oxygen at the local minimum in the concentration profile that occurs closest to the sea surface. The chemical formula for molecular oxygen is O2.
+
+ mol m-3
+
+
+ "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Dissolved nitrogen" means the sum of all nitrogen in solution: inorganic nitrogen (nitrite, nitrate and ammonium) plus nitrogen in carbon compounds.
+
+
mol m-3
@@ -11199,6 +11360,20 @@
"Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Dissolved organic nitrogen" describes the nitrogen held in carbon compounds in solution. These are mostly generated by plankton excretion and decay.
+
+ mol m-3
+
+
+ "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Organic phosphorus" means phosphorus in carbon compounds. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/ORGPDSZZ/4/.
+
+
+
+ mol m-3
+
+
+ "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Phosphorus means phosphorus in all chemical forms, commonly referred to as "total phosphorus". The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/.
+
+
mol m-3
@@ -11626,6 +11801,13 @@
Mole concentration means number of moles per unit volume, also called "molarity", and is used in the construction mole_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for ozone is O3.
+
+ mol m-3
+
+
+ "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The phrase "expressed_as" is used in the construction "A_expressed_as_B", where B is a chemical constituent of A. It means that the quantity indicated by the standard name is calculated solely with respect to the B contained in A, neglecting all other chemical constituents of A.
+
+
mol m-3
@@ -18595,21 +18777,21 @@
Pa
- "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "xx" indicates the component of the tensor along the grid x_ axis.
+ "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "xx" indicates the component of the tensor along the grid x_ axis.
Pa
- "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "xy" indicates the lateral contributions to x_ and y_ components of the tensor.
+ "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "xy" indicates the lateral contributions to x_ and y_ components of the tensor.
Pa
- "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "yy" indicates the component of the tensor along the grid y_ axis.
+ "Sea surface wave radiation stress" describes the excess momentum flux caused by sea surface waves. Radiation stresses behave as a second-order tensor. "yy" indicates the component of the tensor along the grid y_ axis.
@@ -31472,16 +31654,12 @@
-
- biological_taxon_lsid
-
-
temperature_in_ground
-
- surface_snow_density
+
+ biological_taxon_lsid
@@ -31516,14 +31694,18 @@
tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice
-
- atmosphere_upward_absolute_vorticity
+
+ surface_snow_density
atmosphere_upward_relative_vorticity
+
+ atmosphere_upward_absolute_vorticity
+
+
area_type
@@ -31532,34 +31714,46 @@
area_type
-
- iron_growth_limitation_of_diazotrophic_phytoplankton
+
+ mass_fraction_of_liquid_precipitation_in_air
-
- growth_limitation_of_diazotrophic_phytoplankton_due_to_solar_irradiance
+
+ mass_fraction_of_liquid_precipitation_in_air
tendency_of_mole_concentration_of_particulate_organic_matter_expressed_as_carbon_in_sea_water_due_to_net_primary_production_by_diazotrophic_phytoplankton
-
- mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water
+
+ nitrogen_growth_limitation_of_diazotrophic_phytoplankton
-
- mass_fraction_of_liquid_precipitation_in_air
+
+ net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton
-
- mass_fraction_of_liquid_precipitation_in_air
+
+ net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton
+
+
+
+ mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water
mass_concentration_of_diazotrophic_phytoplankton_expressed_as_chlorophyll_in_sea_water
+
+ iron_growth_limitation_of_diazotrophic_phytoplankton
+
+
+
+ growth_limitation_of_diazotrophic_phytoplankton_due_to_solar_irradiance
+
+
air_pseudo_equivalent_potential_temperature
@@ -31576,64 +31770,300 @@
tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_riming_from_cloud_liquid_water
-
- nitrogen_growth_limitation_of_diazotrophic_phytoplankton
+
+ sea_water_velocity_from_direction
-
- net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton
+
+ sea_water_velocity_to_direction
-
- net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton
+
+ sea_water_velocity_to_direction
-
- air_pseudo_equivalent_temperature
+
+ integral_wrt_depth_of_product_of_salinity_and_sea_water_density
-
- air_equivalent_temperature
+
+ integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density
-
- atmosphere_mass_content_of_convective_cloud_liquid_water
+
+ integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density
-
- effective_radius_of_cloud_liquid_water_particles_at_liquid_water_cloud_top
+
+ volume_fraction_of_condensed_water_in_soil_at_wilting_point
-
- northward_heat_flux_in_air_due_to_eddy_advection
+
+ volume_fraction_of_condensed_water_in_soil_at_field_capacity
-
- northward_eliassen_palm_flux_in_air
+
+ volume_fraction_of_condensed_water_in_soil_at_critical_point
-
- net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_wood
+
+ volume_fraction_of_condensed_water_in_soil
-
- net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_leaves
+
+ product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity
-
- net_primary_productivity_of_biomass_expressed_as_carbon
+
+ product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity
-
- mole_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air
+
+ product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height
-
- mole_concentration_of_microzooplankton_expressed_as_nitrogen_in_sea_water
+
+ product_of_lagrangian_tendency_of_air_pressure_and_air_temperature
-
- mole_concentration_of_mesozooplankton_expressed_as_nitrogen_in_sea_water
+
+ product_of_lagrangian_tendency_of_air_pressure_and_air_temperature
+
+
+
+ tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing
+
+
+
+ tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing
+
+
+
+ tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing
+
+
+
+ effective_radius_of_stratiform_cloud_snow_particles
+
+
+
+ tendency_of_atmosphere_moles_of_cfc11
+
+
+
+ moles_of_cfc11_per_unit_mass_in_sea_water
+
+
+
+ atmosphere_moles_of_cfc11
+
+
+
+ tendency_of_atmosphere_moles_of_cfc113
+
+
+
+ atmosphere_moles_of_cfc113
+
+
+
+ tendency_of_atmosphere_moles_of_cfc114
+
+
+
+ atmosphere_moles_of_cfc114
+
+
+
+ tendency_of_atmosphere_moles_of_cfc115
+
+
+
+ atmosphere_moles_of_cfc115
+
+
+
+ tendency_of_atmosphere_moles_of_cfc12
+
+
+
+ atmosphere_moles_of_cfc12
+
+
+
+ tendency_of_atmosphere_moles_of_halon1202
+
+
+
+ atmosphere_moles_of_halon1202
+
+
+
+ tendency_of_atmosphere_moles_of_halon1211
+
+
+
+ atmosphere_moles_of_halon1211
+
+
+
+ tendency_of_atmosphere_moles_of_halon1301
+
+
+
+ atmosphere_moles_of_halon1301
+
+
+
+ tendency_of_atmosphere_moles_of_halon2402
+
+
+
+ atmosphere_moles_of_halon2402
+
+
+
+ tendency_of_atmosphere_moles_of_hcc140a
+
+
+
+ atmosphere_moles_of_hcc140a
+
+
+
+ tendency_of_troposphere_moles_of_hcc140a
+
+
+
+ tendency_of_middle_atmosphere_moles_of_hcc140a
+
+
+
+ tendency_of_troposphere_moles_of_hcfc22
+
+
+
+ tendency_of_atmosphere_moles_of_hcfc22
+
+
+
+ atmosphere_moles_of_hcfc22
+
+
+
+ tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition
+
+
+
+ lagrangian_tendency_of_atmosphere_sigma_coordinate
+
+
+
+ lagrangian_tendency_of_atmosphere_sigma_coordinate
+
+
+
+ electrical_mobility_diameter_of_ambient_aerosol_particles
+
+
+
+ diameter_of_ambient_aerosol_particles
+
+
+
+ mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air
+
+
+
+ effective_radius_of_stratiform_cloud_rain_particles
+
+
+
+ effective_radius_of_stratiform_cloud_ice_particles
+
+
+
+ effective_radius_of_stratiform_cloud_graupel_particles
+
+
+
+ effective_radius_of_convective_cloud_snow_particles
+
+
+
+ effective_radius_of_convective_cloud_rain_particles
+
+
+
+ effective_radius_of_convective_cloud_ice_particles
+
+
+
+ histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid
+
+
+
+ backscattering_ratio_in_air
+
+
+
+ product_of_northward_wind_and_lagrangian_tendency_of_air_pressure
+
+
+
+ product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure
+
+
+
+ carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change
+
+
+
+ floating_ice_shelf_area_fraction
+
+
+
+ atmosphere_moles_of_carbon_tetrachloride
+
+
+
+ mole_fraction_of_methylglyoxal_in_air
+
+
+
+ mole_fraction_of_dichlorine_peroxide_in_air
+
+
+
+ atmosphere_mass_content_of_convective_cloud_liquid_water
+
+
+
+ effective_radius_of_cloud_liquid_water_particles_at_liquid_water_cloud_top
+
+
+
+ air_equivalent_temperature
+
+
+
+ air_pseudo_equivalent_temperature
+
+
+
+ mass_content_of_cloud_liquid_water_in_atmosphere_layer
+
+
+
+ air_equivalent_potential_temperature
+
+
+
+ number_concentration_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top
+
+
+
+ number_concentration_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top
@@ -31660,360 +32090,104 @@
atmosphere_mass_content_of_cloud_liquid_water
-
- mass_fraction_of_sulfate_dry_aerosol_particles_in_air
-
-
-
- mass_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air
-
-
-
- mass_fraction_of_ammonium_dry_aerosol_particles_in_air
-
-
-
- tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_shallow_convection
-
-
-
- tendency_of_mass_content_of_water_vapor_in_atmosphere_layer
-
-
-
- mass_content_of_cloud_ice_in_atmosphere_layer
-
-
-
- mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air
-
-
-
- mass_concentration_of_mercury_dry_aerosol_particles_in_air
-
-
-
- mass_concentration_of_coarse_mode_ambient_aerosol_particles_in_air
-
-
-
- sea_water_velocity_to_direction
-
-
-
- sea_water_velocity_to_direction
-
-
-
- gross_primary_productivity_of_biomass_expressed_as_carbon
-
-
-
- eastward_water_vapor_flux_in_air
-
-
-
- atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles
-
-
-
- tendency_of_middle_atmosphere_moles_of_carbon_monoxide
-
-
-
- tendency_of_atmosphere_mass_content_of_water_vapor_due_to_advection
-
-
-
- tendency_of_atmosphere_mass_content_of_water_vapor
-
-
-
- lwe_thickness_of_atmosphere_mass_content_of_water_vapor
-
-
-
- change_over_time_in_atmosphere_mass_content_of_water_due_to_advection
-
-
-
- change_over_time_in_atmosphere_mass_content_of_water_due_to_advection
-
-
-
- atmosphere_mass_content_of_water_vapor
-
-
-
- tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling
-
-
-
- tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling
-
-
-
- tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition
-
-
-
- tendency_of_middle_atmosphere_moles_of_methyl_bromide
-
-
-
- atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur
-
-
-
- atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur
-
-
-
- atmosphere_mass_content_of_sulfate
-
-
-
- atmosphere_mass_content_of_sulfate
-
-
-
- tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production
-
-
-
- tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production
-
-
-
- tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition
-
-
-
- atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles
-
-
-
- tendency_of_atmosphere_mass_content_of_water_vapor_due_to_deep_convection
-
-
-
- tendency_of_atmosphere_mass_content_of_water_vapor_due_to_convection
-
-
-
- atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles
-
-
-
- mass_content_of_cloud_liquid_water_in_atmosphere_layer
-
-
-
- air_equivalent_potential_temperature
-
-
-
- number_concentration_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top
-
-
-
- number_concentration_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top
-
-
-
- wave_frequency
-
-
-
- upward_eastward_momentum_flux_in_air_due_to_nonorographic_eastward_gravity_waves
-
-
-
- tendency_of_troposphere_moles_of_carbon_monoxide
-
-
-
- tendency_of_atmosphere_moles_of_sulfate_dry_aerosol_particles
-
-
-
- tendency_of_atmosphere_mass_content_of_nitrate_dry_aerosol_particles_due_to_dry_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_waste_treatment_and_disposal
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_savanna_and_grassland_fires
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_maritime_transport
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_land_transport
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_forest_fires
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_agricultural_waste_burning
-
-
-
- tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_turbulent_deposition
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission
-
-
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_gravitational_settling
+
+ mole_fraction_of_noy_expressed_as_nitrogen_in_air
-
- tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition
+
+ tendency_of_atmosphere_moles_of_methane
-
- atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles
+
+ rate_of_hydroxyl_radical_destruction_due_to_reaction_with_nmvoc
-
- integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density
+
+ net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton
-
- integral_wrt_depth_of_product_of_salinity_and_sea_water_density
+
+ mole_fraction_of_inorganic_bromine_in_air
-
- tendency_of_atmosphere_moles_of_methyl_bromide
+
+ water_vapor_saturation_deficit_in_air
-
- integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning
-
- atmosphere_moles_of_methyl_bromide
+
+ tendency_of_atmosphere_moles_of_carbon_tetrachloride
-
- product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity
+
+ tendency_of_atmosphere_moles_of_carbon_monoxide
-
- product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity
+
+ platform_yaw
-
- tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing
+
+ platform_pitch
-
- tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing
+
+ platform_roll
-
- volume_fraction_of_condensed_water_in_soil_at_wilting_point
+
+ tendency_of_specific_humidity_due_to_stratiform_precipitation
-
- volume_fraction_of_condensed_water_in_soil_at_field_capacity
+
+ tendency_of_air_temperature_due_to_stratiform_precipitation
-
- volume_fraction_of_condensed_water_in_soil_at_critical_point
+
+ stratiform_precipitation_flux
-
- volume_fraction_of_condensed_water_in_soil
+
+ stratiform_precipitation_amount
-
- product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height
+
+ lwe_thickness_of_stratiform_precipitation_amount
-
- product_of_lagrangian_tendency_of_air_pressure_and_air_temperature
+
+ lwe_stratiform_precipitation_rate
-
- product_of_lagrangian_tendency_of_air_pressure_and_air_temperature
+
+ water_evaporation_amount_from_canopy
-
- tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing
+
+ water_evaporation_flux_from_canopy
-
- atmosphere_moles_of_methane
+
+ precipitation_flux_onto_canopy
-
- electrical_mobility_diameter_of_ambient_aerosol_particles
+
+ outgoing_water_volume_transport_along_river_channel
-
- histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid
+
+ tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice
tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_emission
-
- effective_radius_of_stratiform_cloud_snow_particles
-
-
-
- mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air
-
-
-
- atmosphere_mass_content_of_nitric_acid_trihydrate_ambient_aerosol_particles
-
-
-
- atmosphere_mass_content_of_nitrate_dry_aerosol_particles
-
-
-
- atmosphere_mass_content_of_mercury_dry_aerosol_particles
-
-
-
- backscattering_ratio_in_air
-
-
-
- product_of_northward_wind_and_lagrangian_tendency_of_air_pressure
+
+ mass_fraction_of_mercury_dry_aerosol_particles_in_air
@@ -32024,256 +32198,224 @@
tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition
-
- tendency_of_atmosphere_moles_of_cfc11
-
-
-
- moles_of_cfc11_per_unit_mass_in_sea_water
-
-
-
- atmosphere_moles_of_cfc11
-
-
-
- tendency_of_atmosphere_moles_of_hcc140a
-
-
-
- effective_radius_of_convective_cloud_rain_particles
-
-
-
- tendency_of_troposphere_moles_of_hcc140a
-
-
-
- tendency_of_middle_atmosphere_moles_of_hcc140a
-
-
-
- tendency_of_troposphere_moles_of_hcfc22
-
-
-
- tendency_of_atmosphere_moles_of_hcfc22
+
+ stratiform_cloud_area_fraction
-
- atmosphere_moles_of_hcfc22
+
+ magnitude_of_sea_ice_displacement
-
- tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition
+
+ surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water
-
- lagrangian_tendency_of_atmosphere_sigma_coordinate
+
+ surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
-
- lagrangian_tendency_of_atmosphere_sigma_coordinate
+
+ surface_downwelling_shortwave_flux_in_air_assuming_clear_sky
-
- diameter_of_ambient_aerosol_particles
+
+ surface_downwelling_shortwave_flux_in_air
-
- effective_radius_of_stratiform_cloud_ice_particles
+
+ surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water
-
- effective_radius_of_convective_cloud_ice_particles
+
+ surface_downwelling_radiative_flux_per_unit_wavelength_in_air
-
- effective_radius_of_stratiform_cloud_graupel_particles
+
+ surface_downwelling_radiance_per_unit_wavelength_in_sea_water
-
- effective_radius_of_stratiform_cloud_rain_particles
+
+ surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water
-
- effective_radius_of_convective_cloud_snow_particles
+
+ surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water
-
- product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure
+
+ surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water
-
- carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change
+
+ surface_downwelling_longwave_flux_in_air
-
- stratiform_cloud_area_fraction
+
+ integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air
-
- sea_water_velocity_from_direction
+
+ integral_wrt_time_of_surface_downwelling_longwave_flux_in_air
-
- thickness_of_stratiform_snowfall_amount
+
+ downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water
-
- optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles
+
+ downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
-
- optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles
+
+ downwelling_radiative_flux_per_unit_wavelength_in_sea_water
-
- lwe_thickness_of_stratiform_snowfall_amount
+
+ downwelling_radiative_flux_per_unit_wavelength_in_air
-
- equivalent_thickness_at_stp_of_atmosphere_ozone_content
+
+ downwelling_radiance_per_unit_wavelength_in_sea_water
-
- atmosphere_optical_thickness_due_to_water_in_ambient_aerosol_particles
+
+ downwelling_radiance_per_unit_wavelength_in_air
-
- atmosphere_optical_thickness_due_to_dust_dry_aerosol_particles
+
+ downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water
-
- atmosphere_optical_thickness_due_to_dust_ambient_aerosol_particles
+
+ downwelling_photon_radiance_per_unit_wavelength_in_sea_water
-
- atmosphere_optical_thickness_due_to_ambient_aerosol_particles
+
+ downwelling_photon_flux_per_unit_wavelength_in_sea_water
-
- atmosphere_optical_thickness_due_to_ambient_aerosol_particles
+
+ surface_upwelling_shortwave_flux_in_air_assuming_clear_sky
-
- atmosphere_net_upward_convective_mass_flux
+
+ surface_upwelling_longwave_flux_in_air_assuming_clear_sky
-
- mass_fraction_of_mercury_dry_aerosol_particles_in_air
+
+ upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
-
- atmosphere_moles_of_hcc140a
+
+ upwelling_radiative_flux_per_unit_wavelength_in_sea_water
-
- floating_ice_shelf_area_fraction
+
+ upwelling_radiative_flux_per_unit_wavelength_in_air
-
- atmosphere_moles_of_carbon_tetrachloride
+
+ upwelling_radiance_per_unit_wavelength_in_air
-
- mole_fraction_of_methylglyoxal_in_air
+
+ surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
-
- mole_fraction_of_dichlorine_peroxide_in_air
+
+ surface_upwelling_shortwave_flux_in_air
-
- mole_fraction_of_noy_expressed_as_nitrogen_in_air
+
+ surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water
-
- net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton
+
+ surface_upwelling_radiative_flux_per_unit_wavelength_in_air
-
- mole_fraction_of_inorganic_bromine_in_air
+
+ surface_upwelling_radiance_per_unit_wavelength_in_sea_water
-
- water_vapor_saturation_deficit_in_air
+
+ volume_scattering_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles
-
- tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning
+
+ volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles
-
- tendency_of_atmosphere_moles_of_carbon_tetrachloride
+
+ soil_mass_content_of_carbon
-
- tendency_of_atmosphere_moles_of_carbon_monoxide
+
+ slow_soil_pool_mass_content_of_carbon
-
- tendency_of_atmosphere_moles_of_cfc113
+
+ root_mass_content_of_carbon
-
- atmosphere_moles_of_cfc113
+
+ miscellaneous_living_matter_mass_content_of_carbon
-
- tendency_of_atmosphere_moles_of_cfc114
+
+ fast_soil_pool_mass_content_of_carbon
-
- atmosphere_moles_of_cfc114
+
+ medium_soil_pool_mass_content_of_carbon
-
- tendency_of_atmosphere_moles_of_cfc115
+
+ leaf_mass_content_of_carbon
-
- atmosphere_moles_of_cfc115
+
+ carbon_mass_content_of_forestry_and_agricultural_products
-
- tendency_of_atmosphere_moles_of_cfc12
+
+ carbon_mass_content_of_forestry_and_agricultural_products
-
- atmosphere_moles_of_cfc12
+
+ surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance
-
- tendency_of_atmosphere_moles_of_halon1202
+
+ surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth
-
- atmosphere_moles_of_halon1202
+
+ surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration
-
- tendency_of_atmosphere_moles_of_halon1211
+
+ surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil
-
- atmosphere_moles_of_halon1211
+
+ surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration
-
- tendency_of_atmosphere_moles_of_halon1301
+
+ northward_transformed_eulerian_mean_air_velocity
-
- atmosphere_moles_of_halon1301
+
+ eastward_transformed_eulerian_mean_air_velocity
-
- tendency_of_atmosphere_moles_of_halon2402
+
+ surface_litter_mass_content_of_carbon
-
- atmosphere_moles_of_halon2402
+
+ litter_mass_content_of_carbon
@@ -32308,14 +32450,14 @@
mole_concentration_of_diatoms_expressed_as_nitrogen_in_sea_water
-
- tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes
-
-
tendency_of_mole_concentration_of_dissolved_inorganic_silicon_in_sea_water_due_to_biological_processes
+
+ tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes
+
+
tendency_of_atmosphere_mole_concentration_of_carbon_monoxide_due_to_chemical_destruction
@@ -32324,56 +32466,64 @@
volume_extinction_coefficient_in_air_due_to_ambient_aerosol_particles
-
- atmosphere_mass_content_of_convective_cloud_condensed_water
+
+ water_vapor_partial_pressure_in_air
-
- water_evaporation_flux_from_canopy
+
+ platform_name
-
- precipitation_flux_onto_canopy
+
+ platform_id
-
- surface_downwelling_shortwave_flux_in_air_assuming_clear_sky
+
+ mass_flux_of_carbon_into_litter_from_vegetation
-
- surface_downwelling_radiance_per_unit_wavelength_in_sea_water
+
+ subsurface_litter_mass_content_of_carbon
-
- upwelling_radiative_flux_per_unit_wavelength_in_sea_water
+
+ stem_mass_content_of_carbon
-
- downwelling_photon_flux_per_unit_wavelength_in_sea_water
+
+ mole_concentration_of_dissolved_inorganic_14C_in_sea_water
-
- downwelling_radiance_per_unit_wavelength_in_sea_water
+
+ surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon
-
- surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water
+
+ surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C
-
- surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water
+
+ mole_concentration_of_dissolved_inorganic_13C_in_sea_water
-
- surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water
+
+ surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water
-
- surface_downwelling_shortwave_flux_in_air
+
+ surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water
-
- tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice
+
+ surface_upwelling_radiance_per_unit_wavelength_in_air
+
+
+
+ surface_upwelling_longwave_flux_in_air
+
+
+
+ incoming_water_volume_transport_along_river_channel
@@ -32392,792 +32542,820 @@
sea_ice_temperature_expressed_as_heat_content
-
- outgoing_water_volume_transport_along_river_channel
+
+ water_evapotranspiration_flux
-
- lwe_thickness_of_stratiform_precipitation_amount
+
+ surface_water_evaporation_flux
-
- tendency_of_atmosphere_moles_of_methane
+
+ water_volume_transport_into_sea_water_from_rivers
-
- rate_of_hydroxyl_radical_destruction_due_to_reaction_with_nmvoc
+
+ stratiform_graupel_flux
-
- magnitude_of_sea_ice_displacement
+
+ wood_debris_mass_content_of_carbon
-
- surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water
+
+ toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol
-
- surface_downwelling_radiative_flux_per_unit_wavelength_in_air
+
+ water_flux_into_sea_water_from_rivers
-
- surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
+
+ integral_wrt_height_of_product_of_northward_wind_and_specific_humidity
-
- surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water
+
+ integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity
-
- surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water
+
+ integral_wrt_depth_of_sea_water_temperature
-
- surface_downwelling_longwave_flux_in_air
+
+ integral_wrt_depth_of_sea_water_temperature
-
- integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air
+
+ integral_wrt_depth_of_sea_water_temperature
-
- integral_wrt_time_of_surface_downwelling_longwave_flux_in_air
+
+ integral_wrt_depth_of_sea_water_temperature
-
- downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water
+
+ integral_wrt_depth_of_sea_water_practical_salinity
-
- downwelling_radiative_flux_per_unit_wavelength_in_sea_water
+
+ northward_ocean_heat_transport_due_to_parameterized_eddy_advection
-
- downwelling_radiative_flux_per_unit_wavelength_in_air
+
+ tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection
-
- downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
+
+ ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection
-
- downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water
+
+ ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection
-
- downwelling_radiance_per_unit_wavelength_in_air
+
+ upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
-
- downwelling_photon_radiance_per_unit_wavelength_in_sea_water
+
+ sea_water_y_velocity_due_to_parameterized_mesoscale_eddies
-
- surface_upwelling_shortwave_flux_in_air_assuming_clear_sky
+
+ sea_water_x_velocity_due_to_parameterized_mesoscale_eddies
-
- surface_upwelling_longwave_flux_in_air_assuming_clear_sky
+
+ eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
-
- upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
+
+ northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
-
- upwelling_radiative_flux_per_unit_wavelength_in_air
+
+ tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection
-
- upwelling_radiance_per_unit_wavelength_in_air
+
+ tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection
-
- surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol
+
+ ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection
-
- surface_upwelling_shortwave_flux_in_air
+
+ ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection
-
- surface_upwelling_radiance_per_unit_wavelength_in_sea_water
+
+ ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection
-
- incoming_water_volume_transport_along_river_channel
+
+ ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection
-
- surface_upwelling_longwave_flux_in_air
+
+ ocean_heat_y_transport_due_to_parameterized_eddy_advection
-
- surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water
+
+ ocean_heat_x_transport_due_to_parameterized_eddy_advection
-
- surface_upwelling_radiative_flux_per_unit_wavelength_in_air
+
+ northward_ocean_salt_transport_due_to_parameterized_eddy_advection
-
- surface_upwelling_radiance_per_unit_wavelength_in_air
+
+ northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection
-
- surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water
+
+ integral_wrt_time_of_toa_outgoing_longwave_flux
-
- wood_debris_mass_content_of_carbon
+
+ integral_wrt_time_of_toa_net_downward_shortwave_flux
-
- water_flux_into_sea_water_from_rivers
+
+ integral_wrt_time_of_surface_net_downward_shortwave_flux
-
- integral_wrt_depth_of_sea_water_temperature
+
+ integral_wrt_time_of_surface_net_downward_longwave_flux
-
- integral_wrt_depth_of_sea_water_temperature
+
+ integral_wrt_time_of_surface_downward_sensible_heat_flux
-
- integral_wrt_depth_of_sea_water_temperature
+
+ integral_wrt_time_of_surface_downward_latent_heat_flux
-
- integral_wrt_depth_of_sea_water_temperature
+
+ integral_wrt_time_of_air_temperature_excess
-
- volume_scattering_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles
+
+ integral_wrt_time_of_air_temperature_deficit
-
- volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles
+
+ tendency_of_mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air_due_to_emission_from_aviation
-
- integral_wrt_height_of_product_of_northward_wind_and_specific_humidity
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_wet_deposition
-
- integral_wrt_depth_of_sea_water_practical_salinity
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_turbulent_deposition
-
- integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_gravitational_settling
-
- platform_yaw
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_waste_treatment_and_disposal
-
- platform_roll
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_savanna_and_grassland_fires
-
- water_vapor_partial_pressure_in_air
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_residential_and_commercial_combustion
-
- platform_name
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_maritime_transport
-
- platform_id
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_land_transport
-
- platform_pitch
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_industrial_processes_and_combustion
-
- tendency_of_specific_humidity_due_to_stratiform_precipitation
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_forest_fires
-
- tendency_of_air_temperature_due_to_stratiform_precipitation
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_energy_production_and_distribution
-
- water_evaporation_amount_from_canopy
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission
-
- tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_turbulent_deposition
+
+ tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_dry_deposition
-
- tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_gravitational_settling
+
+ mass_fraction_of_elemental_carbon_dry_aerosol_particles_in_air
-
- tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_emission
+
+ atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles
-
- atmosphere_mass_content_of_cloud_ice
+
+ mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air
-
- stratiform_precipitation_amount
+
+ lagrangian_tendency_of_air_pressure
-
- tendency_of_atmosphere_moles_of_nitrous_oxide
+
+ lagrangian_tendency_of_air_pressure
-
- tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_dry_deposition
+
+ air_pressure_at_mean_sea_level
-
- medium_soil_pool_mass_content_of_carbon
+
+ sea_floor_depth_below_geoid
-
- surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration
+
+ sea_surface_height_above_geoid
-
- surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon
+
+ sea_surface_height_above_geoid
-
- mole_concentration_of_dissolved_inorganic_13C_in_sea_water
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission
-
- surface_litter_mass_content_of_carbon
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission
-
- surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration
+
+ atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles
-
- fast_soil_pool_mass_content_of_carbon
+
+ atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles
-
- soil_mass_content_of_carbon
+
+ tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_deposition
-
- slow_soil_pool_mass_content_of_carbon
+
+ tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_dry_deposition
-
- root_mass_content_of_carbon
+
+ surface_geostrophic_eastward_sea_water_velocity
-
- miscellaneous_living_matter_mass_content_of_carbon
+
+ surface_geostrophic_northward_sea_water_velocity
-
- carbon_mass_content_of_forestry_and_agricultural_products
+
+ tendency_of_sea_surface_height_above_mean_sea_level
+
+
+
+ surface_geostrophic_sea_water_y_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ surface_geostrophic_sea_water_x_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid
+
+
+
+ sea_surface_height_above_mean_sea_level
-
- carbon_mass_content_of_forestry_and_agricultural_products
+
+ sea_surface_height_above_mean_sea_level
-
- surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance
+
+ sea_floor_depth_below_mean_sea_level
-
- surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth
+
+ mass_fraction_of_pm10_ambient_aerosol_particles_in_air
-
- surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil
+
+ mass_fraction_of_pm10_ambient_aerosol_particles_in_air
-
- northward_transformed_eulerian_mean_air_velocity
+
+ mass_concentration_of_pm10_ambient_aerosol_particles_in_air
-
- eastward_transformed_eulerian_mean_air_velocity
+
+ atmosphere_optical_thickness_due_to_pm10_ambient_aerosol_particles
-
- mass_flux_of_carbon_into_litter_from_vegetation
+
+ mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air
-
- subsurface_litter_mass_content_of_carbon
+
+ mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air
-
- litter_mass_content_of_carbon
+
+ mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air
-
- stem_mass_content_of_carbon
+
+ atmosphere_optical_thickness_due_to_pm2p5_ambient_aerosol_particles
-
- mole_concentration_of_dissolved_inorganic_14C_in_sea_water
+
+ mass_fraction_of_pm1_ambient_aerosol_particles_in_air
-
- surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C
+
+ mass_fraction_of_pm1_ambient_aerosol_particles_in_air
-
- stratiform_precipitation_flux
+
+ mass_concentration_of_pm1_ambient_aerosol_particles_in_air
-
- lwe_stratiform_precipitation_rate
+
+ atmosphere_optical_thickness_due_to_pm1_ambient_aerosol_particles
-
- surface_water_evaporation_flux
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition
-
- water_evapotranspiration_flux
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition
-
- water_volume_transport_into_sea_water_from_rivers
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition
-
- stratiform_graupel_flux
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition
-
- toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling
-
- ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling
-
- ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition
-
- sea_water_x_velocity_due_to_parameterized_mesoscale_eddies
+
+ tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition
-
- tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection
+
+ tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_wet_deposition
-
- northward_ocean_heat_transport_due_to_parameterized_eddy_advection
+
+ tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_wet_deposition
-
- upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
+
+ tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_emission
-
- tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection
+
+ tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_dry_deposition
-
- integral_wrt_time_of_surface_net_downward_shortwave_flux
+
+ mass_fraction_of_sea_salt_dry_aerosol_particles_in_air
-
- tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection
+
+ mass_fraction_of_sea_salt_dry_aerosol_particles_in_air
-
- sea_water_y_velocity_due_to_parameterized_mesoscale_eddies
+
+ mass_concentration_of_sea_salt_dry_aerosol_particles_in_air
-
- ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection
+
+ mass_concentration_of_sea_salt_dry_aerosol_particles_in_air
-
- eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
+
+ atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles
-
- northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies
+
+ atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles
-
- ocean_heat_y_transport_due_to_parameterized_eddy_advection
+
+ atmosphere_mass_content_of_sea_salt_dry_aerosol_particles
-
- ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection
+
+ atmosphere_mass_content_of_sea_salt_dry_aerosol_particles
-
- ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection
+
+ ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity_deficit
-
- ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection
+
+ sea_surface_swell_wave_mean_period
-
- ocean_heat_x_transport_due_to_parameterized_eddy_advection
+
+ sea_surface_wind_wave_mean_period
-
- northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection
+
+ sea_surface_wave_mean_period
-
- northward_ocean_salt_transport_due_to_parameterized_eddy_advection
+
+ sea_surface_wind_wave_to_direction
-
- integral_wrt_time_of_toa_outgoing_longwave_flux
+
+ | |