diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e9b45d116a..82ba80c4ff 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,10 +6,15 @@ version: 2 updates: - package-ecosystem: "github-actions" - directory: "/" + directories: + - "/" + - "/.github/workflows/composite/*" schedule: - # Check for updates to GitHub Actions every weekday - interval: "daily" + # Check later in the week - the upstream dependabot check in `workflows` runs deliberately early in the week. + # Therefore allowing time for the `workflows` update to be merged-and-released first. + interval: "weekly" + day: "thursday" + time: "01:00" + timezone: "Europe/London" labels: - - "New: Pull Request" - "Bot" diff --git a/.github/labeler.yml b/.github/labeler.yml index adee762bfc..14e9a95d30 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,6 +1,9 @@ -# Make sure any dependency changes are benchmarked (only changes to the locks -# make a material difference - changes to the Conda YAML files are not -# benchmarked). +# benchmark_this automatically triggers the benchmark workflow when added by +# a user. No triggering happens when GitHub Actions adds the label (this +# avoids security vulnerabilities), so alternative triggers for the below +# files are therefore included in workflows/benchmarks_run.yml. Automatic +# labelling is still included here to make it easier to search pull requests, +# and to reinforce the culture of using this label. benchmark_this: - changed-files: - - any-glob-to-any-file: 'requirements/locks/*.lock' + - any-glob-to-any-file: ['requirements/locks/*.lock', "setup.py"] diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 597c413457..34bc59182c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,3 +7,8 @@ --- [Consult Iris pull request check list]( https://scitools-iris.readthedocs.io/en/latest/developers_guide/contributing_pull_request_checklist.html) + +--- +Add any of the below labels to trigger actions on this PR: + +- https://github.com/SciTools/iris/labels/benchmark_this diff --git a/.github/workflows/benchmarks_run.yml b/.github/workflows/benchmarks_run.yml index 69d753e4cc..287735c335 100644 --- a/.github/workflows/benchmarks_run.yml +++ b/.github/workflows/benchmarks_run.yml @@ -16,20 +16,51 @@ on: required: false type: string pull_request: - types: [labeled] + # Add the `labeled` type to the default list. + types: [labeled, opened, synchronize, reopened] jobs: + pre-checks: + runs-on: ubuntu-latest + if: github.repository == 'SciTools/iris' + outputs: + overnight: ${{ steps.overnight.outputs.check }} + branch: ${{ steps.branch.outputs.check }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - id: files-changed + uses: marceloprado/has-changed-path@df1b7a3161b8fb9fd8c90403c66a9e66dfde50cb + with: + # SEE ALSO .github/labeler.yml . + paths: requirements/locks/*.lock setup.py + - id: overnight + if: github.event_name != 'pull_request' + run: echo "check=true" >> "$GITHUB_OUTPUT" + - id: branch + if: > + github.event_name == 'pull_request' + && + ( + steps.files-changed.outputs.changed == 'true' + || + github.event.label.name == 'benchmark_this' + ) + run: echo "check=true" >> "$GITHUB_OUTPUT" + + benchmark: - if: > - github.repository == 'SciTools/iris' && - (github.event_name != 'pull_request' || - github.event.label.name == 'benchmark_this') runs-on: ubuntu-latest + needs: pre-checks + if: > + needs.pre-checks.outputs.overnight == 'true' || + needs.pre-checks.outputs.branch == 'true' env: IRIS_TEST_DATA_LOC_PATH: benchmarks IRIS_TEST_DATA_PATH: benchmarks/iris-test-data - IRIS_TEST_DATA_VERSION: "2.22" + IRIS_TEST_DATA_VERSION: "2.28" # Lets us manually bump the cache to rebuild ENV_CACHE_BUILD: "0" TEST_DATA_CACHE_BUILD: "2" @@ -40,9 +71,9 @@ jobs: with: fetch-depth: 0 - - name: Install ASV & Nox + - name: Install Nox run: | - pip install "asv!=0.6.2" nox + pip install nox - name: Cache environment directories id: cache-env-dir @@ -76,16 +107,16 @@ jobs: echo "OVERRIDE_TEST_DATA_REPOSITORY=${GITHUB_WORKSPACE}/${IRIS_TEST_DATA_PATH}/test_data" >> $GITHUB_ENV - name: Benchmark this pull request - if: ${{ github.event.label.name == 'benchmark_this' }} + if: needs.pre-checks.outputs.branch == 'true' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PR_NUMBER: ${{ github.event.number }} run: | - python benchmarks/bm_runner.py branch origin/${{ github.base_ref }} + nox -s benchmarks -- branch origin/${{ github.base_ref }} - name: Run overnight benchmarks id: overnight - if: ${{ github.event_name != 'pull_request' }} + if: needs.pre-checks.outputs.overnight == 'true' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -97,7 +128,7 @@ jobs: if [ "$first_commit" != "" ] then - python benchmarks/bm_runner.py overnight $first_commit + nox -s benchmarks -- overnight $first_commit fi - name: Warn of failure diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index a057609c62..57dd7e0371 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -23,4 +23,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.02.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.2 diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 5f1b2397ef..4b21e73384 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -35,22 +35,23 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python-version: ["3.11"] + python-version: ["3.12"] session: ["doctest", "gallery", "linkcheck"] include: - os: "ubuntu-latest" - python-version: "3.11" + python-version: "3.12" session: "tests" coverage: "--coverage" - os: "ubuntu-latest" - python-version: "3.10" + python-version: "3.11" session: "tests" - os: "ubuntu-latest" - python-version: "3.9" + python-version: "3.10" session: "tests" env: - IRIS_TEST_DATA_VERSION: "2.22" + # NOTE: IRIS_TEST_DATA_VERSION is also set in benchmarks_run.yml + IRIS_TEST_DATA_VERSION: "2.28" ENV_NAME: "ci-tests" steps: @@ -68,14 +69,14 @@ jobs: - name: "data cache" uses: ./.github/workflows/composite/iris-data-cache with: - cache_build: 0 + cache_build: 6 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: 0 + cache_build: 6 cache_period: ${{ env.CACHE_PERIOD }} env_name: ${{ env.ENV_NAME }} @@ -83,15 +84,14 @@ jobs: uses: conda-incubator/setup-miniconda@v3 with: miniforge-version: latest - channels: conda-forge,defaults + channels: conda-forge 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_build: 6 cache_period: ${{ env.CACHE_PERIOD }} env_name: ${{ env.ENV_NAME }} install_packages: "cartopy nox pip" @@ -104,14 +104,14 @@ jobs: - name: "cartopy cache" uses: ./.github/workflows/composite/cartopy-cache with: - cache_build: 0 + cache_build: 6 cache_period: ${{ env.CACHE_PERIOD }} env_name: ${{ env.ENV_NAME }} - name: "nox cache" uses: ./.github/workflows/composite/nox-cache with: - cache_build: 2 + cache_build: 6 env_name: ${{ env.ENV_NAME }} lock_file: ${{ env.LOCK_FILE }} @@ -136,9 +136,13 @@ jobs: - name: "iris ${{ matrix.session }}" env: PY_VER: ${{ matrix.python-version }} + # Force coloured output on GitHub Actions. + PY_COLORS: "1" run: | nox --session ${{ matrix.session }} -- --verbose ${{ matrix.coverage }} - - name: Upload coverage report - uses: codecov/codecov-action@v4 + - name: "upload coverage report" if: ${{ matrix.coverage }} + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/ci-wheels.yml b/.github/workflows/ci-wheels.yml index 35dda2e0a6..9c53673481 100644 --- a/.github/workflows/ci-wheels.yml +++ b/.github/workflows/ci-wheels.yml @@ -52,7 +52,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] session: ["wheel"] env: ENV_NAME: "ci-wheels" diff --git a/.github/workflows/composite/cartopy-cache/action.yml b/.github/workflows/composite/cartopy-cache/action.yml index e805cbacc1..d42e5c36cb 100644 --- a/.github/workflows/composite/cartopy-cache/action.yml +++ b/.github/workflows/composite/cartopy-cache/action.yml @@ -20,7 +20,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: cartopy-cache with: path: ~/.local/share/cartopy diff --git a/.github/workflows/composite/conda-env-cache/action.yml b/.github/workflows/composite/conda-env-cache/action.yml index 6bfd6fff90..15eaaec63c 100644 --- a/.github/workflows/composite/conda-env-cache/action.yml +++ b/.github/workflows/composite/conda-env-cache/action.yml @@ -23,7 +23,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: conda-env-cache with: path: ${{ env.CONDA }}/envs/${{ inputs.env_name }} diff --git a/.github/workflows/composite/conda-pkg-cache/action.yml b/.github/workflows/composite/conda-pkg-cache/action.yml index 4472d7e415..48c4470e44 100644 --- a/.github/workflows/composite/conda-pkg-cache/action.yml +++ b/.github/workflows/composite/conda-pkg-cache/action.yml @@ -16,7 +16,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ~/conda_pkgs_dir key: ${{ runner.os }}-conda-pkgs-${{ inputs.env_name }}-p${{ inputs.cache_period }}-b${{ inputs.cache_build }} diff --git a/.github/workflows/composite/iris-data-cache/action.yml b/.github/workflows/composite/iris-data-cache/action.yml index 7bf72fae8b..7ba7acb2cc 100644 --- a/.github/workflows/composite/iris-data-cache/action.yml +++ b/.github/workflows/composite/iris-data-cache/action.yml @@ -16,7 +16,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: data-cache with: path: ~/iris-test-data diff --git a/.github/workflows/composite/nox-cache/action.yml b/.github/workflows/composite/nox-cache/action.yml index 468dd22d81..00387331e7 100644 --- a/.github/workflows/composite/nox-cache/action.yml +++ b/.github/workflows/composite/nox-cache/action.yml @@ -16,7 +16,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ github.workspace }}/.nox key: ${{ runner.os }}-nox-${{ inputs.env_name }}-s${{ matrix.session }}-py${{ matrix.python-version }}-b${{ inputs.cache_build }}-${{ hashFiles(inputs.lock_file) }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index e906b892e6..f01a7d9b33 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -14,5 +14,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.02.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.2 secrets: inherit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ac83b6178b..acc88476e9 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.5.0 + rev: v5.0.0 hooks: # Prevent giant files from being committed. - id: check-added-large-files @@ -29,7 +29,7 @@ repos: - id: no-commit-to-branch - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.2.1" + rev: "v0.7.1" hooks: - id: ruff types: [file, python] @@ -38,20 +38,20 @@ repos: types: [file, python] - repo: https://github.com/codespell-project/codespell - rev: "v2.2.6" + rev: "v2.3.0" hooks: - id: codespell types_or: [asciidoc, python, markdown, rst] additional_dependencies: [tomli] - repo: https://github.com/PyCQA/flake8 - rev: 7.0.0 + rev: 7.1.1 hooks: - id: flake8 types: [file, python] - repo: https://github.com/asottile/blacken-docs - rev: 1.16.0 + rev: 1.19.1 hooks: - id: blacken-docs types: [file, rst] @@ -61,3 +61,18 @@ repos: hooks: - id: sort-all types: [file, python] + +- repo: https://github.com/pre-commit/mirrors-mypy + rev: 'v1.13.0' + hooks: + - id: mypy + additional_dependencies: + - 'types-requests' + exclude: 'noxfile\.py|docs/src/conf\.py' + +- repo: https://github.com/numpy/numpydoc + rev: v1.8.0 + hooks: + - id: numpydoc-validation + exclude: "^lib/iris/tests/|docs/gallery_code/" + types: [file, python] diff --git a/benchmarks/README.md b/benchmarks/README.md index 316c8f9e32..911d5f7833 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -20,13 +20,13 @@ the PR's base branch, thus showing performance differences introduced by the PR. (This run is managed by [the aforementioned GitHub Action](../.github/workflows/benchmark.yml)). -`asv ...` commands must be run from this directory. You will need to have ASV -installed, as well as Nox (see -[Benchmark environments](#benchmark-environments)). - -The benchmark runner ([bm_runner.py](./bm_runner.py)) provides conveniences for +To run locally: the **benchmark runner** provides conveniences for common benchmark setup and run tasks, including replicating the automated -overnight run locally. See `python bm_runner.py --help` for detail. +overnight run locally. This is accessed via the Nox `benchmarks` session - see +`nox -s benchmarks -- --help` for detail (_see also: +[bm_runner.py](./bm_runner.py)_). Alternatively you can directly run `asv ...` +commands from this directory (you will still need Nox installed - see +[Benchmark environments](#benchmark-environments)). A significant portion of benchmark run time is environment management. Run-time can be reduced by placing the benchmark environment on the same file system as @@ -34,20 +34,28 @@ your [Conda package cache](https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#specify-pkg-directories), if it is not already. You can achieve this by either: -- Temporarily reconfiguring `delegated_env_commands` and `delegated_env_parent` +- Temporarily reconfiguring `ENV_PARENT` in `delegated_env_commands` in [asv.conf.json](asv.conf.json) to reference a location on the same file system as the Conda package cache. +- Using an alternative Conda package cache location during the benchmark run, + e.g. via the `$CONDA_PKGS_DIRS` environment variable. - Moving your Iris repo to the same file system as the Conda package cache. ### Environment variables * `OVERRIDE_TEST_DATA_REPOSITORY` - required - some benchmarks use `iris-test-data` content, and your local `site.cfg` is not available for -benchmark scripts. +benchmark scripts. The benchmark runner defers to any value already set in +the shell, but will otherwise download `iris-test-data` and set the variable +accordingly. * `DATA_GEN_PYTHON` - required - path to a Python executable that can be used to generate benchmark test objects/files; see [Data generation](#data-generation). The benchmark runner sets this -automatically, but will defer to any value already set in the shell. +automatically, but will defer to any value already set in the shell. Note that +[Mule](https://github.com/metomi/mule) will be automatically installed into +this environment, and sometimes +[iris-test-data](https://github.com/SciTools/iris-test-data) (see +`OVERRIDE_TEST_DATA_REPOSITORY`). * `BENCHMARK_DATA` - optional - path to a directory for benchmark synthetic test data, which the benchmark scripts will create if it doesn't already exist. Defaults to `/benchmarks/.data/` if not set. Note that some of @@ -57,11 +65,37 @@ plan accordingly. decorated with `@on_demand_benchmark` are included in the ASV run. Usually coupled with the ASV `--bench` argument to only run the benchmark(s) of interest. Is set during the benchmark runner `cperf` and `sperf` sub-commands. +* `ASV_COMMIT_ENVS` - optional - instruct the +[delegated environment management](#benchmark-environments) to create a +dedicated environment for each commit being benchmarked when set (to any +value). This means that benchmarking commits with different environment +requirements will not be delayed by repeated environment setup - especially +relevant given the [benchmark runner](bm_runner.py)'s use of +[--interleave-rounds](https://asv.readthedocs.io/en/stable/commands.html?highlight=interleave-rounds#asv-run), +or any time you know you will repeatedly benchmark the same commit. **NOTE:** +Iris environments are large so this option can consume a lot of disk space. ## Writing benchmarks [See the ASV docs](https://asv.readthedocs.io/) for full detail. +### What benchmarks to write + +It is not possible to maintain a full suite of 'unit style' benchmarks: + +* Benchmarks take longer to run than tests. +* Small benchmarks are more vulnerable to noise - they report a lot of false +positive regressions. + +We therefore recommend writing benchmarks representing scripts or single +operations that are likely to be run at the user level. + +The drawback of this approach: a reported regression is less likely to reveal +the root cause (e.g. if a commit caused a regression in coordinate-creation +time, but the only benchmark covering this was for file-loading). Be prepared +for manual investigations; and consider committing any useful benchmarks as +[on-demand benchmarks](#on-demand-benchmarks) for future developers to use. + ### Data generation **Important:** be sure not to use the benchmarking environment to generate any test objects/files, as this environment changes with each commit being @@ -84,8 +118,18 @@ repeats _between_ `setup()` calls using the `repeat` attribute. `warmup_time = 0` is also advisable since ASV performs independent re-runs to estimate run-time, and these will still be subject to the original problem. +### Custom benchmarks + +Iris benchmarking implements custom benchmark types, such as a `tracemalloc` +benchmark to measure memory growth. See [custom_bms/](./custom_bms) for more +detail. + ### Scaling / non-Scaling Performance Differences +**(We no longer advocate the below for benchmarks run during CI, given the +limited available runtime and risk of false-positives. It remains useful for +manual investigations).** + When comparing performance between commits/file-type/whatever it can be helpful to know if the differences exist in scaling or non-scaling parts of the Iris functionality in question. This can be done using a size parameter, setting diff --git a/benchmarks/asv.conf.json b/benchmarks/asv.conf.json index 4184629448..2857c90ad7 100644 --- a/benchmarks/asv.conf.json +++ b/benchmarks/asv.conf.json @@ -3,7 +3,7 @@ "project": "scitools-iris", "project_url": "https://github.com/SciTools/iris", "repo": "..", - "environment_type": "conda-delegated", + "environment_type": "delegated", "show_commit_url": "https://github.com/scitools/iris/commit/", "branches": ["upstream/main"], @@ -11,17 +11,54 @@ "env_dir": ".asv/env", "results_dir": ".asv/results", "html_dir": ".asv/html", - "plugins": [".asv_delegated_conda"], - - // The command(s) that create/update an environment correctly for the - // checked-out commit. - // Interpreted the same as build_command, with following exceptions: - // * No build-time environment variables. - // * Is run in the same environment as the ASV install itself. - "delegated_env_commands": [ - "PY_VER=3.11 nox --envdir={conf_dir}/.asv/env/nox01 --session=tests --install-only --no-error-on-external-run --verbose" + "plugins": [".asv_delegated"], + + "delegated_env_commands_comment": [ + "The command(s) that create/update an environment correctly for the", + "checked-out commit. Command(s) format follows `build_command`:", + " https://asv.readthedocs.io/en/stable/asv.conf.json.html#build-command-install-command-uninstall-command", + + "The commit key indicates the earliest commit where the command(s)", + "will work.", + + "Differences from `build_command`:", + " * See: https://asv.readthedocs.io/en/stable/asv.conf.json.html#build-command-install-command-uninstall-command", + " * Env vars limited to those set outside build time.", + " (e.g. `{conf_dir}` available but `{build_dir}` not)", + " * Run in the same environment as the ASV install itself.", + + "Mandatory format for the first 'command' within each commit:", + " * `ENV_PARENT=path/to/parent/directory/of/env-directory`", + " * Can contain env vars (e.g. `{conf_dir}`)", + " * `ENV_PARENT` available as `{env_parent}` in subsequent commands", + " * The environment will be detected as the most recently updated", + " environment in `{env_parent}`." + + ], + "delegated_env_commands": { + "c8a663a0": [ + "ENV_PARENT={conf_dir}/.asv/env/nox312", + "PY_VER=3.12 nox --envdir={env_parent} --session=tests --install-only --no-error-on-external-run --verbose" + ], + "d58fca7e": [ + "ENV_PARENT={conf_dir}/.asv/env/nox311", + "PY_VER=3.11 nox --envdir={env_parent} --session=tests --install-only --no-error-on-external-run --verbose" + ], + "44fae030": [ + "ENV_PARENT={conf_dir}/.asv/env/nox310", + "PY_VER=3.10 nox --envdir={env_parent} --session=tests --install-only --no-error-on-external-run --verbose" + ] + }, + + "command_comment": [ + "We know that the Nox command takes care of installation in each", + "environment, and in the case of Iris no specialised uninstall or", + "build commands are needed to get it working.", + + "We do however need to install the custom benchmarks for them to be", + "usable." ], - // The parent directory of the above environment. - // The most recently modified environment in the directory will be used. - "delegated_env_parent": "{conf_dir}/.asv/env/nox01" + "install_command": [], + "uninstall_command": [], + "build_command": ["python {conf_dir}/custom_bms/install.py"] } diff --git a/benchmarks/asv_delegated.py b/benchmarks/asv_delegated.py new file mode 100644 index 0000000000..fa5312d392 --- /dev/null +++ b/benchmarks/asv_delegated.py @@ -0,0 +1,350 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""ASV plug-in providing an alternative :class:`asv.environments.Environment` subclass. + +Preps an environment via custom user scripts, then uses that as the +benchmarking environment. + +""" + +from contextlib import contextmanager, suppress +from os import environ +from os.path import getmtime +from pathlib import Path +import sys + +from asv import util as asv_util +from asv.console import log +from asv.environment import Environment, EnvironmentUnavailable +from asv.repo import Repo +from asv.util import ProcessError + + +class EnvPrepCommands: + """A container for the environment preparation commands for a given commit. + + Designed to read a value from the `delegated_env_commands` in the ASV + config, and validate that the command(s) are structured correctly. + """ + + ENV_PARENT_VAR = "ENV_PARENT" + env_parent: Path + commands: list[str] + + def __init__(self, environment: Environment, raw_commands: tuple[str]): + env_var = self.ENV_PARENT_VAR + raw_commands_list = list(raw_commands) + + (first_command,) = environment._interpolate_commands(raw_commands_list[0]) + env: dict + command, env, return_codes, cwd = first_command + + valid = command == [] + valid = valid and return_codes == {0} + valid = valid and cwd is None + valid = valid and list(env.keys()) == [env_var] + if not valid: + message = ( + "First command MUST ONLY " + f"define the {env_var} env var, with no command e.g: " + f"`{env_var}=foo/`. Got: \n {raw_commands_list[0]}" + ) + raise ValueError(message) + + self.env_parent = Path(env[env_var]).resolve() + self.commands = raw_commands_list[1:] + + +class CommitFinder(dict[str, EnvPrepCommands]): + """A specialised dict for finding the appropriate env prep script for a commit.""" + + def __call__(self, repo: Repo, commit_hash: str): + """Return the latest env prep script that is earlier than the given commit.""" + + def validate_commit(commit: str, is_lookup: bool) -> None: + try: + _ = repo.get_date(commit) + except ProcessError: + if is_lookup: + message_start = "Lookup commit" + else: + message_start = "Requested commit" + repo_path = getattr(repo, "_path", "unknown") + message = f"{message_start}: {commit} not found in repo: {repo_path}" + raise KeyError(message) + + for lookup in self.keys(): + validate_commit(lookup, is_lookup=True) + validate_commit(commit_hash, is_lookup=False) + + def parent_distance(parent_hash: str) -> int: + range_spec = repo.get_range_spec(parent_hash, commit_hash) + parents = repo.get_hashes_from_range(range_spec) + + if parent_hash[:8] == commit_hash[:8]: + distance = 0 + elif len(parents) == 0: + distance = -1 + else: + distance = len(parents) + return distance + + parentage = {commit: parent_distance(commit) for commit in self.keys()} + parentage = {k: v for k, v in parentage.items() if v >= 0} + if len(parentage) == 0: + message = f"No env prep script available for commit: {commit_hash} ." + raise KeyError(message) + else: + parentage = dict(sorted(parentage.items(), key=lambda item: item[1])) + commit = next(iter(parentage)) + content = self[commit] + return content + + +class Delegated(Environment): + """Manage a benchmark environment using custom user scripts, run at each commit. + + Ignores user input variations - ``matrix`` / ``pythons`` / + ``exclude``, since environment is being managed outside ASV. + + A vanilla :class:`asv.environment.Environment` is created for containing + the expected ASV configuration files and checked-out project. The actual + 'functional' environment is created/updated using the command(s) specified + in the config ``delegated_env_commands``, then the location is recorded via + a symlink within the ASV environment. The symlink is used as the + environment path used for any executable calls (e.g. + ``python my_script.py``). + + """ + + tool_name = "delegated" + """Required by ASV as a unique identifier of the environment type.""" + + DELEGATED_LINK_NAME = "delegated_env" + """The name of the symlink to the delegated environment.""" + + COMMIT_ENVS_VAR = "ASV_COMMIT_ENVS" + """Env var that instructs a dedicated environment be created per commit.""" + + def __init__(self, conf, python, requirements, tagged_env_vars): + """Get a 'delegated' environment based on the given ASV config object. + + Parameters + ---------- + conf : dict + ASV configuration object. + + python : str + Ignored - environment management is delegated. The value is always + ``DELEGATED``. + + requirements : dict (str -> str) + Ignored - environment management is delegated. The value is always + an empty dict. + + tagged_env_vars : dict (tag, key) -> value + Ignored - environment management is delegated. The value is always + an empty dict. + + Raises + ------ + EnvironmentUnavailable + The original environment or delegated environment cannot be created. + + """ + ignored = [] + if python: + ignored.append(f"{python=}") + if requirements: + ignored.append(f"{requirements=}") + if tagged_env_vars: + ignored.append(f"{tagged_env_vars=}") + message = ( + f"Ignoring ASV setting(s): {', '.join(ignored)}. Benchmark " + "environment management is delegated to third party script(s)." + ) + log.warning(message) + self._python = "DELEGATED" + self._requirements = {} + self._tagged_env_vars = {} + super().__init__( + conf, + self._python, + self._requirements, + self._tagged_env_vars, + ) + + self._path_undelegated = Path(self._path) + """Preserves the 'true' path of the environment so that self._path can + be safely modified and restored.""" + + env_commands = getattr(conf, "delegated_env_commands") + try: + env_prep_commands = { + commit: EnvPrepCommands(self, commands) + for commit, commands in env_commands.items() + } + except ValueError as err: + message = f"Problem handling `delegated_env_commands`:\n{err}" + log.error(message) + raise EnvironmentUnavailable(message) + self._env_prep_lookup = CommitFinder(**env_prep_commands) + """An object that can be called downstream to get the appropriate + env prep script for a given repo and commit.""" + + @property + def _path_delegated(self) -> Path: + """The path of the symlink to the delegated environment.""" + return self._path_undelegated / self.DELEGATED_LINK_NAME + + @property + def _delegated_found(self) -> bool: + """Whether self._path_delegated successfully resolves to a directory.""" + resolved = None + with suppress(FileNotFoundError): + resolved = self._path_delegated.resolve(strict=True) + result = resolved is not None and resolved.is_dir() + return result + + def _symlink_to_delegated(self, delegated_env_path: Path) -> None: + """Create the symlink to the delegated environment.""" + self._path_delegated.unlink(missing_ok=True) + self._path_delegated.parent.mkdir(parents=True, exist_ok=True) + self._path_delegated.symlink_to(delegated_env_path, target_is_directory=True) + assert self._delegated_found + + def _setup(self): + """Temporarily try to set the user's active env as the delegated env. + + Environment prep will be run anyway once ASV starts checking out + commits, but this step tries to provide a usable environment (with + python, etc.) at the moment that ASV expects it. + + """ + current_env = Path(sys.executable).parents[1] + message = ( + "Temporarily using user's active environment as benchmarking " + f"environment: {current_env} . " + ) + try: + self._symlink_to_delegated(current_env) + _ = self.find_executable("python") + except Exception: + message = ( + f"Delegated environment {self.name} not yet set up (unable to " + "determine current environment)." + ) + self._path_delegated.unlink(missing_ok=True) + + message += "Correct environment will be set up at the first commit checkout." + log.warning(message) + + def _prep_env(self, repo: Repo, commit_hash: str) -> None: + """Prepare the delegated environment for the given commit hash.""" + message = ( + f"Running delegated environment management for: {self.name} " + f"at commit: {commit_hash[:8]}" + ) + log.info(message) + + env_prep: EnvPrepCommands + try: + env_prep = self._env_prep_lookup(repo, commit_hash) + except KeyError as err: + message = f"Problem finding env prep commands: {err}" + log.error(message) + raise EnvironmentUnavailable(message) + + new_env_per_commit = self.COMMIT_ENVS_VAR in environ + if new_env_per_commit: + env_parent = env_prep.env_parent / commit_hash[:8] + else: + env_parent = env_prep.env_parent + + # See :meth:`Environment._interpolate_commands`. + # All ASV-namespaced env vars are available in the below format when + # interpolating commands: + # ASV_FOO_BAR = {foo_bar} + # We want the env parent path to be one of those available. + global_key = f"ASV_{EnvPrepCommands.ENV_PARENT_VAR}" + self._global_env_vars[global_key] = str(env_parent) + + # The project checkout. + build_dir = Path(self._build_root) / self._repo_subdir + + # Run the script(s) for delegated environment creation/updating. + # (An adaptation of :meth:`Environment._interpolate_and_run_commands`). + for command, env, return_codes, cwd in self._interpolate_commands( + env_prep.commands + ): + local_envs = dict(environ) + local_envs.update(env) + if cwd is None: + cwd = str(build_dir) + _ = asv_util.check_output( + command, + timeout=self._install_timeout, + cwd=cwd, + env=local_envs, + valid_return_codes=return_codes, + ) + + # Find the environment created/updated by running env_prep.commands. + # The most recently updated directory in env_parent. + delegated_env_path = sorted( + env_parent.glob("*"), + key=getmtime, + reverse=True, + )[0] + # Record the environment's path via a symlink within this environment. + self._symlink_to_delegated(delegated_env_path) + + message = f"Environment {self.name} updated to spec at {commit_hash[:8]}" + log.info(message) + + def checkout_project(self, repo: Repo, commit_hash: str) -> None: + """Check out the working tree of the project at given commit hash.""" + super().checkout_project(repo, commit_hash) + self._prep_env(repo, commit_hash) + + @contextmanager + def _delegate_path(self): + """Context manager to use the delegated env path as this env's path.""" + if not self._delegated_found: + message = f"Delegated environment not found at: {self._path_delegated}" + log.error(message) + raise EnvironmentUnavailable(message) + + try: + self._path = str(self._path_delegated) + yield + finally: + self._path = str(self._path_undelegated) + + def find_executable(self, executable): + """Find an executable (e.g. python, pip) in the DELEGATED environment. + + Raises + ------ + OSError + If the executable is not found in the environment. + """ + if not self._delegated_found: + # Required during environment setup. OSError expected if executable + # not found. + raise OSError + + with self._delegate_path(): + return super().find_executable(executable) + + def run_executable(self, executable, args, **kwargs): + """Run a given executable (e.g. python, pip) in the DELEGATED environment.""" + with self._delegate_path(): + return super().run_executable(executable, args, **kwargs) + + def run(self, args, **kwargs): + # This is not a specialisation - just implementing the abstract method. + log.debug(f"Running '{' '.join(args)}' in {self.name}") + return self.run_executable("python", args, **kwargs) diff --git a/benchmarks/asv_delegated_conda.py b/benchmarks/asv_delegated_conda.py deleted file mode 100644 index c8070b063a..0000000000 --- a/benchmarks/asv_delegated_conda.py +++ /dev/null @@ -1,201 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""ASV plug-in providing an alternative :class:`asv.plugins.conda.Conda` subclass. - -Manages the Conda environment via custom user scripts. - -""" - -from os import environ -from os.path import getmtime -from pathlib import Path -from shutil import copy2, copytree, rmtree -from tempfile import TemporaryDirectory - -from asv import util as asv_util -from asv.config import Config -from asv.console import log -from asv.plugins.conda import Conda -from asv.repo import Repo - - -class CondaDelegated(Conda): - """Manage a Conda environment using custom user scripts, run at each commit. - - Ignores user input variations - ``matrix`` / ``pythons`` / - ``conda_environment_file``, since environment is being managed outside ASV. - - Original environment creation behaviour is inherited, but upon checking out - a commit the custom script(s) are run and the original environment is - replaced with a symlink to the custom environment. This arrangement is then - re-used in subsequent runs. - - """ - - tool_name = "conda-delegated" - - def __init__( - self, - conf: Config, - python: str, - requirements: dict, - tagged_env_vars: dict, - ) -> None: - """__init__. - - Parameters - ---------- - conf : Config instance - - python : str - Version of Python. Must be of the form "MAJOR.MINOR". - - requirements : dict - Dictionary mapping a PyPI package name to a version - identifier string. - - tagged_env_vars : dict - Environment variables, tagged for build vs. non-build - - """ - ignored = ["`python`"] - if requirements: - ignored.append("`requirements`") - if tagged_env_vars: - ignored.append("`tagged_env_vars`") - if conf.conda_channels: - ignored.append("conda_channels") - if conf.conda_environment_file: - ignored.append("`conda_environment_file`") - message = ( - f"Ignoring ASV setting(s): {', '.join(ignored)}. Benchmark " - "environment management is delegated to third party script(s)." - ) - log.warning(message) - requirements = {} - tagged_env_vars = {} - # All that is required to create ASV's bare-bones environment. - conf.conda_channels = ["defaults"] - conf.conda_environment_file = None - - super().__init__(conf, python, requirements, tagged_env_vars) - self._update_info() - - self._env_commands = self._interpolate_commands(conf.delegated_env_commands) - # Again using _interpolate_commands to get env parent path - allows use - # of the same ASV env variables. - env_parent_interpolated = self._interpolate_commands(conf.delegated_env_parent) - # Returns list of tuples, we just want the first. - env_parent_first = env_parent_interpolated[0] - # The 'command' is the first item in the returned tuple. - env_parent_string = " ".join(env_parent_first[0]) - self._delegated_env_parent = Path(env_parent_string).resolve() - - @property - def name(self): - """Get a name to uniquely identify this environment.""" - return asv_util.sanitize_filename(self.tool_name) - - def _update_info(self) -> None: - """Make sure class properties reflect the actual environment being used.""" - # Follow symlink if it has been created. - actual_path = Path(self._path).resolve() - self._path = str(actual_path) - - # Get custom environment's Python version if it exists yet. - try: - get_version = ( - "from sys import version_info; " - "print(f'{version_info.major}.{version_info.minor}')" - ) - actual_python = self.run(["-c", get_version]) - self._python = actual_python - except OSError: - pass - - def _prep_env(self) -> None: - """Run the custom environment script(s) and switch to using that environment.""" - message = f"Running delegated environment management for: {self.name}" - log.info(message) - env_path = Path(self._path) - - def copy_asv_files(src_parent: Path, dst_parent: Path) -> None: - """For copying between self._path and a temporary cache.""" - asv_files = list(src_parent.glob("asv*")) - # build_root_path.name usually == "project" . - asv_files += [src_parent / Path(self._build_root).name] - for src_path in asv_files: - dst_path = dst_parent / src_path.name - if not dst_path.exists(): - # Only caching in case the environment has been rebuilt. - # If the dst_path already exists: rebuilding hasn't - # happened. Also a non-issue when copying in the reverse - # direction because the cache dir is temporary. - if src_path.is_dir(): - func = copytree - else: - func = copy2 - func(src_path, dst_path) - - with TemporaryDirectory(prefix="delegated_asv_cache_") as asv_cache: - asv_cache_path = Path(asv_cache) - # Cache all of ASV's files as delegated command may remove and - # re-build the environment. - copy_asv_files(env_path.resolve(), asv_cache_path) - - # Adapt the build_dir to the cache location. - build_root_path = Path(self._build_root) - build_dir_original = build_root_path / self._repo_subdir - build_dir_subpath = build_dir_original.relative_to(build_root_path.parent) - build_dir = asv_cache_path / build_dir_subpath - - # Run the script(s) for delegated environment creation/updating. - # (An adaptation of self._interpolate_and_run_commands). - for command, env, return_codes, cwd in self._env_commands: - local_envs = dict(environ) - local_envs.update(env) - if cwd is None: - cwd = str(build_dir) - _ = asv_util.check_output( - command, - timeout=self._install_timeout, - cwd=cwd, - env=local_envs, - valid_return_codes=return_codes, - ) - - # Replace the env that ASV created with a symlink to the env - # created/updated by the custom script. - delegated_env_path = sorted( - self._delegated_env_parent.glob("*"), - key=getmtime, - reverse=True, - )[0] - if env_path.resolve() != delegated_env_path: - try: - env_path.unlink(missing_ok=True) - except IsADirectoryError: - rmtree(env_path) - env_path.symlink_to(delegated_env_path, target_is_directory=True) - - # Check that environment exists. - try: - env_path.resolve(strict=True) - except FileNotFoundError: - message = f"Path does not resolve to environment: {env_path}" - log.error(message) - raise RuntimeError(message) - - # Restore ASV's files from the cache (if necessary). - copy_asv_files(asv_cache_path, env_path.resolve()) - - # Record new environment information in properties. - self._update_info() - - def checkout_project(self, repo: Repo, commit_hash: str) -> None: - """Check out the working tree of the project at given commit hash.""" - super().checkout_project(repo, commit_hash) - self._prep_env() - log.info(f"Environment {self.name} updated to spec at {commit_hash[:8]}") diff --git a/benchmarks/benchmarks/__init__.py b/benchmarks/benchmarks/__init__.py index 87a77fa5a4..30a991a879 100644 --- a/benchmarks/benchmarks/__init__.py +++ b/benchmarks/benchmarks/__init__.py @@ -3,18 +3,20 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Common code for benchmarks.""" + from os import environ -import resource +import tracemalloc -ARTIFICIAL_DIM_SIZE = int(10e3) # For all artificial cubes, coords etc. +import numpy as np def disable_repeat_between_setup(benchmark_object): - """Benchmarks where object persistence would be inappropriate (decorator). + """Benchmark where object persistence would be inappropriate (decorator). E.g: - * Benchmarking data realisation - * Benchmarking Cube coord addition + + * Benchmarking data realisation + * Benchmarking Cube coord addition Can be applied to benchmark classes/methods/functions. @@ -35,86 +37,16 @@ def disable_repeat_between_setup(benchmark_object): return benchmark_object -class TrackAddedMemoryAllocation: - """Measures by how much process resident memory grew, during execution. - - Context manager which measures by how much process resident memory grew, - during execution of its enclosed code block. - - Obviously limited as to what it actually measures : Relies on the current - process not having significant unused (de-allocated) memory when the - tested codeblock runs, and only reliable when the code allocates a - significant amount of new memory. - - Example: - with TrackAddedMemoryAllocation() as mb: - initial_call() - other_call() - result = mb.addedmem_mb() - - Attributes - ---------- - RESULT_MINIMUM_MB : float - The smallest result that should ever be returned, in Mb. Results - fluctuate from run to run (usually within 1Mb) so if a result is - sufficiently small this noise will produce a before-after ratio over - AVD's detection threshold and be treated as 'signal'. Results - smaller than this value will therefore be returned as equal to this - value, ensuring fractionally small noise / no noise at all. - - """ - - RESULT_MINIMUM_MB = 5.0 - - @staticmethod - def process_resident_memory_mb(): - return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024.0 - - def __enter__(self): - self.mb_before = self.process_resident_memory_mb() - return self - - def __exit__(self, *_): - self.mb_after = self.process_resident_memory_mb() - - def addedmem_mb(self): - """Return measured memory growth, in Mb.""" - result = self.mb_after - self.mb_before - # Small results are too vulnerable to noise being interpreted as signal. - result = max(self.RESULT_MINIMUM_MB, result) - return result - - @staticmethod - def decorator(decorated_func): - """Benchmark to track growth in resident memory during execution. - - Intended for use on ASV ``track_`` benchmarks. Applies the - :class:`TrackAddedMemoryAllocation` context manager to the benchmark - code, sets the benchmark ``unit`` attribute to ``Mb``. - - """ - - def _wrapper(*args, **kwargs): - assert decorated_func.__name__[:6] == "track_" - # Run the decorated benchmark within the added memory context - # manager. - with TrackAddedMemoryAllocation() as mb: - decorated_func(*args, **kwargs) - return mb.addedmem_mb() - - decorated_func.unit = "Mb" - return _wrapper - - def on_demand_benchmark(benchmark_object): - """Disables these benchmark(s) unless ON_DEMAND_BENCHARKS env var is set. + """Disable these benchmark(s) unless ON_DEMAND_BENCHARKS env var is set. This is a decorator. For benchmarks that, for whatever reason, should not be run by default. E.g: - * Require a local file - * Used for scalability analysis instead of commit monitoring. + + * Require a local file + * Used for scalability analysis instead of commit monitoring. Can be applied to benchmark classes/methods/functions. diff --git a/benchmarks/benchmarks/aggregate_collapse.py b/benchmarks/benchmarks/aggregate_collapse.py new file mode 100644 index 0000000000..4d5d2923bc --- /dev/null +++ b/benchmarks/benchmarks/aggregate_collapse.py @@ -0,0 +1,212 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Benchmarks relating to :meth:`iris.cube.CubeList.merge` and ``concatenate``.""" + +import warnings + +import numpy as np + +from iris import analysis, coords, cube +from iris.warnings import IrisVagueMetadataWarning + +from .generate_data.stock import realistic_4d_w_everything + + +class AggregationMixin: + params = [[False, True]] + param_names = ["Lazy operations"] + + def setup(self, lazy_run: bool): + warnings.filterwarnings("ignore", message="Ignoring a datum") + warnings.filterwarnings("ignore", category=IrisVagueMetadataWarning) + cube = realistic_4d_w_everything(lazy=lazy_run) + + for cm in cube.cell_measures(): + cube.remove_cell_measure(cm) + for av in cube.ancillary_variables(): + cube.remove_ancillary_variable(av) + + agg_mln_data = np.arange(0, 70, 10) + agg_mln_repeat = np.repeat(agg_mln_data, 10) + + cube = cube[..., :10, :10] + + self.mln_aux = "aggregatable" + self.mln = "model_level_number" + agg_mln_coord = coords.AuxCoord(points=agg_mln_repeat, long_name=self.mln_aux) + + if lazy_run: + agg_mln_coord.points = agg_mln_coord.lazy_points() + cube.add_aux_coord(agg_mln_coord, 1) + self.cube = cube + + +class Aggregation(AggregationMixin): + def time_aggregated_by_MEAN(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.MEAN).data + + def time_aggregated_by_COUNT(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.COUNT, function=lambda values: values > 280 + ).data + + def time_aggregated_by_GMEAN(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.GMEAN).data + + def time_aggregated_by_HMEAN(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.HMEAN).data + + def time_aggregated_by_MAX_RUN(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.MAX_RUN, function=lambda values: values > 280 + ).data + + def time_aggregated_by_MAX(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.MAX).data + + def time_aggregated_by_MEDIAN(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.MEDIAN).data + + def time_aggregated_by_MIN(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.MIN).data + + def time_aggregated_by_PEAK(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.PEAK).data + + def time_aggregated_by_PERCENTILE(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.PERCENTILE, percent=[10, 50, 90] + ).data + + def time_aggregated_by_FAST_PERCENTILE(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, + analysis.PERCENTILE, + mdtol=0, + percent=[10, 50, 90], + fast_percentile_method=True, + ).data + + def time_aggregated_by_PROPORTION(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, + analysis.PROPORTION, + function=lambda values: values > 280, + ).data + + def time_aggregated_by_STD_DEV(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.STD_DEV).data + + def time_aggregated_by_VARIANCE(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.VARIANCE).data + + def time_aggregated_by_RMS(self, _): + _ = self.cube.aggregated_by(self.mln_aux, analysis.RMS).data + + def time_collapsed_by_MEAN(self, _): + _ = self.cube.collapsed(self.mln, analysis.MEAN).data + + def time_collapsed_by_COUNT(self, _): + _ = self.cube.collapsed( + self.mln, analysis.COUNT, function=lambda values: values > 280 + ).data + + def time_collapsed_by_GMEAN(self, _): + _ = self.cube.collapsed(self.mln, analysis.GMEAN).data + + def time_collapsed_by_HMEAN(self, _): + _ = self.cube.collapsed(self.mln, analysis.HMEAN).data + + def time_collapsed_by_MAX_RUN(self, _): + _ = self.cube.collapsed( + self.mln, analysis.MAX_RUN, function=lambda values: values > 280 + ).data + + def time_collapsed_by_MAX(self, _): + _ = self.cube.collapsed(self.mln, analysis.MAX).data + + def time_collapsed_by_MEDIAN(self, _): + _ = self.cube.collapsed(self.mln, analysis.MEDIAN).data + + def time_collapsed_by_MIN(self, _): + _ = self.cube.collapsed(self.mln, analysis.MIN).data + + def time_collapsed_by_PEAK(self, _): + _ = self.cube.collapsed(self.mln, analysis.PEAK).data + + def time_collapsed_by_PERCENTILE(self, _): + _ = self.cube.collapsed( + self.mln, analysis.PERCENTILE, percent=[10, 50, 90] + ).data + + def time_collapsed_by_FAST_PERCENTILE(self, _): + _ = self.cube.collapsed( + self.mln, + analysis.PERCENTILE, + mdtol=0, + percent=[10, 50, 90], + fast_percentile_method=True, + ).data + + def time_collapsed_by_PROPORTION(self, _): + _ = self.cube.collapsed( + self.mln, analysis.PROPORTION, function=lambda values: values > 280 + ).data + + def time_collapsed_by_STD_DEV(self, _): + _ = self.cube.collapsed(self.mln, analysis.STD_DEV).data + + def time_collapsed_by_VARIANCE(self, _): + _ = self.cube.collapsed(self.mln, analysis.VARIANCE).data + + def time_collapsed_by_RMS(self, _): + _ = self.cube.collapsed(self.mln, analysis.RMS).data + + +class WeightedAggregation(AggregationMixin): + def setup(self, lazy_run): + super().setup(lazy_run) + + weights = np.linspace(0, 1, 70) + weights = np.broadcast_to(weights, self.cube.shape[:2]) + weights = np.broadcast_to(weights.T, self.cube.shape[::-1]) + weights = weights.T + + self.weights = weights + + ## currently has problems with indexing weights + # def time_w_aggregated_by_WPERCENTILE(self, _): + # _ = self.cube.aggregated_by( + # self.mln_aux, analysis.WPERCENTILE, weights=self.weights, percent=[10, 50, 90] + # ).data + + def time_w_aggregated_by_SUM(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.SUM, weights=self.weights + ).data + + def time_w_aggregated_by_RMS(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.RMS, weights=self.weights + ).data + + def time_w_aggregated_by_MEAN(self, _): + _ = self.cube.aggregated_by( + self.mln_aux, analysis.MEAN, weights=self.weights + ).data + + def time_w_collapsed_by_WPERCENTILE(self, _): + _ = self.cube.collapsed( + self.mln, analysis.WPERCENTILE, weights=self.weights, percent=[10, 50, 90] + ).data + + def time_w_collapsed_by_SUM(self, _): + _ = self.cube.collapsed(self.mln, analysis.SUM, weights=self.weights).data + + def time_w_collapsed_by_RMS(self, _): + _ = self.cube.collapsed(self.mln, analysis.RMS, weights=self.weights).data + + def time_w_collapsed_by_MEAN(self, _): + _ = self.cube.collapsed(self.mln, analysis.MEAN, weights=self.weights).data diff --git a/benchmarks/benchmarks/cperf/__init__.py b/benchmarks/benchmarks/cperf/__init__.py index eaff9cf5e0..05a086bc44 100644 --- a/benchmarks/benchmarks/cperf/__init__.py +++ b/benchmarks/benchmarks/cperf/__init__.py @@ -9,13 +9,11 @@ Files available from the UK Met Office: moo ls moose:/adhoc/projects/avd/asv/data_for_nightly_tests/ """ + import numpy as np from iris import load_cube -# TODO: remove uses of PARSE_UGRID_ON_LOAD once UGRID parsing is core behaviour. -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - from ..generate_data import BENCHMARK_DATA from ..generate_data.ugrid import make_cubesphere_testfile @@ -91,5 +89,4 @@ def setup(self, file_type, three_d, three_times): self.file_type = file_type def load(self): - with PARSE_UGRID_ON_LOAD.context(): - return load_cube(str(self.file_path)) + return load_cube(str(self.file_path)) diff --git a/benchmarks/benchmarks/cperf/equality.py b/benchmarks/benchmarks/cperf/equality.py index 16f8c10aab..ffe61ef938 100644 --- a/benchmarks/benchmarks/cperf/equality.py +++ b/benchmarks/benchmarks/cperf/equality.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Equality benchmarks for the CPerf scheme of the UK Met Office's NG-VAT project.""" + from .. import on_demand_benchmark from . import SingleDiagnosticMixin diff --git a/benchmarks/benchmarks/cperf/load.py b/benchmarks/benchmarks/cperf/load.py index cafc4631c0..07c2de9e79 100644 --- a/benchmarks/benchmarks/cperf/load.py +++ b/benchmarks/benchmarks/cperf/load.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """File loading benchmarks for the CPerf scheme of the UK Met Office's NG-VAT project.""" + from .. import on_demand_benchmark from . import SingleDiagnosticMixin diff --git a/benchmarks/benchmarks/cperf/save.py b/benchmarks/benchmarks/cperf/save.py index 2d60f920c4..6dcd0b3bcf 100644 --- a/benchmarks/benchmarks/cperf/save.py +++ b/benchmarks/benchmarks/cperf/save.py @@ -6,7 +6,7 @@ from iris import save -from .. import TrackAddedMemoryAllocation, on_demand_benchmark +from .. import on_demand_benchmark from ..generate_data.ugrid import make_cube_like_2d_cubesphere, make_cube_like_umfield from . import _N_CUBESPHERE_UM_EQUIVALENT, _UM_DIMS_YX @@ -36,6 +36,5 @@ def _save_data(self, cube): def time_save_data_netcdf(self, data_type): self._save_data(self.cube) - @TrackAddedMemoryAllocation.decorator - def track_addedmem_save_data_netcdf(self, data_type): + def tracemalloc_save_data_netcdf(self, data_type): self._save_data(self.cube) diff --git a/benchmarks/benchmarks/cube.py b/benchmarks/benchmarks/cube.py index 4548d4c28d..0b6829ee2d 100644 --- a/benchmarks/benchmarks/cube.py +++ b/benchmarks/benchmarks/cube.py @@ -4,249 +4,113 @@ # See LICENSE in the root of the repository for full licensing details. """Cube benchmark tests.""" -import numpy as np - -from iris import analysis, aux_factory, coords, cube - -from . import ARTIFICIAL_DIM_SIZE, disable_repeat_between_setup -from .generate_data.stock import sample_meshcoord - - -def setup(*params): - """General variables needed by multiple benchmark classes.""" - global data_1d - global data_2d - global general_cube - - data_2d = np.zeros((ARTIFICIAL_DIM_SIZE,) * 2) - data_1d = data_2d[0] - general_cube = cube.Cube(data_2d) - - -class ComponentCommon: - # TODO: once https://github.com/airspeed-velocity/asv/pull/828 is released: - # * make class an ABC - # * remove NotImplementedError - # * combine setup_common into setup - """Run a generalised suite of benchmarks for cubes. - - A base class running a generalised suite of benchmarks for cubes that - include a specified component (e.g. Coord, CellMeasure etc.). Component to - be specified in a subclass. - - ASV will run the benchmarks within this class for any subclasses. - - Should only be instantiated within subclasses, but cannot enforce this - since ASV cannot handle classes that include abstract methods. - """ - - def setup(self): - """Prevent ASV instantiating (must therefore override setup() in any subclasses.).""" - raise NotImplementedError - - def create(self): - """Create a cube (generic). - - cube_kwargs allow dynamic inclusion of different components; - specified in subclasses. - """ - return cube.Cube(data=data_2d, **self.cube_kwargs) - - def setup_common(self): - """Shared setup code that can be called by subclasses.""" - self.cube = self.create() - - def time_create(self): - """Create a cube that includes an instance of the benchmarked component.""" - self.create() - - def time_add(self): - """Add an instance of the benchmarked component to an existing cube.""" - # Unable to create the copy during setup since this needs to be re-done - # for every repeat of the test (some components disallow duplicates). - general_cube_copy = general_cube.copy(data=data_2d) - self.add_method(general_cube_copy, *self.add_args) - - -class Cube: - def time_basic(self): - cube.Cube(data_2d) - - def time_rename(self): - general_cube.name = "air_temperature" - - -class AuxCoord(ComponentCommon): - def setup(self): - self.coord_name = "test" - coord_bounds = np.array([data_1d - 1, data_1d + 1]).transpose() - aux_coord = coords.AuxCoord( - long_name=self.coord_name, - points=data_1d, - bounds=coord_bounds, - units="days since 1970-01-01", - climatological=True, +from collections.abc import Iterable + +from iris import coords +from iris.cube import Cube + +from .generate_data.stock import realistic_4d_w_everything + + +class CubeCreation: + params = [[False, True], ["instantiate", "construct"]] + param_names = ["Cube has mesh", "Cube creation strategy"] + + cube_kwargs: dict + + def setup(self, w_mesh: bool, _) -> None: + # Loaded as two cubes due to the hybrid height. + source_cube = realistic_4d_w_everything(w_mesh=w_mesh) + + def get_coords_and_dims( + coords_iter: Iterable[coords._DimensionalMetadata], + ) -> list[tuple[coords._DimensionalMetadata, tuple[int, ...]]]: + return [(c, c.cube_dims(source_cube)) for c in coords_iter] + + self.cube_kwargs = dict( + data=source_cube.data, + standard_name=source_cube.standard_name, + long_name=source_cube.long_name, + var_name=source_cube.var_name, + units=source_cube.units, + attributes=source_cube.attributes, + cell_methods=source_cube.cell_methods, + dim_coords_and_dims=get_coords_and_dims(source_cube.dim_coords), + aux_coords_and_dims=get_coords_and_dims(source_cube.aux_coords), + aux_factories=source_cube.aux_factories, + cell_measures_and_dims=get_coords_and_dims(source_cube.cell_measures()), + ancillary_variables_and_dims=get_coords_and_dims( + source_cube.ancillary_variables() + ), ) - # Variables needed by the ComponentCommon base class. - self.cube_kwargs = {"aux_coords_and_dims": [(aux_coord, 0)]} - self.add_method = cube.Cube.add_aux_coord - self.add_args = (aux_coord, (0)) - - self.setup_common() - - def time_return_coords(self): - self.cube.coords() - - def time_return_coord_dims(self): - self.cube.coord_dims(self.coord_name) - - -class AuxFactory(ComponentCommon): - def setup(self): - coord = coords.AuxCoord(points=data_1d, units="m") - self.hybrid_factory = aux_factory.HybridHeightFactory(delta=coord) - - # Variables needed by the ComponentCommon base class. - self.cube_kwargs = { - "aux_coords_and_dims": [(coord, 0)], - "aux_factories": [self.hybrid_factory], - } - - self.setup_common() - - # Variables needed by the overridden time_add benchmark in this subclass. - cube_w_coord = self.cube.copy() - [cube_w_coord.remove_aux_factory(i) for i in cube_w_coord.aux_factories] - self.cube_w_coord = cube_w_coord - - def time_add(self): - # Requires override from super().time_add because the cube needs an - # additional coord. - self.cube_w_coord.add_aux_factory(self.hybrid_factory) - - -class CellMeasure(ComponentCommon): - def setup(self): - cell_measure = coords.CellMeasure(data_1d) - - # Variables needed by the ComponentCommon base class. - self.cube_kwargs = {"cell_measures_and_dims": [(cell_measure, 0)]} - self.add_method = cube.Cube.add_cell_measure - self.add_args = (cell_measure, 0) - - self.setup_common() - - -class CellMethod(ComponentCommon): - def setup(self): - cell_method = coords.CellMethod("test") - - # Variables needed by the ComponentCommon base class. - self.cube_kwargs = {"cell_methods": [cell_method]} - self.add_method = cube.Cube.add_cell_method - self.add_args = [cell_method] - - self.setup_common() - - -class AncillaryVariable(ComponentCommon): - def setup(self): - ancillary_variable = coords.AncillaryVariable(data_1d) - - # Variables needed by the ComponentCommon base class. - self.cube_kwargs = {"ancillary_variables_and_dims": [(ancillary_variable, 0)]} - self.add_method = cube.Cube.add_ancillary_variable - self.add_args = (ancillary_variable, 0) - - self.setup_common() - - -class MeshCoord: + def time_create(self, _, cube_creation_strategy: str) -> None: + if cube_creation_strategy == "instantiate": + _ = Cube(**self.cube_kwargs) + + elif cube_creation_strategy == "construct": + new_cube = Cube(data=self.cube_kwargs["data"]) + new_cube.standard_name = self.cube_kwargs["standard_name"] + new_cube.long_name = self.cube_kwargs["long_name"] + new_cube.var_name = self.cube_kwargs["var_name"] + new_cube.units = self.cube_kwargs["units"] + new_cube.attributes = self.cube_kwargs["attributes"] + new_cube.cell_methods = self.cube_kwargs["cell_methods"] + for coord, dims in self.cube_kwargs["dim_coords_and_dims"]: + assert isinstance(coord, coords.DimCoord) # Type hint to help linters. + new_cube.add_dim_coord(coord, dims) + for coord, dims in self.cube_kwargs["aux_coords_and_dims"]: + new_cube.add_aux_coord(coord, dims) + for aux_factory in self.cube_kwargs["aux_factories"]: + new_cube.add_aux_factory(aux_factory) + for cell_measure, dims in self.cube_kwargs["cell_measures_and_dims"]: + new_cube.add_cell_measure(cell_measure, dims) + for ancillary_variable, dims in self.cube_kwargs[ + "ancillary_variables_and_dims" + ]: + new_cube.add_ancillary_variable(ancillary_variable, dims) + + else: + message = f"Unknown cube creation strategy: {cube_creation_strategy}" + raise NotImplementedError(message) + + +class CubeEquality: params = [ - 6, # minimal cube-sphere - int(1e6), # realistic cube-sphere size - ARTIFICIAL_DIM_SIZE, # To match size in :class:`AuxCoord` + [False, True], + [False, True], + ["metadata_inequality", "coord_inequality", "data_inequality", "all_equal"], ] - param_names = ["number of faces"] - - def setup(self, n_faces): - mesh_kwargs = dict(n_nodes=n_faces + 2, n_edges=n_faces * 2, n_faces=n_faces) - - self.mesh_coord = sample_meshcoord(sample_mesh_kwargs=mesh_kwargs) - self.data = np.zeros(n_faces) - self.cube_blank = cube.Cube(data=self.data) - self.cube = self.create() - - def create(self): - return cube.Cube(data=self.data, aux_coords_and_dims=[(self.mesh_coord, 0)]) - - def time_create(self, n_faces): - _ = self.create() - - @disable_repeat_between_setup - def time_add(self, n_faces): - self.cube_blank.add_aux_coord(self.mesh_coord, 0) - - @disable_repeat_between_setup - def time_remove(self, n_faces): - self.cube.remove_coord(self.mesh_coord) - - -class Merge: - def setup(self): - self.cube_list = cube.CubeList() - for i in np.arange(2): - i_cube = general_cube.copy() - i_coord = coords.AuxCoord([i]) - i_cube.add_aux_coord(i_coord) - self.cube_list.append(i_cube) - - def time_merge(self): - self.cube_list.merge() - - -class Concatenate: - def setup(self): - dim_size = ARTIFICIAL_DIM_SIZE - self.cube_list = cube.CubeList() - for i in np.arange(dim_size * 2, step=dim_size): - i_cube = general_cube.copy() - i_coord = coords.DimCoord(np.arange(dim_size) + (i * dim_size)) - i_cube.add_dim_coord(i_coord, 0) - self.cube_list.append(i_cube) - - def time_concatenate(self): - self.cube_list.concatenate() - - -class Equality: - def setup(self): - self.cube_a = general_cube.copy() - self.cube_b = general_cube.copy() - - aux_coord = coords.AuxCoord(data_1d) - self.cube_a.add_aux_coord(aux_coord, 0) - self.cube_b.add_aux_coord(aux_coord, 1) - - def time_equality(self): - self.cube_a == self.cube_b - - -class Aggregation: - def setup(self): - repeat_number = 10 - repeat_range = range(int(ARTIFICIAL_DIM_SIZE / repeat_number)) - array_repeat = np.repeat(repeat_range, repeat_number) - array_unique = np.arange(len(array_repeat)) - - coord_repeat = coords.AuxCoord(points=array_repeat, long_name="repeat") - coord_unique = coords.DimCoord(points=array_unique, long_name="unique") - - local_cube = general_cube.copy() - local_cube.add_aux_coord(coord_repeat, 0) - local_cube.add_dim_coord(coord_unique, 0) - self.cube = local_cube - - def time_aggregated_by(self): - self.cube.aggregated_by("repeat", analysis.MEAN) + param_names = ["Cubes are lazy", "Cubes have meshes", "Scenario"] + + cube_1: Cube + cube_2: Cube + coord_name = "surface_altitude" + + def setup(self, lazy: bool, w_mesh: bool, scenario: str) -> None: + self.cube_1 = realistic_4d_w_everything(w_mesh=w_mesh, lazy=lazy) + # Using Cube.copy() produces different results due to sharing of the + # Mesh instance. + self.cube_2 = realistic_4d_w_everything(w_mesh=w_mesh, lazy=lazy) + + match scenario: + case "metadata_inequality": + self.cube_2.long_name = "different" + case "coord_inequality": + coord = self.cube_2.coord(self.coord_name) + coord.points = coord.core_points() * 2 + case "data_inequality": + self.cube_2.data = self.cube_2.core_data() * 2 + case "all_equal": + pass + case _: + message = f"Unknown scenario: {scenario}" + raise NotImplementedError(message) + + def time_equality(self, lazy: bool, __, ___) -> None: + _ = self.cube_1 == self.cube_2 + if lazy: + for cube in (self.cube_1, self.cube_2): + # Confirm that this benchmark is safe for repetition. + assert cube.coord(self.coord_name).has_lazy_points() + assert cube.has_lazy_data() diff --git a/benchmarks/benchmarks/generate_data/__init__.py b/benchmarks/benchmarks/generate_data/__init__.py index 4d80429889..bb53e26b2f 100644 --- a/benchmarks/benchmarks/generate_data/__init__.py +++ b/benchmarks/benchmarks/generate_data/__init__.py @@ -14,6 +14,7 @@ benchmark sequence runs over two different Python versions. """ + from contextlib import contextmanager from inspect import getsource from os import environ diff --git a/benchmarks/benchmarks/generate_data/stock.py b/benchmarks/benchmarks/generate_data/stock.py index 17f3b23f92..04698e8ff5 100644 --- a/benchmarks/benchmarks/generate_data/stock.py +++ b/benchmarks/benchmarks/generate_data/stock.py @@ -7,11 +7,14 @@ See :mod:`benchmarks.generate_data` for an explanation of this structure. """ +from contextlib import nullcontext from hashlib import sha256 import json from pathlib import Path -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD, load_mesh +import iris +from iris import cube +from iris.mesh import load_mesh from . import BENCHMARK_DATA, REUSE_DATA, load_realised, run_function_elsewhere @@ -87,7 +90,7 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): """Sample mesh wrapper for :meth:iris.tests.stock.mesh.sample_mesh`.""" def _external(*args, **kwargs): - from iris.experimental.ugrid import save_mesh + from iris.mesh import save_mesh from iris.tests.stock.mesh import sample_mesh save_path_ = kwargs.pop("save_path") @@ -101,13 +104,12 @@ def _external(*args, **kwargs): save_path = (BENCHMARK_DATA / f"sample_mesh_{args_hash}").with_suffix(".nc") if not REUSE_DATA or not save_path.is_file(): _ = run_function_elsewhere(_external, *arg_list, save_path=str(save_path)) - with PARSE_UGRID_ON_LOAD.context(): - if not lazy_values: - # Realise everything. - with load_realised(): - mesh = load_mesh(str(save_path)) - else: + if not lazy_values: + # Realise everything. + with load_realised(): mesh = load_mesh(str(save_path)) + else: + mesh = load_mesh(str(save_path)) return mesh @@ -115,7 +117,7 @@ def sample_meshcoord(sample_mesh_kwargs=None, location="face", axis="x"): """Sample meshcoord wrapper for :meth:`iris.tests.stock.mesh.sample_meshcoord`. Parameters deviate from the original as cannot pass a - :class:`iris.experimental.ugrid.Mesh to the separate Python instance - must + :class:`iris.mesh.Mesh to the separate Python instance - must instead generate the Mesh as well. MeshCoords cannot be saved to file, so the _external method saves the @@ -124,7 +126,7 @@ def sample_meshcoord(sample_mesh_kwargs=None, location="face", axis="x"): """ def _external(sample_mesh_kwargs_, save_path_): - from iris.experimental.ugrid import save_mesh + from iris.mesh import save_mesh from iris.tests.stock.mesh import sample_mesh, sample_meshcoord if sample_mesh_kwargs_: @@ -144,8 +146,38 @@ def _external(sample_mesh_kwargs_, save_path_): sample_mesh_kwargs_=sample_mesh_kwargs, save_path_=str(save_path), ) - with PARSE_UGRID_ON_LOAD.context(): - with load_realised(): - source_mesh = load_mesh(str(save_path)) + with load_realised(): + source_mesh = load_mesh(str(save_path)) # Regenerate MeshCoord from its Mesh, which we saved. return source_mesh.to_MeshCoord(location=location, axis=axis) + + +def realistic_4d_w_everything(w_mesh=False, lazy=False) -> iris.cube.Cube: + """Run :func:`iris.tests.stock.realistic_4d_w_everything` in ``DATA_GEN_PYTHON``. + + Parameters + ---------- + w_mesh : bool + See :func:`iris.tests.stock.realistic_4d_w_everything` for details. + lazy : bool + If True, the Cube will be returned with all arrays as they would + normally be loaded from file (i.e. most will still be lazy Dask + arrays). If False, all arrays will be realised NumPy arrays. + + """ + + def _external(w_mesh_: str, save_path_: str): + import iris + from iris.tests.stock import realistic_4d_w_everything + + cube = realistic_4d_w_everything(w_mesh=bool(w_mesh_)) + iris.save(cube, save_path_) + + save_path = (BENCHMARK_DATA / f"realistic_4d_w_everything_{w_mesh}").with_suffix( + ".nc" + ) + if not REUSE_DATA or not save_path.is_file(): + _ = run_function_elsewhere(_external, w_mesh_=w_mesh, save_path_=str(save_path)) + context = nullcontext() if lazy else load_realised() + with context: + return iris.load_cube(save_path, "air_potential_temperature") diff --git a/benchmarks/benchmarks/generate_data/ugrid.py b/benchmarks/benchmarks/generate_data/ugrid.py index 713e5dc7df..2cef4752ee 100644 --- a/benchmarks/benchmarks/generate_data/ugrid.py +++ b/benchmarks/benchmarks/generate_data/ugrid.py @@ -3,8 +3,8 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Scripts for generating supporting data for UGRID-related benchmarking.""" + from iris import load_cube as iris_loadcube -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD from . import BENCHMARK_DATA, REUSE_DATA, load_realised, run_function_elsewhere from .stock import ( @@ -84,8 +84,7 @@ def make_cube_like_2d_cubesphere(n_cube: int, with_mesh: bool): ) # File now *should* definitely exist: content is simply the desired cube. - with PARSE_UGRID_ON_LOAD.context(): - cube = iris_loadcube(str(filepath)) + cube = iris_loadcube(str(filepath)) # Ensure correct laziness. _ = cube.data @@ -154,9 +153,8 @@ def _external(xy_dims_, save_path_): ) if not REUSE_DATA or not save_path.is_file(): _ = run_function_elsewhere(_external, xy_dims, str(save_path)) - with PARSE_UGRID_ON_LOAD.context(): - with load_realised(): - cube = iris_loadcube(str(save_path)) + with load_realised(): + cube = iris_loadcube(str(save_path)) return cube diff --git a/benchmarks/benchmarks/import_iris.py b/benchmarks/benchmarks/import_iris.py index 566ffca78b..ff5f19e421 100644 --- a/benchmarks/benchmarks/import_iris.py +++ b/benchmarks/benchmarks/import_iris.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""import iris benchmarking.""" +"""Import iris benchmarking.""" from importlib import import_module, reload diff --git a/benchmarks/benchmarks/iterate.py b/benchmarks/benchmarks/iterate.py index 9353cf42ee..664bcf8ba2 100644 --- a/benchmarks/benchmarks/iterate.py +++ b/benchmarks/benchmarks/iterate.py @@ -3,27 +3,17 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Iterate benchmark tests.""" + import numpy as np from iris import coords, cube, iterate -from . import ARTIFICIAL_DIM_SIZE - - -def setup(): - """General variables needed by multiple benchmark classes.""" - global data_1d - global data_2d - global general_cube - - data_2d = np.zeros((ARTIFICIAL_DIM_SIZE,) * 2) - data_1d = data_2d[0] - general_cube = cube.Cube(data_2d) - class IZip: def setup(self): - local_cube = general_cube.copy() + data_2d = np.zeros((1000,) * 2) + data_1d = data_2d[0] + local_cube = cube.Cube(data_2d) coord_a = coords.AuxCoord(points=data_1d, long_name="a") coord_b = coords.AuxCoord(points=data_1d, long_name="b") self.coord_names = (coord.long_name for coord in (coord_a, coord_b)) diff --git a/benchmarks/benchmarks/load/__init__.py b/benchmarks/benchmarks/load/__init__.py index 8a7aa182d3..a4dfb40d19 100644 --- a/benchmarks/benchmarks/load/__init__.py +++ b/benchmarks/benchmarks/load/__init__.py @@ -2,16 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""File loading benchmark tests. - -Where applicable benchmarks should be parameterised for two sizes of input data: - * 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. Size should be _just_ large - enough - don't want to bloat benchmark runtime. - -""" +"""File loading benchmark tests.""" from iris import AttributeConstraint, Constraint, load, load_cube from iris.cube import Cube @@ -24,16 +15,16 @@ class LoadAndRealise: # For data generation timeout = 600.0 - params = [ + params = ( [(50, 50, 2), (1280, 960, 5), (2, 2, 1000)], [False, True], ["FF", "PP", "NetCDF"], - ] + ) param_names = ["xyz", "compressed", "file_format"] def setup_cache(self) -> dict: file_type_args = self.params[2] - file_path_dict = {} + file_path_dict: dict[tuple[int, int, int], dict[bool, dict[str, str]]] = {} for xyz in self.params[0]: file_path_dict[xyz] = {} x, y, z = xyz @@ -68,7 +59,7 @@ def time_realise(self, _, __, ___, ____) -> None: class STASHConstraint: # xyz sizes mimic LoadAndRealise to maximise file reuse. - params = [[(2, 2, 2), (1280, 960, 5), (2, 2, 1000)], ["FF", "PP"]] + params = ([(2, 2, 2), (1280, 960, 5), (2, 2, 1000)], ["FF", "PP"]) param_names = ["xyz", "file_format"] def setup_cache(self) -> dict: @@ -87,7 +78,7 @@ def time_stash_constraint(self, _, __, ___) -> None: class TimeConstraint: - params = [[3, 20], ["FF", "PP", "NetCDF"]] + params = ([3, 20], ["FF", "PP", "NetCDF"]) param_names = ["time_dim_len", "file_format"] def setup_cache(self) -> dict: @@ -112,7 +103,7 @@ class ManyVars: @staticmethod def _create_file(save_path: str) -> None: - """Is run externally - everything must be self-contained.""" + """Run externally - everything must be self-contained.""" import numpy as np from iris import save @@ -148,7 +139,7 @@ class StructuredFF: avoiding the cost of merging. """ - params = [[(2, 2, 2), (1280, 960, 5), (2, 2, 1000)], [False, True]] + params = ([(2, 2, 2), (1280, 960, 5), (2, 2, 1000)], [False, True]) param_names = ["xyz", "structured_loading"] def setup_cache(self) -> dict: diff --git a/benchmarks/benchmarks/load/ugrid.py b/benchmarks/benchmarks/load/ugrid.py index 626b746412..5ad0086ef3 100644 --- a/benchmarks/benchmarks/load/ugrid.py +++ b/benchmarks/benchmarks/load/ugrid.py @@ -2,19 +2,10 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Mesh data loading benchmark tests. - -Where possible benchmarks should be parameterised for two sizes of input data: - * 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. - -""" +"""Mesh data loading benchmark tests.""" from iris import load_cube as iris_load_cube -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid import load_mesh as iris_load_mesh +from iris.mesh import load_mesh as iris_load_mesh from ..generate_data.stock import create_file__xios_2d_face_half_levels @@ -26,13 +17,11 @@ def synthetic_data(**kwargs): def load_cube(*args, **kwargs): - with PARSE_UGRID_ON_LOAD.context(): - return iris_load_cube(*args, **kwargs) + return iris_load_cube(*args, **kwargs) def load_mesh(*args, **kwargs): - with PARSE_UGRID_ON_LOAD.context(): - return iris_load_mesh(*args, **kwargs) + return iris_load_mesh(*args, **kwargs) class BasicLoading: diff --git a/benchmarks/benchmarks/merge_concat.py b/benchmarks/benchmarks/merge_concat.py new file mode 100644 index 0000000000..2d3738683a --- /dev/null +++ b/benchmarks/benchmarks/merge_concat.py @@ -0,0 +1,72 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Benchmarks relating to :meth:`iris.cube.CubeList.merge` and ``concatenate``.""" + +import warnings + +import numpy as np + +from iris.cube import CubeList +from iris.warnings import IrisVagueMetadataWarning + +from .generate_data.stock import realistic_4d_w_everything + + +class Merge: + # TODO: Improve coverage. + + cube_list: CubeList + + def setup(self): + source_cube = realistic_4d_w_everything() + + # Merge does not yet fully support cell measures and ancillary variables. + for cm in source_cube.cell_measures(): + source_cube.remove_cell_measure(cm) + for av in source_cube.ancillary_variables(): + source_cube.remove_ancillary_variable(av) + + second_cube = source_cube.copy() + scalar_coord = second_cube.coords(dimensions=[])[0] + scalar_coord.points = scalar_coord.points + 1 + self.cube_list = CubeList([source_cube, second_cube]) + + def time_merge(self): + _ = self.cube_list.merge_cube() + + def tracemalloc_merge(self): + _ = self.cube_list.merge_cube() + + tracemalloc_merge.number = 3 # type: ignore[attr-defined] + + +class Concatenate: + # TODO: Improve coverage. + + cube_list: CubeList + + params = [[False, True]] + param_names = ["Lazy operations"] + + def setup(self, lazy_run: bool): + warnings.filterwarnings("ignore", message="Ignoring a datum") + warnings.filterwarnings("ignore", category=IrisVagueMetadataWarning) + source_cube = realistic_4d_w_everything(lazy=lazy_run) + self.cube_list = CubeList([source_cube]) + for _ in range(24): + next_cube = self.cube_list[-1].copy() + first_dim_coord = next_cube.coord(dimensions=0, dim_coords=True) + first_dim_coord.points = ( + first_dim_coord.points + np.ptp(first_dim_coord.points) + 1 + ) + self.cube_list.append(next_cube) + + def time_concatenate(self, _): + _ = self.cube_list.concatenate_cube() + + def tracemalloc_concatenate(self, _): + _ = self.cube_list.concatenate_cube() + + tracemalloc_concatenate.number = 3 # type: ignore[attr-defined] diff --git a/benchmarks/benchmarks/experimental/__init__.py b/benchmarks/benchmarks/mesh/__init__.py similarity index 77% rename from benchmarks/benchmarks/experimental/__init__.py rename to benchmarks/benchmarks/mesh/__init__.py index ce727a7286..9cc76ce0aa 100644 --- a/benchmarks/benchmarks/experimental/__init__.py +++ b/benchmarks/benchmarks/mesh/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Benchmark tests for the experimental module.""" +"""Benchmark tests for the iris.mesh module.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/__init__.py b/benchmarks/benchmarks/mesh/utils/__init__.py similarity index 71% rename from lib/iris/tests/unit/experimental/ugrid/cf/__init__.py rename to benchmarks/benchmarks/mesh/utils/__init__.py index 19507555c7..e20973c0a7 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/__init__.py +++ b/benchmarks/benchmarks/mesh/utils/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.cf` package.""" +"""Benchmark tests for the iris.mesh.utils module.""" diff --git a/benchmarks/benchmarks/experimental/ugrid/regions_combine.py b/benchmarks/benchmarks/mesh/utils/regions_combine.py similarity index 83% rename from benchmarks/benchmarks/experimental/ugrid/regions_combine.py rename to benchmarks/benchmarks/mesh/utils/regions_combine.py index 10711d0349..a61deea56d 100644 --- a/benchmarks/benchmarks/experimental/ugrid/regions_combine.py +++ b/benchmarks/benchmarks/mesh/utils/regions_combine.py @@ -5,27 +5,18 @@ """Benchmarks stages of operation. Benchmarks stages of operation of the function -:func:`iris.experimental.ugrid.utils.recombine_submeshes`. - -Where possible benchmarks should be parameterised for two sizes of input data: - -* 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. +:func:`iris.mesh.utils.recombine_submeshes`. """ + import os import dask.array as da import numpy as np from iris import load, load_cube, save -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid.utils import recombine_submeshes +from iris.mesh.utils import recombine_submeshes -from ... import TrackAddedMemoryAllocation, on_demand_benchmark from ...generate_data.ugrid import make_cube_like_2d_cubesphere @@ -92,7 +83,7 @@ def setup_cache(self): ) def setup(self, n_cubesphere, imaginary_data=True, create_result_cube=True): - """Combine-tests "standard" setup operation. + """Combine tests "standard" setup operation. Load the source cubes (full-mesh + region) from disk. These are specific to the cubesize parameter. @@ -110,13 +101,12 @@ def setup(self, n_cubesphere, imaginary_data=True, create_result_cube=True): """ # Load source cubes (full-mesh and regions) - with PARSE_UGRID_ON_LOAD.context(): - self.full_mesh_cube = load_cube( - self._parametrised_cache_filename(n_cubesphere, "meshcube") - ) - self.region_cubes = load( - self._parametrised_cache_filename(n_cubesphere, "regioncubes") - ) + self.full_mesh_cube = load_cube( + self._parametrised_cache_filename(n_cubesphere, "meshcube") + ) + self.region_cubes = load( + self._parametrised_cache_filename(n_cubesphere, "regioncubes") + ) # Remove all var-names from loaded cubes, which can otherwise cause # problems. Also implement 'imaginary' data. @@ -178,8 +168,7 @@ def setup(self, n_cubesphere): def time_create_combined_cube(self, n_cubesphere): self.recombine() - @TrackAddedMemoryAllocation.decorator - def track_addedmem_create_combined_cube(self, n_cubesphere): + def tracemalloc_create_combined_cube(self, n_cubesphere): self.recombine() @@ -189,10 +178,7 @@ class CombineRegionsComputeRealData(MixinCombineRegions): def time_compute_data(self, n_cubesphere): _ = self.recombined_cube.data - # Vulnerable to noise, so disabled by default. - @on_demand_benchmark - @TrackAddedMemoryAllocation.decorator - def track_addedmem_compute_data(self, n_cubesphere): + def tracemalloc_compute_data(self, n_cubesphere): _ = self.recombined_cube.data @@ -210,10 +196,7 @@ def time_save(self, n_cubesphere): # Save to disk, which must compute data + stream it to file. save(self.recombined_cube, "tmp.nc") - # Vulnerable to noise, so disabled by default. - @on_demand_benchmark - @TrackAddedMemoryAllocation.decorator - def track_addedmem_save(self, n_cubesphere): + def tracemalloc_save(self, n_cubesphere): save(self.recombined_cube, "tmp.nc") def track_filesize_saved(self, n_cubesphere): @@ -221,7 +204,7 @@ def track_filesize_saved(self, n_cubesphere): return os.path.getsize("tmp.nc") * 1.0e-6 -CombineRegionsSaveData.track_filesize_saved.unit = "Mb" +CombineRegionsSaveData.track_filesize_saved.unit = "Mb" # type: ignore[attr-defined] class CombineRegionsFileStreamedCalc(MixinCombineRegions): @@ -240,8 +223,5 @@ def time_stream_file2file(self, n_cubesphere): # Save to disk, which must compute data + stream it to file. save(self.recombined_cube, "tmp.nc") - # Vulnerable to noise, so disabled by default. - @on_demand_benchmark - @TrackAddedMemoryAllocation.decorator - def track_addedmem_stream_file2file(self, n_cubesphere): + def tracemalloc_stream_file2file(self, n_cubesphere): save(self.recombined_cube, "tmp.nc") diff --git a/benchmarks/benchmarks/plot.py b/benchmarks/benchmarks/plot.py index 9b008ec41c..e8fbb5372d 100644 --- a/benchmarks/benchmarks/plot.py +++ b/benchmarks/benchmarks/plot.py @@ -3,13 +3,12 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Plot benchmark tests.""" + import matplotlib as mpl import numpy as np from iris import coords, cube, plot -from . import ARTIFICIAL_DIM_SIZE - mpl.use("agg") @@ -17,7 +16,7 @@ class AuxSort: def setup(self): # Manufacture data from which contours can be derived. # Should generate 10 distinct contours, regardless of dim size. - dim_size = int(ARTIFICIAL_DIM_SIZE / 5) + dim_size = 200 repeat_number = int(dim_size / 10) repeat_range = range(int((dim_size**2) / repeat_number)) data = np.repeat(repeat_range, repeat_number) diff --git a/benchmarks/benchmarks/regridding.py b/benchmarks/benchmarks/regridding.py index b311c94717..e227da0ec6 100644 --- a/benchmarks/benchmarks/regridding.py +++ b/benchmarks/benchmarks/regridding.py @@ -51,6 +51,22 @@ def time_regrid_area_w_new_grid(self) -> None: # Realise data out.data + def tracemalloc_regrid_area_w(self) -> None: + # Regrid the chunked cube + out = self.cube.regrid(self.template_cube, self.scheme_area_w) + # Realise data + out.data + + tracemalloc_regrid_area_w.number = 3 # type: ignore[attr-defined] + + def tracemalloc_regrid_area_w_new_grid(self) -> None: + # Regrid the chunked cube + out = self.chunked_cube.regrid(self.template_cube, self.scheme_area_w) + # Realise data + out.data + + tracemalloc_regrid_area_w_new_grid.number = 3 # type: ignore[attr-defined] + class CurvilinearRegridding: def setup(self) -> None: @@ -93,3 +109,11 @@ def time_regrid_pic(self) -> None: out = self.cube.regrid(self.template_cube, self.scheme_pic) # Realise the data out.data + + def tracemalloc_regrid_pic(self) -> None: + # Regrid the cube onto the template. + out = self.cube.regrid(self.template_cube, self.scheme_pic) + # Realise the data + out.data + + tracemalloc_regrid_pic.number = 3 # type: ignore[attr-defined] diff --git a/benchmarks/benchmarks/save.py b/benchmarks/benchmarks/save.py index 0c5f79947d..4bac1b1450 100644 --- a/benchmarks/benchmarks/save.py +++ b/benchmarks/benchmarks/save.py @@ -2,19 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""File saving benchmarks. +"""File saving benchmarks.""" -Where possible benchmarks should be parameterised for two sizes of input data: - * 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. - -""" from iris import save -from iris.experimental.ugrid import save_mesh +from iris.mesh import save_mesh -from . import TrackAddedMemoryAllocation, on_demand_benchmark from .generate_data.ugrid import make_cube_like_2d_cubesphere @@ -45,10 +37,7 @@ def time_netcdf_save_mesh(self, n_cubesphere, is_unstructured): if is_unstructured: self._save_mesh(self.cube) - # Vulnerable to noise, so disabled by default. - @on_demand_benchmark - @TrackAddedMemoryAllocation.decorator - def track_addedmem_netcdf_save(self, n_cubesphere, is_unstructured): + def tracemalloc_netcdf_save(self, n_cubesphere, is_unstructured): # Don't need to copy the cube here since track_ benchmarks don't # do repeats between self.setup() calls. self._save_data(self.cube, do_copy=False) diff --git a/benchmarks/benchmarks/sperf/__init__.py b/benchmarks/benchmarks/sperf/__init__.py index 0a87dbb25c..2b8b508fd5 100644 --- a/benchmarks/benchmarks/sperf/__init__.py +++ b/benchmarks/benchmarks/sperf/__init__.py @@ -7,10 +7,8 @@ SPerf = assessing performance against a series of increasingly large LFRic datasets. """ -from iris import load_cube -# TODO: remove uses of PARSE_UGRID_ON_LOAD once UGRID parsing is core behaviour. -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD +from iris import load_cube from ..generate_data.ugrid import make_cubesphere_testfile @@ -37,5 +35,4 @@ def setup(self, c_size, n_levels, n_times): ) def load_cube(self): - with PARSE_UGRID_ON_LOAD.context(): - return load_cube(str(self.file_path)) + return load_cube(str(self.file_path)) diff --git a/benchmarks/benchmarks/sperf/combine_regions.py b/benchmarks/benchmarks/sperf/combine_regions.py index 7d677ed74f..591b7bb9be 100644 --- a/benchmarks/benchmarks/sperf/combine_regions.py +++ b/benchmarks/benchmarks/sperf/combine_regions.py @@ -3,16 +3,16 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Region combine benchmarks for the SPerf scheme of the UK Met Office's NG-VAT project.""" + import os.path from dask import array as da import numpy as np from iris import load, load_cube, save -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid.utils import recombine_submeshes +from iris.mesh.utils import recombine_submeshes -from .. import TrackAddedMemoryAllocation, on_demand_benchmark +from .. import on_demand_benchmark from ..generate_data.ugrid import BENCHMARK_DATA, make_cube_like_2d_cubesphere @@ -83,7 +83,7 @@ def setup_cache(self): ) def setup(self, n_cubesphere, imaginary_data=True, create_result_cube=True): - """Combine-tests "standard" setup operation. + """Combine tests "standard" setup operation. Load the source cubes (full-mesh + region) from disk. These are specific to the cubesize parameter. @@ -101,13 +101,12 @@ def setup(self, n_cubesphere, imaginary_data=True, create_result_cube=True): """ # Load source cubes (full-mesh and regions) - with PARSE_UGRID_ON_LOAD.context(): - self.full_mesh_cube = load_cube( - self._parametrised_cache_filename(n_cubesphere, "meshcube") - ) - self.region_cubes = load( - self._parametrised_cache_filename(n_cubesphere, "regioncubes") - ) + self.full_mesh_cube = load_cube( + self._parametrised_cache_filename(n_cubesphere, "meshcube") + ) + self.region_cubes = load( + self._parametrised_cache_filename(n_cubesphere, "regioncubes") + ) # Remove all var-names from loaded cubes, which can otherwise cause # problems. Also implement 'imaginary' data. @@ -176,8 +175,7 @@ def setup(self, n_cubesphere, imaginary_data=True, create_result_cube=False): def time_create_combined_cube(self, n_cubesphere): self.recombine() - @TrackAddedMemoryAllocation.decorator - def track_addedmem_create_combined_cube(self, n_cubesphere): + def tracemalloc_create_combined_cube(self, n_cubesphere): self.recombine() @@ -188,8 +186,7 @@ class ComputeRealData(Mixin): def time_compute_data(self, n_cubesphere): _ = self.recombined_cube.data - @TrackAddedMemoryAllocation.decorator - def track_addedmem_compute_data(self, n_cubesphere): + def tracemalloc_compute_data(self, n_cubesphere): _ = self.recombined_cube.data @@ -207,8 +204,7 @@ def time_save(self, n_cubesphere): # Save to disk, which must compute data + stream it to file. self.save_recombined_cube() - @TrackAddedMemoryAllocation.decorator - def track_addedmem_save(self, n_cubesphere): + def tracemalloc_save(self, n_cubesphere): self.save_recombined_cube() def track_filesize_saved(self, n_cubesphere): @@ -234,6 +230,5 @@ def time_stream_file2file(self, n_cubesphere): # Save to disk, which must compute data + stream it to file. self.save_recombined_cube() - @TrackAddedMemoryAllocation.decorator - def track_addedmem_stream_file2file(self, n_cubesphere): + def tracemalloc_stream_file2file(self, n_cubesphere): self.save_recombined_cube() diff --git a/benchmarks/benchmarks/sperf/equality.py b/benchmarks/benchmarks/sperf/equality.py index 339687a22c..ddee90cd28 100644 --- a/benchmarks/benchmarks/sperf/equality.py +++ b/benchmarks/benchmarks/sperf/equality.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Equality benchmarks for the SPerf scheme of the UK Met Office's NG-VAT project.""" + from .. import on_demand_benchmark from . import FileMixin @@ -12,7 +13,7 @@ class CubeEquality(FileMixin): r"""Benchmark time and memory costs. Benchmark time and memory costs of comparing :class:`~iris.cube.Cube`\\ s - with attached :class:`~iris.experimental.ugrid.mesh.Mesh`\\ es. + with attached :class:`~iris.mesh.MeshXY`\\ es. Uses :class:`FileMixin` as the realistic case will be comparing :class:`~iris.cube.Cube`\\ s that have been loaded from file. diff --git a/benchmarks/benchmarks/sperf/load.py b/benchmarks/benchmarks/sperf/load.py index f3c5ef1136..d304a30c82 100644 --- a/benchmarks/benchmarks/sperf/load.py +++ b/benchmarks/benchmarks/sperf/load.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """File loading benchmarks for the SPerf scheme of the UK Met Office's NG-VAT project.""" + from .. import on_demand_benchmark from . import FileMixin diff --git a/benchmarks/benchmarks/sperf/save.py b/benchmarks/benchmarks/sperf/save.py index 3fb8133659..a715ec2424 100644 --- a/benchmarks/benchmarks/sperf/save.py +++ b/benchmarks/benchmarks/sperf/save.py @@ -3,12 +3,13 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """File saving benchmarks for the SPerf scheme of the UK Met Office's NG-VAT project.""" + import os.path from iris import save -from iris.experimental.ugrid import save_mesh +from iris.mesh import save_mesh -from .. import TrackAddedMemoryAllocation, on_demand_benchmark +from .. import on_demand_benchmark from ..generate_data.ugrid import make_cube_like_2d_cubesphere @@ -35,8 +36,7 @@ def _save_mesh(self, cube): def time_save_cube(self, n_cubesphere, is_unstructured): self._save_cube(self.cube) - @TrackAddedMemoryAllocation.decorator - def track_addedmem_save_cube(self, n_cubesphere, is_unstructured): + def tracemalloc_save_cube(self, n_cubesphere, is_unstructured): self._save_cube(self.cube) def time_save_mesh(self, n_cubesphere, is_unstructured): diff --git a/benchmarks/benchmarks/stats.py b/benchmarks/benchmarks/stats.py index 0530431900..fbab12cd4b 100644 --- a/benchmarks/benchmarks/stats.py +++ b/benchmarks/benchmarks/stats.py @@ -30,9 +30,23 @@ def setup(self): def time_real(self): pearsonr(self.cube_a, self.cube_b, weights=self.weights) + def tracemalloc_real(self): + pearsonr(self.cube_a, self.cube_b, weights=self.weights) + + tracemalloc_real.number = 3 # type: ignore[attr-defined] + def time_lazy(self): for cube in self.cube_a, self.cube_b: cube.data = cube.lazy_data() result = pearsonr(self.cube_a, self.cube_b, weights=self.weights) result.data + + def tracemalloc_lazy(self): + for cube in self.cube_a, self.cube_b: + cube.data = cube.lazy_data() + + result = pearsonr(self.cube_a, self.cube_b, weights=self.weights) + result.data + + tracemalloc_lazy.number = 3 # type: ignore[attr-defined] diff --git a/benchmarks/benchmarks/trajectory.py b/benchmarks/benchmarks/trajectory.py index ec2958b6a8..77825ef2f2 100644 --- a/benchmarks/benchmarks/trajectory.py +++ b/benchmarks/benchmarks/trajectory.py @@ -33,8 +33,24 @@ def time_trajectory_linear(self) -> None: # Realise the data out_cube.data + def tracemalloc_trajectory_linear(self) -> None: + # Regrid the cube onto the template. + out_cube = interpolate(self.cube, self.sample_points, method="linear") + # Realise the data + out_cube.data + + tracemalloc_trajectory_linear.number = 3 # type: ignore[attr-defined] + def time_trajectory_nearest(self) -> None: # Regrid the cube onto the template. out_cube = interpolate(self.cube, self.sample_points, method="nearest") # Realise the data out_cube.data + + def tracemalloc_trajectory_nearest(self) -> None: + # Regrid the cube onto the template. + out_cube = interpolate(self.cube, self.sample_points, method="nearest") + # Realise the data + out_cube.data + + tracemalloc_trajectory_nearest.number = 3 # type: ignore[attr-defined] diff --git a/benchmarks/benchmarks/unit_style/__init__disabled.py b/benchmarks/benchmarks/unit_style/__init__disabled.py new file mode 100644 index 0000000000..d7f84c2b91 --- /dev/null +++ b/benchmarks/benchmarks/unit_style/__init__disabled.py @@ -0,0 +1,16 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Small-scope benchmarks that can help with performance investigations. + +By renaming ``__init__.py`` these are all disabled by default: + +- They bloat benchmark run-time. +- They are too vulnerable to 'noise' due to their small scope - small objects, + short operations - they report a lot of false positive regressions. +- We rely on the wider-scope integration-style benchmarks to flag performance + changes, upon which we expect to do some manual investigation - these + smaller benchmarks can be run then. + +""" diff --git a/benchmarks/benchmarks/aux_factory.py b/benchmarks/benchmarks/unit_style/aux_factory.py similarity index 93% rename from benchmarks/benchmarks/aux_factory.py rename to benchmarks/benchmarks/unit_style/aux_factory.py index 2da93351ee..329a2b0bda 100644 --- a/benchmarks/benchmarks/aux_factory.py +++ b/benchmarks/benchmarks/unit_style/aux_factory.py @@ -2,14 +2,12 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""AuxFactory benchmark tests.""" +"""Small-scope AuxFactory benchmark tests.""" import numpy as np from iris import aux_factory, coords -from . import ARTIFICIAL_DIM_SIZE - class FactoryCommon: # TODO: once https://github.com/airspeed-velocity/asv/pull/828 is released: @@ -45,7 +43,7 @@ def time_create(self): class HybridHeightFactory(FactoryCommon): def setup(self): - data_1d = np.zeros(ARTIFICIAL_DIM_SIZE) + data_1d = np.zeros(1000) self.coord = coords.AuxCoord(points=data_1d, units="m") self.setup_common() diff --git a/benchmarks/benchmarks/coords.py b/benchmarks/benchmarks/unit_style/coords.py similarity index 94% rename from benchmarks/benchmarks/coords.py rename to benchmarks/benchmarks/unit_style/coords.py index d1f7631e00..704746f190 100644 --- a/benchmarks/benchmarks/coords.py +++ b/benchmarks/benchmarks/unit_style/coords.py @@ -2,20 +2,20 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Coord benchmark tests.""" +"""Small-scope Coord benchmark tests.""" import numpy as np from iris import coords -from . import ARTIFICIAL_DIM_SIZE, disable_repeat_between_setup +from .. import disable_repeat_between_setup def setup(): """General variables needed by multiple benchmark classes.""" global data_1d - data_1d = np.zeros(ARTIFICIAL_DIM_SIZE) + data_1d = np.zeros(1000) class CoordCommon: @@ -52,7 +52,7 @@ def time_create(self): class DimCoord(CoordCommon): def setup(self): - point_values = np.arange(ARTIFICIAL_DIM_SIZE) + point_values = np.arange(1000) bounds = np.array([point_values - 1, point_values + 1]).transpose() self.create_kwargs = { diff --git a/benchmarks/benchmarks/unit_style/cube.py b/benchmarks/benchmarks/unit_style/cube.py new file mode 100644 index 0000000000..780418aa14 --- /dev/null +++ b/benchmarks/benchmarks/unit_style/cube.py @@ -0,0 +1,252 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Small-scope Cube benchmark tests.""" + +import numpy as np + +from iris import analysis, aux_factory, coords, cube + +from .. import disable_repeat_between_setup +from ..generate_data.stock import sample_meshcoord + + +def setup(*params): + """General variables needed by multiple benchmark classes.""" + global data_1d + global data_2d + global general_cube + + data_2d = np.zeros((1000,) * 2) + data_1d = data_2d[0] + general_cube = cube.Cube(data_2d) + + +class ComponentCommon: + # TODO: once https://github.com/airspeed-velocity/asv/pull/828 is released: + # * make class an ABC + # * remove NotImplementedError + # * combine setup_common into setup + """Run a generalised suite of benchmarks for cubes. + + A base class running a generalised suite of benchmarks for cubes that + include a specified component (e.g. Coord, CellMeasure etc.). Component to + be specified in a subclass. + + ASV will run the benchmarks within this class for any subclasses. + + Should only be instantiated within subclasses, but cannot enforce this + since ASV cannot handle classes that include abstract methods. + """ + + def setup(self): + """Prevent ASV instantiating (must therefore override setup() in any subclasses.).""" + raise NotImplementedError + + def create(self): + """Create a cube (generic). + + cube_kwargs allow dynamic inclusion of different components; + specified in subclasses. + """ + return cube.Cube(data=data_2d, **self.cube_kwargs) + + def setup_common(self): + """Shared setup code that can be called by subclasses.""" + self.cube = self.create() + + def time_create(self): + """Create a cube that includes an instance of the benchmarked component.""" + self.create() + + def time_add(self): + """Add an instance of the benchmarked component to an existing cube.""" + # Unable to create the copy during setup since this needs to be re-done + # for every repeat of the test (some components disallow duplicates). + general_cube_copy = general_cube.copy(data=data_2d) + self.add_method(general_cube_copy, *self.add_args) + + +class Cube: + def time_basic(self): + cube.Cube(data_2d) + + def time_rename(self): + general_cube.name = "air_temperature" + + +class AuxCoord(ComponentCommon): + def setup(self): + self.coord_name = "test" + coord_bounds = np.array([data_1d - 1, data_1d + 1]).transpose() + aux_coord = coords.AuxCoord( + long_name=self.coord_name, + points=data_1d, + bounds=coord_bounds, + units="days since 1970-01-01", + climatological=True, + ) + + # Variables needed by the ComponentCommon base class. + self.cube_kwargs = {"aux_coords_and_dims": [(aux_coord, 0)]} + self.add_method = cube.Cube.add_aux_coord + self.add_args = (aux_coord, (0)) + + self.setup_common() + + def time_return_coords(self): + self.cube.coords() + + def time_return_coord_dims(self): + self.cube.coord_dims(self.coord_name) + + +class AuxFactory(ComponentCommon): + def setup(self): + coord = coords.AuxCoord(points=data_1d, units="m") + self.hybrid_factory = aux_factory.HybridHeightFactory(delta=coord) + + # Variables needed by the ComponentCommon base class. + self.cube_kwargs = { + "aux_coords_and_dims": [(coord, 0)], + "aux_factories": [self.hybrid_factory], + } + + self.setup_common() + + # Variables needed by the overridden time_add benchmark in this subclass. + cube_w_coord = self.cube.copy() + [cube_w_coord.remove_aux_factory(i) for i in cube_w_coord.aux_factories] + self.cube_w_coord = cube_w_coord + + def time_add(self): + # Requires override from super().time_add because the cube needs an + # additional coord. + self.cube_w_coord.add_aux_factory(self.hybrid_factory) + + +class CellMeasure(ComponentCommon): + def setup(self): + cell_measure = coords.CellMeasure(data_1d) + + # Variables needed by the ComponentCommon base class. + self.cube_kwargs = {"cell_measures_and_dims": [(cell_measure, 0)]} + self.add_method = cube.Cube.add_cell_measure + self.add_args = (cell_measure, 0) + + self.setup_common() + + +class CellMethod(ComponentCommon): + def setup(self): + cell_method = coords.CellMethod("test") + + # Variables needed by the ComponentCommon base class. + self.cube_kwargs = {"cell_methods": [cell_method]} + self.add_method = cube.Cube.add_cell_method + self.add_args = [cell_method] + + self.setup_common() + + +class AncillaryVariable(ComponentCommon): + def setup(self): + ancillary_variable = coords.AncillaryVariable(data_1d) + + # Variables needed by the ComponentCommon base class. + self.cube_kwargs = {"ancillary_variables_and_dims": [(ancillary_variable, 0)]} + self.add_method = cube.Cube.add_ancillary_variable + self.add_args = (ancillary_variable, 0) + + self.setup_common() + + +class MeshCoord: + params = [ + 6, # minimal cube-sphere + int(1e6), # realistic cube-sphere size + 1000, # To match size in :class:`AuxCoord` + ] + param_names = ["number of faces"] + + def setup(self, n_faces): + mesh_kwargs = dict(n_nodes=n_faces + 2, n_edges=n_faces * 2, n_faces=n_faces) + + self.mesh_coord = sample_meshcoord(sample_mesh_kwargs=mesh_kwargs) + self.data = np.zeros(n_faces) + self.cube_blank = cube.Cube(data=self.data) + self.cube = self.create() + + def create(self): + return cube.Cube(data=self.data, aux_coords_and_dims=[(self.mesh_coord, 0)]) + + def time_create(self, n_faces): + _ = self.create() + + @disable_repeat_between_setup + def time_add(self, n_faces): + self.cube_blank.add_aux_coord(self.mesh_coord, 0) + + @disable_repeat_between_setup + def time_remove(self, n_faces): + self.cube.remove_coord(self.mesh_coord) + + +class Merge: + def setup(self): + self.cube_list = cube.CubeList() + for i in np.arange(2): + i_cube = general_cube.copy() + i_coord = coords.AuxCoord([i]) + i_cube.add_aux_coord(i_coord) + self.cube_list.append(i_cube) + + def time_merge(self): + self.cube_list.merge() + + +class Concatenate: + def setup(self): + dim_size = 1000 + self.cube_list = cube.CubeList() + for i in np.arange(dim_size * 2, step=dim_size): + i_cube = general_cube.copy() + i_coord = coords.DimCoord(np.arange(dim_size) + (i * dim_size)) + i_cube.add_dim_coord(i_coord, 0) + self.cube_list.append(i_cube) + + def time_concatenate(self): + self.cube_list.concatenate() + + +class Equality: + def setup(self): + self.cube_a = general_cube.copy() + self.cube_b = general_cube.copy() + + aux_coord = coords.AuxCoord(data_1d) + self.cube_a.add_aux_coord(aux_coord, 0) + self.cube_b.add_aux_coord(aux_coord, 1) + + def time_equality(self): + self.cube_a == self.cube_b + + +class Aggregation: + def setup(self): + repeat_number = 10 + repeat_range = range(int(1000 / repeat_number)) + array_repeat = np.repeat(repeat_range, repeat_number) + array_unique = np.arange(len(array_repeat)) + + coord_repeat = coords.AuxCoord(points=array_repeat, long_name="repeat") + coord_unique = coords.DimCoord(points=array_unique, long_name="unique") + + local_cube = general_cube.copy() + local_cube.add_aux_coord(coord_repeat, 0) + local_cube.add_dim_coord(coord_unique, 0) + self.cube = local_cube + + def time_aggregated_by(self): + self.cube.aggregated_by("repeat", analysis.MEAN) diff --git a/benchmarks/benchmarks/experimental/ugrid/__init__.py b/benchmarks/benchmarks/unit_style/mesh.py similarity index 85% rename from benchmarks/benchmarks/experimental/ugrid/__init__.py rename to benchmarks/benchmarks/unit_style/mesh.py index c2335990aa..ed3aad1428 100644 --- a/benchmarks/benchmarks/experimental/ugrid/__init__.py +++ b/benchmarks/benchmarks/unit_style/mesh.py @@ -2,22 +2,22 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Benchmark tests for the experimental.ugrid module.""" +"""Benchmark tests for the iris.mesh module.""" from copy import deepcopy import numpy as np -from iris.experimental import ugrid +from iris import mesh -from ... import ARTIFICIAL_DIM_SIZE, disable_repeat_between_setup -from ...generate_data.stock import sample_mesh +from .. import disable_repeat_between_setup +from ..generate_data.stock import sample_mesh class UGridCommon: - """Run a generalised suite of benchmarks for any ugrid object. + """Run a generalised suite of benchmarks for any mesh object. - A base class running a generalised suite of benchmarks for any ugrid object. + A base class running a generalised suite of benchmarks for any mesh object. Object to be specified in a subclass. ASV will run the benchmarks within this class for any subclasses. @@ -53,7 +53,7 @@ def setup(self, n_faces): super().setup(n_faces) def create(self): - return ugrid.Connectivity(indices=self.array, cf_role="face_node_connectivity") + return mesh.Connectivity(indices=self.array, cf_role="face_node_connectivity") def time_indices(self, n_faces): _ = self.object.indices @@ -80,7 +80,7 @@ def setup(self, n_faces): self.object = self.create() -class Mesh(UGridCommon): +class MeshXY(UGridCommon): def setup(self, n_faces, lazy=False): #### # Steal everything from the sample mesh for benchmarking creation of a @@ -93,9 +93,8 @@ def setup(self, n_faces, lazy=False): ) def get_coords_and_axes(location): - search_kwargs = {f"include_{location}s": True} return [ - (source_mesh.coord(axis=axis, **search_kwargs), axis) + (source_mesh.coord(axis=axis, location=location), axis) for axis in ("x", "y") ] @@ -114,7 +113,7 @@ def get_coords_and_axes(location): self.node_x = self.object.node_coords.node_x # Kwargs for reuse in search and remove methods. self.connectivities_kwarg = dict(cf_role="edge_node_connectivity") - self.coords_kwarg = dict(include_faces=True) + self.coords_kwarg = dict(location="face") # TODO: an opportunity for speeding up runtime if needed, since # eq_object is not needed for all benchmarks. Just don't generate it @@ -124,7 +123,7 @@ def get_coords_and_axes(location): self.eq_object = deepcopy(self.object) def create(self): - return ugrid.Mesh(**self.mesh_kwargs) + return mesh.MeshXY(**self.mesh_kwargs) def time_add_connectivities(self, n_faces): self.object.add_connectivities(self.face_node) @@ -149,8 +148,8 @@ def time_remove_coords(self, n_faces): @disable_repeat_between_setup -class MeshLazy(Mesh): - """Lazy equivalent of :class:`Mesh`.""" +class MeshXYLazy(MeshXY): + """Lazy equivalent of :class:`MeshXY`.""" def setup(self, n_faces, lazy=True): super().setup(n_faces, lazy=lazy) @@ -158,7 +157,7 @@ def setup(self, n_faces, lazy=True): class MeshCoord(UGridCommon): # Add extra parameter value to match AuxCoord benchmarking. - params = UGridCommon.params + [ARTIFICIAL_DIM_SIZE] + params = UGridCommon.params + [1000] def setup(self, n_faces, lazy=False): self.mesh = sample_mesh( @@ -171,7 +170,7 @@ def setup(self, n_faces, lazy=False): super().setup(n_faces) def create(self): - return ugrid.MeshCoord(mesh=self.mesh, location="face", axis="x") + return mesh.MeshCoord(mesh=self.mesh, location="face", axis="x") def time_points(self, n_faces): _ = self.object.points diff --git a/benchmarks/benchmarks/metadata_manager_factory.py b/benchmarks/benchmarks/unit_style/metadata_manager_factory.py similarity index 97% rename from benchmarks/benchmarks/metadata_manager_factory.py rename to benchmarks/benchmarks/unit_style/metadata_manager_factory.py index 01a2b661b8..0af055fa82 100644 --- a/benchmarks/benchmarks/metadata_manager_factory.py +++ b/benchmarks/benchmarks/unit_style/metadata_manager_factory.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""metadata_manager_factory benchmark tests.""" +"""Small-scope metadata manager factory benchmark tests.""" from iris.common import ( AncillaryVariableMetadata, diff --git a/benchmarks/benchmarks/mixin.py b/benchmarks/benchmarks/unit_style/mixin.py similarity index 94% rename from benchmarks/benchmarks/mixin.py rename to benchmarks/benchmarks/unit_style/mixin.py index 90fb017b12..92de5e7ad9 100644 --- a/benchmarks/benchmarks/mixin.py +++ b/benchmarks/benchmarks/unit_style/mixin.py @@ -2,15 +2,13 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Mixin benchmark tests.""" +"""Small-scope CFVariableMixin benchmark tests.""" import numpy as np from iris import coords from iris.common.metadata import AncillaryVariableMetadata -from . import ARTIFICIAL_DIM_SIZE - LONG_NAME = "air temperature" STANDARD_NAME = "air_temperature" VAR_NAME = "air_temp" @@ -29,7 +27,7 @@ class CFVariableMixin: def setup(self): - data_1d = np.zeros(ARTIFICIAL_DIM_SIZE) + data_1d = np.zeros(1000) # These benchmarks are from a user perspective, so using a user-level # subclass of CFVariableMixin to test behaviour. AncillaryVariable is diff --git a/benchmarks/bm_runner.py b/benchmarks/bm_runner.py index 10dc5f469a..afc08ff6fa 100644 --- a/benchmarks/bm_runner.py +++ b/benchmarks/bm_runner.py @@ -6,7 +6,6 @@ from abc import ABC, abstractmethod import argparse -from argparse import ArgumentParser from datetime import datetime from importlib import import_module from os import environ @@ -16,7 +15,7 @@ import subprocess from tempfile import NamedTemporaryFile from textwrap import dedent -from typing import Literal +from typing import Literal, Protocol # The threshold beyond which shifts are 'notable'. See `asv compare`` docs # for more. @@ -66,8 +65,8 @@ def _check_requirements(package: str) -> None: def _prep_data_gen_env() -> None: - """Create/access a separate, unchanging environment for generating test data.""" - python_version = "3.11" + """Create or access a separate, unchanging environment for generating test data.""" + python_version = "3.12" data_gen_var = "DATA_GEN_PYTHON" if data_gen_var in environ: echo("Using existing data generation environment.") @@ -91,17 +90,16 @@ def _prep_data_gen_env() -> None: ).resolve() environ[data_gen_var] = str(data_gen_python) + def clone_resource(name: str, clone_source: str) -> Path: + resource_dir = data_gen_python.parents[1] / "resources" + resource_dir.mkdir(exist_ok=True) + clone_dir = resource_dir / name + if not clone_dir.is_dir(): + _subprocess_runner(["git", "clone", clone_source, str(clone_dir)]) + return clone_dir + echo("Installing Mule into data generation environment ...") - mule_dir = data_gen_python.parents[1] / "resources" / "mule" - if not mule_dir.is_dir(): - _subprocess_runner( - [ - "git", - "clone", - "https://github.com/metomi/mule.git", - str(mule_dir), - ] - ) + mule_dir = clone_resource("mule", "https://github.com/metomi/mule.git") _subprocess_runner( [ str(data_gen_python), @@ -112,6 +110,14 @@ def _prep_data_gen_env() -> None: ] ) + test_data_var = "OVERRIDE_TEST_DATA_REPOSITORY" + if test_data_var not in environ: + echo("Installing iris-test-data into data generation environment ...") + test_data_dir = clone_resource( + "iris-test-data", "https://github.com/SciTools/iris-test-data.git" + ) + environ[test_data_var] = str(test_data_dir / "test_data") + echo("Data generation environment ready.") @@ -129,7 +135,7 @@ def _setup_common() -> None: def _asv_compare(*commits: str, overnight_mode: bool = False) -> None: """Run through a list of commits comparing each one to the next.""" - commits = [commit[:8] for commit in commits] + commits = tuple(commit[:8] for commit in commits) for i in range(len(commits) - 1): before = commits[i] after = commits[i + 1] @@ -171,7 +177,7 @@ def _gh_create_reports(commit_sha: str, results_full: str, results_shifts: str) performance_report = dedent( ( """ - ### Performance Benchmark Report: {commit_sha} + # :stopwatch: Performance Benchmark Report: {commit_sha}
Performance shifts @@ -228,19 +234,19 @@ def _gh_create_reports(commit_sha: str, results_full: str, results_shifts: str) for login_type in ("author", "mergedBy"): gh_query = f'.["{login_type}"]["login"]' - command = shlex.split( + commandlist = shlex.split( f"gh pr view {pr_tag[1:]} " f"--json {login_type} -q '{gh_query}' " f"--repo {repo}" ) - login = _subprocess_runner_capture(command) + login = _subprocess_runner_capture(commandlist) - command = [ + commandlist = [ "curl", "-s", f"https://api.github.com/users/{login}", ] - login_info = _subprocess_runner_capture(command) + login_info = _subprocess_runner_capture(commandlist) is_user = '"type": "User"' in login_info if is_user: assignee = login @@ -306,8 +312,13 @@ class _SubParserGenerator(ABC): description: str = NotImplemented epilog: str = NotImplemented - def __init__(self, subparsers: ArgumentParser.add_subparsers) -> None: - self.subparser: ArgumentParser = subparsers.add_parser( + class _SubParsersType(Protocol): + """Duck typing since argparse._SubParsersAction is private.""" + + def add_parser(self, name, **kwargs) -> argparse.ArgumentParser: ... + + def __init__(self, subparsers: _SubParsersType) -> None: + self.subparser = subparsers.add_parser( self.name, description=self.description, epilog=self.epilog, @@ -469,10 +480,12 @@ def csperf(args: argparse.Namespace, run_type: Literal["cperf", "sperf"]) -> Non environ["ON_DEMAND_BENCHMARKS"] = "True" commit_range = "upstream/main^!" - asv_command = ASV_HARNESS.format(posargs=commit_range) + f" --bench={run_type}" + asv_command_str = ( + ASV_HARNESS.format(posargs=commit_range) + f" --bench={run_type}" + ) # Only do a single round. - asv_command = shlex.split(re.sub(r"rounds=\d", "rounds=1", asv_command)) + asv_command = shlex.split(re.sub(r"rounds=\d", "rounds=1", asv_command_str)) try: _subprocess_runner([*asv_command, *args.asv_args], asv=True) except subprocess.CalledProcessError as err: @@ -537,6 +550,63 @@ def func(args: argparse.Namespace) -> None: _subprocess_runner([args.asv_sub_command, *args.asv_args], asv=True) +class TrialRun(_SubParserGenerator): + name = "trialrun" + description = ( + "Fast trial-run a given benchmark, to check it works : " + "in a provided or latest-lockfile environment, " + "with no repeats for accuracy of measurement." + ) + epilog = ( + "e.g. python bm_runner.py trialrun " + "MyBenchmarks.time_calc ${DATA_GEN_PYTHON}" + "\n\nNOTE: 'runpath' also replaces $DATA_GEN_PYTHON during the run." + ) + + def add_arguments(self) -> None: + self.subparser.add_argument( + "benchmark", + type=str, + help=( + "A benchmark name, possibly including wildcards, " + "as supported by the ASV '--bench' argument." + ), + ) + self.subparser.add_argument( + "runpath", + type=str, + help=( + "A path to an existing python executable, " + "to completely bypass environment building." + ), + ) + + @staticmethod + def func(args: argparse.Namespace) -> None: + if args.runpath: + # Shortcut creation of a data-gen environment + # - which is also the trial-run env. + python_path = Path(args.runpath).resolve() + environ["DATA_GEN_PYTHON"] = str(python_path) + _setup_common() + # get path of data-gen environment, setup by previous call + python_path = Path(environ["DATA_GEN_PYTHON"]) + # allow 'on-demand' benchmarks + environ["ON_DEMAND_BENCHMARKS"] = "1" + asv_command = [ + "run", + "--bench", + args.benchmark, + # no repeats for timing accuracy + "--quick", + "--show-stderr", + # do not build a unique env : run test in data-gen environment + "--environment", + f"existing:{python_path}", + ] + args.asv_args + _subprocess_runner(asv_command, asv=True) + + class GhPost(_SubParserGenerator): name = "_gh_post" description = ( @@ -560,13 +630,26 @@ def add_asv_arguments(self) -> None: def main(): - parser = ArgumentParser( + parser = argparse.ArgumentParser( description="Run the Iris performance benchmarks (using Airspeed Velocity).", - epilog="More help is available within each sub-command.", + epilog=( + "More help is available within each sub-command." + "\n\nNOTE(1): a separate python environment is created to " + "construct test files.\n Set $DATA_GEN_PYTHON to avoid the cost " + "of this." + "\nNOTE(2): iris-test-data is downloaded and cached within the " + "data generation environment.\n Set " + "$OVERRIDE_TEST_DATA_REPOSITORY to avoid the cost of this." + "\nNOTE(3): test data is cached within the " + "benchmarks code directory, and uses a lot of disk space " + "of disk space (Gb).\n Set $BENCHMARK_DATA to specify where this " + "space can be safely allocated." + ), + formatter_class=argparse.RawTextHelpFormatter, ) subparsers = parser.add_subparsers(required=True) - for gen in (Overnight, Branch, CPerf, SPerf, Custom, GhPost): + for gen in (Overnight, Branch, CPerf, SPerf, Custom, TrialRun, GhPost): _ = gen(subparsers).subparser parsed = parser.parse_args() diff --git a/benchmarks/custom_bms/README.md b/benchmarks/custom_bms/README.md new file mode 100644 index 0000000000..eea85d74fe --- /dev/null +++ b/benchmarks/custom_bms/README.md @@ -0,0 +1,11 @@ +# Iris custom benchmarks + +To be recognised by ASV, these benchmarks must be packaged and installed in +line with the +[ASV guidelines](https://asv.readthedocs.io/projects/asv-runner/en/latest/development/benchmark_plugins.html). +This is achieved using the custom build in [install.py](./install.py). + +Installation is into the environment where the benchmarks are run (i.e. not +the environment containing ASV + Nox, but the one built to the same +specifications as the Tests environment). This is done via `build_command` +in [asv.conf.json](../asv.conf.json). diff --git a/benchmarks/custom_bms/install.py b/benchmarks/custom_bms/install.py new file mode 100644 index 0000000000..59d27a0b43 --- /dev/null +++ b/benchmarks/custom_bms/install.py @@ -0,0 +1,55 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Install Iris' custom benchmarks for detection by ASV. + +See the requirements for being detected as an ASV plugin: +https://asv.readthedocs.io/projects/asv-runner/en/latest/development/benchmark_plugins.html +""" + +from pathlib import Path +import shutil +from subprocess import run +from tempfile import TemporaryDirectory + +this_dir = Path(__file__).parent + + +def package_files(new_dir: Path) -> None: + """Package Iris' custom benchmarks for detection by ASV. + + Parameters + ---------- + new_dir : Path + The directory to package the custom benchmarks in. + """ + asv_bench_iris = new_dir / "asv_bench_iris" + benchmarks = asv_bench_iris / "benchmarks" + benchmarks.mkdir(parents=True) + (asv_bench_iris / "__init__.py").touch() + + for py_file in this_dir.glob("*.py"): + if py_file != Path(__file__): + shutil.copy2(py_file, benchmarks) + + # Create this on the fly, as having multiple pyproject.toml files in 1 + # project causes problems. + py_project = new_dir / "pyproject.toml" + py_project.write_text( + """ + [project] + name = "asv_bench_iris" + version = "0.1" + """ + ) + + +def main(): + with TemporaryDirectory() as temp_dir: + package_files(Path(temp_dir)) + run(["python", "-m", "pip", "install", temp_dir]) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/custom_bms/tracemallocbench.py b/benchmarks/custom_bms/tracemallocbench.py new file mode 100644 index 0000000000..486c67aeb9 --- /dev/null +++ b/benchmarks/custom_bms/tracemallocbench.py @@ -0,0 +1,196 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. + +"""Benchmark for growth in process resident memory, repeating for accuracy. + +Uses a modified version of the repeat logic in +:class:`asv_runner.benchmarks.time.TimeBenchmark`. +""" + +import re +from timeit import Timer +import tracemalloc +from typing import Callable + +from asv_runner.benchmarks.time import TimeBenchmark, wall_timer + + +class TracemallocBenchmark(TimeBenchmark): + """Benchmark for growth in process resident memory, repeating for accuracy. + + Obviously limited as to what it actually measures : Relies on the current + process not having significant unused (de-allocated) memory when the + tested codeblock runs, and only reliable when the code allocates a + significant amount of new memory. + + Benchmark operations prefixed with ``tracemalloc_`` or ``Tracemalloc`` will + use this benchmark class. + + Inherits behaviour from :class:`asv_runner.benchmarks.time.TimeBenchmark`, + with modifications for memory measurement. See the below Attributes section + and https://asv.readthedocs.io/en/stable/writing_benchmarks.html#timing-benchmarks. + + Attributes + ---------- + Mostly identical to :class:`asv_runner.benchmarks.time.TimeBenchmark`. See + https://asv.readthedocs.io/en/stable/benchmarks.html#timing-benchmarks + Make sure to use the inherited ``repeat`` attribute if greater accuracy + is needed. Below are the attributes where inherited behaviour is + overridden. + + number : int + The number of times the benchmarked operation will be called per + ``repeat``. Memory growth is measured after ALL calls - + i.e. `number` should make no difference to the result if the operation + has perfect garbage collection. The parent class's intelligent + modification of `number` is NOT inherited. A minimum value of ``1`` is + enforced. + warmup_time, sample_time, min_run_count, timer + Not used. + type : str = "tracemalloc" + The name of this benchmark type. + unit : str = "bytes" + The units of the measured metric (i.e. the growth in memory). + + """ + + name_regex = re.compile("^(Tracemalloc[A-Z_].+)|(tracemalloc_.+)$") + + param: tuple + + def __init__(self, name: str, func: Callable, attr_sources: list) -> None: + """Initialize a new instance of `TracemallocBenchmark`. + + Parameters + ---------- + name : str + The name of the benchmark. + func : callable + The function to benchmark. + attr_sources : list + A list of objects from which to draw attributes. + """ + super().__init__(name, func, attr_sources) + self.type = "tracemalloc" + self.unit = "bytes" + + def _load_vars(self): + """Load benchmark variables from attribute sources. + + Downstream handling of ``number`` is not the same as in the parent, so + need to make sure it is at least 1. + """ + super()._load_vars() + self.number = max(1, self.number) + + def run(self, *param: tuple) -> dict: + """Run the benchmark with the given parameters. + + Downstream handling of ``param`` is not the same as in the parent, so + need to store it now. + + Parameters + ---------- + *param : tuple + The parameters to pass to the benchmark function. + + Returns + ------- + dict + A dictionary with the benchmark results. It contains the samples + taken, and "the number of times the function was called in each + sample" - for this benchmark that is always ``1`` to avoid the + parent class incorrectly modifying the results. + """ + self.param = param + return super().run(*param) + + def benchmark_timing( + self, + timer: Timer, + min_repeat: int, + max_repeat: int, + max_time: float, + warmup_time: float, + number: int, + min_run_count: int, + ) -> tuple[list[int], int]: + """Benchmark the timing of the function execution. + + Heavily modified from the parent method + - Directly performs setup and measurement (parent used timeit). + - `number` used differently (see Parameters). + - No warmup phase. + + Parameters + ---------- + timer : timeit.Timer + Not used. + min_repeat : int + The minimum number of times to repeat the function execution. + max_repeat : int + The maximum number of times to repeat the function execution. + max_time : float + The maximum total time to spend on the benchmarking. + warmup_time : float + Not used. + number : int + The number of times the benchmarked operation will be called per + repeat. Memory growth is measured after ALL calls - i.e. `number` + should make no difference to the result if the operation + has perfect garbage collection. The parent class's intelligent + modification of `number` is NOT inherited. + min_run_count : int + Not used. + + Returns + ------- + list + A list of the measured memory growths, in bytes. + int = 1 + Part of the inherited return signature. Must be 1 to avoid + the parent incorrectly modifying the results. + """ + start_time = wall_timer() + samples: list[int] = [] + + def too_slow(num_samples) -> bool: + """Stop taking samples if limits exceeded. + + Parameters + ---------- + num_samples : int + The number of samples taken so far. + + Returns + ------- + bool + True if the benchmark should stop, False otherwise. + """ + if num_samples < min_repeat: + return False + return wall_timer() > start_time + max_time + + # Collect samples + while len(samples) < max_repeat: + self.redo_setup() + tracemalloc.start() + for _ in range(number): + __ = self.func(*self.param) + _, peak_mem_bytes = tracemalloc.get_traced_memory() + tracemalloc.stop() + + samples.append(peak_mem_bytes) + + if too_slow(len(samples)): + break + + # ``number`` is not used in the same way as in the parent class. Must + # be returned as 1 to avoid parent incorrectly modifying the results. + return samples, 1 + + +# https://asv.readthedocs.io/projects/asv-runner/en/latest/development/benchmark_plugins.html +export_as_benchmark = [TracemallocBenchmark] diff --git a/docs/gallery_code/general/plot_custom_aggregation.py b/docs/gallery_code/general/plot_custom_aggregation.py index 540f785ed6..65fadfb473 100644 --- a/docs/gallery_code/general/plot_custom_aggregation.py +++ b/docs/gallery_code/general/plot_custom_aggregation.py @@ -39,14 +39,14 @@ def count_spells(data, threshold, axis, spell_length): Parameters ---------- data : array - raw data to be compared with value threshold. + Raw data to be compared with value threshold. threshold : float - threshold point for 'significant' datapoints. + Threshold point for 'significant' datapoints. axis : int - number of the array dimension mapping the time sequences. - (Can also be negative, e.g. '-1' means last dimension) + Number of the array dimension mapping the time sequences. + (Can also be negative, e.g. '-1' means last dimension). spell_length : int - number of consecutive times at which value > threshold to "count". + Number of consecutive times at which value > threshold to "count". """ if axis < 0: diff --git a/docs/gallery_code/general/plot_rotated_pole_mapping.py b/docs/gallery_code/general/plot_rotated_pole_mapping.py index 60b187ee56..e9e3656184 100644 --- a/docs/gallery_code/general/plot_rotated_pole_mapping.py +++ b/docs/gallery_code/general/plot_rotated_pole_mapping.py @@ -1,6 +1,6 @@ """ Rotated Pole Mapping -===================== +==================== This example uses several visualisation methods to achieve an array of differing images, including: diff --git a/docs/gallery_code/oceanography/plot_load_nemo.py b/docs/gallery_code/oceanography/plot_load_nemo.py index 36ff363a15..aac89fec0e 100644 --- a/docs/gallery_code/oceanography/plot_load_nemo.py +++ b/docs/gallery_code/oceanography/plot_load_nemo.py @@ -45,11 +45,11 @@ def main(): # Include the point's position in the plot's title lat_point = cube.coord("latitude").points[y_point_index, x_point_index] - lat_string = "{:.3f}\u00B0 {}".format( + lat_string = "{:.3f}\u00b0 {}".format( abs(lat_point), "N" if lat_point > 0.0 else "S" ) lon_point = cube.coord("longitude").points[y_point_index, x_point_index] - lon_string = "{:.3f}\u00B0 {}".format( + lon_string = "{:.3f}\u00b0 {}".format( abs(lon_point), "E" if lon_point > 0.0 else "W" ) plt.title("{} at {} {}".format(cube.long_name.capitalize(), lat_string, lon_string)) diff --git a/docs/src/common_links.inc b/docs/src/common_links.inc index 476796396f..a49a98bfa6 100644 --- a/docs/src/common_links.inc +++ b/docs/src/common_links.inc @@ -35,6 +35,7 @@ .. _ruff: https://github.com/astral-sh/ruff .. _SciTools: https://github.com/SciTools .. _scitools-iris: https://pypi.org/project/scitools-iris/ +.. _Shapely: https://shapely.readthedocs.io/en/stable/index.html .. _sphinx: https://www.sphinx-doc.org/en/master/ .. _sphinx-apidoc: https://github.com/sphinx-contrib/apidoc .. _test-iris-imagehash: https://github.com/SciTools/test-iris-imagehash @@ -78,5 +79,6 @@ .. _@stephenworsley: https://github.com/stephenworsley .. _@tkknight: https://github.com/tkknight .. _@trexfeathers: https://github.com/trexfeathers +.. _@ukmo-ccbunney: https://github.com/ukmo-ccbunney .. _@wjbenfold: https://github.com/wjbenfold .. _@zklaus: https://github.com/zklaus diff --git a/docs/src/conf.py b/docs/src/conf.py index 89133d0e1b..70b1063585 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -17,16 +17,18 @@ # serve to show the default. # ---------------------------------------------------------------------------- -"""sphinx config.""" +"""Config for sphinx.""" import datetime from importlib.metadata import version as get_version +from inspect import getsource import ntpath import os from pathlib import Path import re from subprocess import run import sys +from tempfile import gettempdir from urllib.parse import quote import warnings @@ -209,7 +211,7 @@ def _dotv(version): } # https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#confval-autodoc_typehints -autodoc_typehints = "none" +autodoc_typehints = "description" autosummary_generate = True autosummary_imported_members = True autopackage_name = ["iris"] @@ -244,14 +246,17 @@ def _dotv(version): # See https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html intersphinx_mapping = { "cartopy": ("https://scitools.org.uk/cartopy/docs/latest/", None), + "cf_units": ("https://cf-units.readthedocs.io/en/stable/", None), + "cftime": ("https://unidata.github.io/cftime/", None), "dask": ("https://docs.dask.org/en/stable/", None), + "geovista": ("https://geovista.readthedocs.io/en/latest/", None), "iris-esmf-regrid": ("https://iris-esmf-regrid.readthedocs.io/en/stable/", None), "matplotlib": ("https://matplotlib.org/stable/", None), "numpy": ("https://numpy.org/doc/stable/", None), + "pandas": ("https://pandas.pydata.org/docs/", None), "python": ("https://docs.python.org/3/", None), + "pyvista": ("https://docs.pyvista.org/", None), "scipy": ("https://docs.scipy.org/doc/scipy/", None), - "pandas": ("https://pandas.pydata.org/docs/", None), - "dask": ("https://docs.dask.org/en/stable/", None), } # The name of the Pygments (syntax highlighting) style to use. @@ -377,16 +382,6 @@ def _dotv(version): html_static_path = ["_static"] html_style = "theme_override.css" -# this allows for using datatables: https://datatables.net/. -# the version can be manually upgraded by changing the urls below. -html_css_files = [ - "https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css", -] - -html_js_files = [ - "https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js", -] - # url link checker. Some links work but report as broken, lets ignore them. # See https://www.sphinx-doc.org/en/1.2/config.html#options-for-the-linkcheck-builder linkcheck_ignore = [ @@ -408,6 +403,7 @@ def _dotv(version): "https://stickler-ci.com/", "https://twitter.com/scitools_iris", "https://stackoverflow.com/questions/tagged/python-iris", + "https://www.flaticon.com/", ] # list of sources to exclude from the build. @@ -416,6 +412,26 @@ def _dotv(version): # -- sphinx-gallery config ---------------------------------------------------- # See https://sphinx-gallery.github.io/stable/configuration.html + +def reset_modules(gallery_conf, fname): + """Force re-registering of nc-time-axis with matplotlib for each example. + + Required for sphinx-gallery>=0.11.0. + """ + from sys import modules + + _ = modules.pop("nc_time_axis", None) + + +# https://sphinx-gallery.github.io/dev/configuration.html#importing-callables +reset_modules_dir = Path(gettempdir()) / reset_modules.__name__ +reset_modules_dir.mkdir(exist_ok=True) +(reset_modules_dir / f"{reset_modules.__name__}.py").write_text( + getsource(reset_modules) +) +sys.path.insert(0, str(reset_modules_dir)) + + sphinx_gallery_conf = { # path to your example scripts "examples_dirs": ["../gallery_code"], @@ -427,11 +443,7 @@ 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), - ), + "reset_modules": f"{reset_modules.__name__}.{reset_modules.__name__}", } # ----------------------------------------------------------------------------- diff --git a/docs/src/copyright.rst b/docs/src/copyright.rst index 513d281c07..b0d68cfe8c 100644 --- a/docs/src/copyright.rst +++ b/docs/src/copyright.rst @@ -27,10 +27,10 @@ are licensed under the UK's Open Government Licence: (C) British Crown Copyright |copyright_years| - You may use and re-use the information featured on this website (not including logos) free of + You may use and reuse the information featured on this website (not including logos) free of charge in any format or medium, under the terms of the `Open Government Licence `_. We encourage users to establish hypertext links to this website. - Any email enquiries regarding the use and re-use of this information resource should be + Any email enquiries regarding the use and reuse of this information resource should be sent to: psi@nationalarchives.gsi.gov.uk. diff --git a/docs/src/developers_guide/contributing_benchmarks.rst b/docs/src/developers_guide/contributing_benchmarks.rst index b6d005df68..ccb9a50e39 100644 --- a/docs/src/developers_guide/contributing_benchmarks.rst +++ b/docs/src/developers_guide/contributing_benchmarks.rst @@ -7,8 +7,9 @@ Benchmarking Iris includes architecture for benchmarking performance and other metrics of interest. This is done using the `Airspeed Velocity`_ (ASV) package. -Full detail on the setup and how to run or write benchmarks is in -`benchmarks/README.md`_ in the Iris repository. + +.. note:: Full detail on the setup and how to run or write benchmarks is in + `benchmarks/README.md`_ in the Iris repository. Continuous Integration ---------------------- diff --git a/docs/src/developers_guide/documenting/docstrings_attribute.py b/docs/src/developers_guide/documenting/docstrings_attribute.py index 9b85ecb201..1714373a62 100644 --- a/docs/src/developers_guide/documenting/docstrings_attribute.py +++ b/docs/src/developers_guide/documenting/docstrings_attribute.py @@ -1,4 +1,4 @@ -"""docstring attribute example.""" +"""Docstring attribute example.""" class ExampleClass: diff --git a/docs/src/developers_guide/documenting/docstrings_sample_routine.py b/docs/src/developers_guide/documenting/docstrings_sample_routine.py index 4c26bc3569..7feec6dbd0 100644 --- a/docs/src/developers_guide/documenting/docstrings_sample_routine.py +++ b/docs/src/developers_guide/documenting/docstrings_sample_routine.py @@ -1,4 +1,4 @@ -"""docstring routine example.""" +"""Docstring routine example.""" def sample_routine(arg1, arg2, kwarg1="foo", kwarg2=None): @@ -12,16 +12,16 @@ def sample_routine(arg1, arg2, kwarg1="foo", kwarg2=None): First argument description. arg2 : numpy.ndarray Second argument description. - kwarg1: str, optional + kwarg1 : str, optional The first keyword argument. This argument description can be multi-lined. - kwarg2 : bool, optional + **kwarg2 : bool, optional The second keyword argument. Returns ------- numpy.ndarray - numpy.ndarray of arg1 * arg2 + A numpy.ndarray of arg1 * arg2. """ pass diff --git a/docs/src/further_topics/controlling_merge.rst b/docs/src/further_topics/controlling_merge.rst new file mode 100644 index 0000000000..85fe46e745 --- /dev/null +++ b/docs/src/further_topics/controlling_merge.rst @@ -0,0 +1,222 @@ +.. _controlling_merge: + +================================= +Controlling Merge and Concatenate +================================= + +Preliminaries +------------- + +The following code would have been necessary with loading behaviour prior to version 3.11.0 . For the sake of +demonstration, we will revert back to this legacy loading behaviour as follows: + + >>> iris.LOAD_POLICY.set("legacy") + +.. note:: + The default settings for :data:`iris.LOAD_POLICY` effectively implements some version of the following demonstration + automatically upon loading. It may still be worth being aware of how to handle this manually if an even finer degree + of control is required. + +How to Merge Cubes When Coordinates Differ +------------------------------------------ + +Sometimes it is not possible to appropriately combine a CubeList using merge and concatenate on their own. In such cases +it is possible to achieve much more control over cube combination by using the :func:`~iris.util.new_axis` utility. +Consider the following set of cubes: + + >>> file_1 = iris.sample_data_path("time_varying_hybrid_height", "*_2160-12.pp") + >>> file_2 = iris.sample_data_path("time_varying_hybrid_height", "*_2161-01.pp") + >>> cubes = iris.load([file_1, file_2], "x_wind") + >>> print(cubes[0]) + x_wind / (m s-1) (model_level_number: 5; latitude: 144; longitude: 192) + Dimension coordinates: + model_level_number x - - + latitude - x - + longitude - - x + Auxiliary coordinates: + level_height x - - + sigma x - - + surface_altitude - x x + Derived coordinates: + altitude x x x + Scalar coordinates: + forecast_period 1338840.0 hours, bound=(1338480.0, 1339200.0) hours + forecast_reference_time 2006-01-01 00:00:00 + time 2160-12-16 00:00:00, bound=(2160-12-01 00:00:00, 2161-01-01 00:00:00) + Cell methods: + 0 time: mean (interval: 1 hour) + Attributes: + STASH m01s00i002 + source 'Data from Met Office Unified Model' + um_version '12.1' + >>> print(cubes[1]) + x_wind / (m s-1) (model_level_number: 5; latitude: 144; longitude: 192) + Dimension coordinates: + model_level_number x - - + latitude - x - + longitude - - x + Auxiliary coordinates: + level_height x - - + sigma x - - + surface_altitude - x x + Derived coordinates: + altitude x x x + Scalar coordinates: + forecast_period 1339560.0 hours, bound=(1339200.0, 1339920.0) hours + forecast_reference_time 2006-01-01 00:00:00 + time 2161-01-16 00:00:00, bound=(2161-01-01 00:00:00, 2161-02-01 00:00:00) + Cell methods: + 0 time: mean (interval: 1 hour) + Attributes: + STASH m01s00i002 + source 'Data from Met Office Unified Model' + um_version '12.1' + +These two cubes have different time points (i.e. scalar time value). So we would normally be able to merge them, +creating a time dimension. However, in this case we can not combine them with :meth:`~iris.cube.Cube.merge` +due to the fact that their ``surface_altitude`` coordinate also varies over time: + + >>> cubes.merge_cube() + Traceback (most recent call last): + ... + iris.exceptions.MergeError: failed to merge into a single cube. + Coordinates in cube.aux_coords (non-scalar) differ: surface_altitude. + +Since surface altitude is preventing merging, we want to find a way of combining these cubes while also *explicitly* +combining the ``surface_altitude`` coordinate so that it also varies along the time dimension. We can do this by first +adding a dimension to the cube *and* the ``surface_altitude`` coordinate using :func:`~iris.util.new_axis`, and then +concatenating those cubes together. We can attempt this as follows: + + >>> from iris.util import new_axis + >>> from iris.cube import CubeList + >>> processed_cubes = CubeList([new_axis(cube, scalar_coord="time", expand_extras=["surface_altitude"]) for cube in cubes]) + >>> processed_cubes.concatenate_cube() + Traceback (most recent call last): + ... + iris.exceptions.ConcatenateError: failed to concatenate into a single cube. + Scalar coordinates values or metadata differ: forecast_period != forecast_period + +This error alerts us to the fact that the ``forecast_period`` coordinate is also varying over time. To get concatenation +to work, we will have to expand the dimensions of this coordinate to include "time", by passing it also to the +``expand_extras`` keyword. + + >>> processed_cubes = CubeList( + ... [new_axis(cube, scalar_coord="time", expand_extras=["surface_altitude", "forecast_period"]) for cube in cubes] + ... ) + >>> result = processed_cubes.concatenate_cube() + >>> print(result) + x_wind / (m s-1) (time: 2; model_level_number: 5; latitude: 144; longitude: 192) + Dimension coordinates: + time x - - - + model_level_number - x - - + latitude - - x - + longitude - - - x + Auxiliary coordinates: + forecast_period x - - - + surface_altitude x - x x + level_height - x - - + sigma - x - - + Derived coordinates: + altitude x x x x + Scalar coordinates: + forecast_reference_time 2006-01-01 00:00:00 + Cell methods: + 0 time: mean (interval: 1 hour) + Attributes: + STASH m01s00i002 + source 'Data from Met Office Unified Model' + um_version '12.1' + +.. note:: + Since the derived coordinate ``altitude`` derives from ``surface_altitude``, adding ``time`` to the dimensions of + ``surface_altitude`` also means it is added to the dimensions of ``altitude``. So in the combined cube, both of + these coordinates vary along the ``time`` dimension. + +Controlling over multiple dimensions +------------------------------------ + +We now consider a more complex case. Instead of loading 2 files across different time steps we now load 15 such files. +Each of these files covers a month's time step, however, the ``surface_altitude`` coordinate changes only once per year. +The files span 3 years so there are 3 different ``surface_altitude`` coordinates. + + >>> filename = iris.sample_data_path('time_varying_hybrid_height', '*.pp') + >>> cubes = iris.load(filename, constraints="x_wind") + >>> print(cubes) + 0: x_wind / (m s-1) (time: 2; model_level_number: 5; latitude: 144; longitude: 192) + 1: x_wind / (m s-1) (time: 12; model_level_number: 5; latitude: 144; longitude: 192) + 2: x_wind / (m s-1) (model_level_number: 5; latitude: 144; longitude: 192) + +When :func:`iris.load` attempts to merge these cubes, it creates a cube for every unique ``surface_altitude`` coordinate. +Note that since there is only one time point associated with the last cube, the "time" coordinate has not been promoted +to a dimension. The ``surface_altitude`` in each of the above cubes is 2D, however, since some of these coordinates +already have a time dimension, it is not possible to use :func:`~iris.util.new_axis` as above to promote +``surface_altitude`` as we have done above. + +In order to fully control the merge process we instead use :func:`iris.load_raw`: + + >>> raw_cubes = iris.load_raw(filename, constraints="x_wind") + >>> print(raw_cubes) + 0: x_wind / (m s-1) (latitude: 144; longitude: 192) + 1: x_wind / (m s-1) (latitude: 144; longitude: 192) + ... + 73: x_wind / (m s-1) (latitude: 144; longitude: 192) + 74: x_wind / (m s-1) (latitude: 144; longitude: 192) + +The raw cubes also separate cubes along the ``model_level_number`` dimension. In this instance, we will need to +merge/concatenate along two different dimensions. Specifically, we can merge by promoting the ``model_level_number`` to +a dimension, since ``surface_altitude`` does not vary along this dimension, and we can concatenate along the ``time`` +dimension as before. We expand the ``time`` dimension first, as before: + + >>> processed_raw_cubes = CubeList( + ... [new_axis(cube, scalar_coord="time", expand_extras=["surface_altitude", "forecast_period"]) for cube in raw_cubes] + ... ) + >>> print(processed_raw_cubes) + 0: x_wind / (m s-1) (time: 1; latitude: 144; longitude: 192) + 1: x_wind / (m s-1) (time: 1; latitude: 144; longitude: 192) + ... + 73: x_wind / (m s-1) (time: 1; latitude: 144; longitude: 192) + 74: x_wind / (m s-1) (time: 1; latitude: 144; longitude: 192) + +Then we merge, promoting the different ``model_level_number`` scalar coordinates to a dimension coordinate. +Note, however, that merging these cubes does *not* affect the ``time`` dimension, since merging only +applies to scalar coordinates, not dimension coordinates of length 1. + + >>> merged_cubes = processed_raw_cubes.merge() + >>> print(merged_cubes) + 0: x_wind / (m s-1) (model_level_number: 5; time: 1; latitude: 144; longitude: 192) + 1: x_wind / (m s-1) (model_level_number: 5; time: 1; latitude: 144; longitude: 192) + ... + 13: x_wind / (m s-1) (model_level_number: 5; time: 1; latitude: 144; longitude: 192) + 14: x_wind / (m s-1) (model_level_number: 5; time: 1; latitude: 144; longitude: 192) + +Once merged, we can now concatenate all these cubes into a single result cube, which is what we wanted: + + >>> result = merged_cubes.concatenate_cube() + >>> print(result) + x_wind / (m s-1) (model_level_number: 5; time: 15; latitude: 144; longitude: 192) + Dimension coordinates: + model_level_number x - - - + time - x - - + latitude - - x - + longitude - - - x + Auxiliary coordinates: + level_height x - - - + sigma x - - - + forecast_period - x - - + surface_altitude - x x x + Derived coordinates: + altitude x x x x + Scalar coordinates: + forecast_reference_time 2006-01-01 00:00:00 + Cell methods: + 0 time: mean (interval: 1 hour) + Attributes: + STASH m01s00i002 + source 'Data from Met Office Unified Model' + um_version '12.1' + +See Also +-------- +* :data:`iris.LOAD_POLICY` can be controlled to apply similar operations + within the load functions, i.e. :func:`~iris.load`, :func:`~iris.load_cube` and + :func:`~iris.load_cubes`. diff --git a/docs/src/further_topics/dask_best_practices/dask_bags_and_greed.rst b/docs/src/further_topics/dask_best_practices/dask_bags_and_greed.rst index 007a58d400..272ea6fc08 100644 --- a/docs/src/further_topics/dask_best_practices/dask_bags_and_greed.rst +++ b/docs/src/further_topics/dask_best_practices/dask_bags_and_greed.rst @@ -7,7 +7,7 @@ Here is a journey that demonstrates: * How to apply dask.bags to an existing script * The equal importance of optimisation of non-parallel parts of a script -* Protection against multiple softwares trying to manage parallelism +* Protection against multiple software trying to manage parallelism simultaneously diff --git a/docs/src/further_topics/filtering_warnings.rst b/docs/src/further_topics/filtering_warnings.rst index f39e6153f2..ef8701f951 100644 --- a/docs/src/further_topics/filtering_warnings.rst +++ b/docs/src/further_topics/filtering_warnings.rst @@ -47,9 +47,9 @@ Warnings: >>> my_operation() ... - iris/coord_systems.py:442: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. + iris/coord_systems.py:445: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. warnings.warn(wmsg, category=iris.warnings.IrisUserWarning) - iris/coord_systems.py:768: IrisDefaultingWarning: Discarding false_easting and false_northing that are not used by Cartopy. + iris/coord_systems.py:771: IrisDefaultingWarning: Discarding false_easting and false_northing that are not used by Cartopy. warnings.warn( Warnings can be suppressed using the Python warnings filter with the ``ignore`` @@ -110,7 +110,7 @@ You can target specific Warning messages, e.g. ... warnings.filterwarnings("ignore", message="Discarding false_easting") ... my_operation() ... - iris/coord_systems.py:442: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. + iris/coord_systems.py:445: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. warnings.warn(wmsg, category=iris.warnings.IrisUserWarning) :: @@ -125,16 +125,16 @@ Or you can target Warnings raised by specific lines of specific modules, e.g. .. doctest:: filtering_warnings >>> with warnings.catch_warnings(): - ... warnings.filterwarnings("ignore", module="iris.coord_systems", lineno=442) + ... warnings.filterwarnings("ignore", module="iris.coord_systems", lineno=445) ... my_operation() ... - iris/coord_systems.py:768: IrisDefaultingWarning: Discarding false_easting and false_northing that are not used by Cartopy. + iris/coord_systems.py:771: IrisDefaultingWarning: Discarding false_easting and false_northing that are not used by Cartopy. warnings.warn( :: - python -W ignore:::iris.coord_systems:442 - export PYTHONWARNINGS=ignore:::iris.coord_systems:442 + python -W ignore:::iris.coord_systems:445 + export PYTHONWARNINGS=ignore:::iris.coord_systems:445 Warnings from a Common Source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -188,7 +188,7 @@ module during execution: ... ) ... my_operation() ... - iris/coord_systems.py:442: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. + iris/coord_systems.py:445: IrisUserWarning: Setting inverse_flattening does not affect other properties of the GeogCS object. To change other properties set them explicitly or create a new GeogCS instance. warnings.warn(wmsg, category=iris.warnings.IrisUserWarning) ---- diff --git a/docs/src/further_topics/index.rst b/docs/src/further_topics/index.rst index 73ce3d55e7..67cadc4612 100644 --- a/docs/src/further_topics/index.rst +++ b/docs/src/further_topics/index.rst @@ -18,4 +18,5 @@ Extra information on specific technical issues. netcdf_io dask_best_practices/index ugrid/index - which_regridder_to_use \ No newline at end of file + which_regridder_to_use + controlling_merge \ No newline at end of file diff --git a/docs/src/further_topics/metadata.rst b/docs/src/further_topics/metadata.rst index 6d32b10b7a..f66f253a90 100644 --- a/docs/src/further_topics/metadata.rst +++ b/docs/src/further_topics/metadata.rst @@ -403,10 +403,10 @@ instances. Normally, this would cause issues. For example, >>> simply = {"one": np.int32(1), "two": np.array([1.0, 2.0])} >>> simply - {'one': 1, 'two': array([1., 2.])} + {'one': np.int32(1), 'two': array([1., 2.])} >>> fruity = {"one": np.int32(1), "two": np.array([1.0, 2.0])} >>> fruity - {'one': 1, 'two': array([1., 2.])} + {'one': np.int32(1), 'two': array([1., 2.])} >>> simply == fruity Traceback (most recent call last): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() @@ -418,9 +418,9 @@ However, metadata class equality is rich enough to handle this eventuality, >>> metadata1 = cube.metadata._replace(attributes=simply) >>> metadata2 = cube.metadata._replace(attributes=fruity) >>> metadata1 - CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': 1, 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) + CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': np.int32(1), 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) >>> metadata2 - CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': 1, 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) + CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': np.int32(1), 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) .. doctest:: richer-metadata @@ -430,10 +430,10 @@ However, metadata class equality is rich enough to handle this eventuality, .. doctest:: richer-metadata >>> metadata1 - CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': 1, 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) + CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': np.int32(1), 'two': array([1., 2.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) >>> metadata2 = cube.metadata._replace(attributes={"one": np.int32(1), "two": np.array([1000.0, 2000.0])}) >>> metadata2 - CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': 1, 'two': array([1000., 2000.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) + CubeMetadata(standard_name='air_temperature', long_name=None, var_name='air_temperature', units=Unit('K'), attributes={'one': np.int32(1), 'two': array([1000., 2000.])}, cell_methods=(CellMethod(method='mean', coord_names=('time',), intervals=('6 hour',), comments=()),)) >>> metadata1 == metadata2 False diff --git a/docs/src/further_topics/missing_data_handling.rst b/docs/src/further_topics/missing_data_handling.rst index 13b00d3424..a461a44456 100644 --- a/docs/src/further_topics/missing_data_handling.rst +++ b/docs/src/further_topics/missing_data_handling.rst @@ -22,6 +22,7 @@ On load, any fill-value or missing data value defined in the loaded dataset should be used as the ``fill_value`` of the NumPy masked array data attribute of the :class:`~iris.cube.Cube`. This will only appear when the cube's data is realised. +.. _missing_data_saving: Saving ------ @@ -37,7 +38,8 @@ For example:: .. note:: Not all savers accept the ``fill_value`` keyword argument. -Iris will check for and issue warnings of fill-value 'collisions'. +Iris will check for and issue warnings of fill-value 'collisions' (exception: +**NetCDF**, see the heading below). This basically means that whenever there are unmasked values that would read back as masked, we issue a warning and suggest a workaround. @@ -51,6 +53,8 @@ This will occur in the following cases: NetCDF ~~~~~~ +:term:`NetCDF Format` + NetCDF is a special case, because all ordinary variable data is "potentially masked", owing to the use of default fill values. The default fill-value used depends on the type of the variable data. @@ -64,6 +68,16 @@ The exceptions to this are: * Small integers create problems by *not* having the exemption applied to byte data. Thus, in principle, ``int32`` data cannot use the full range of 2**16 valid values. +Warnings are not issued for NetCDF fill value collisions. Increasingly large +and complex parallel I/O operations unfortunately made this feature +un-maintainable and it was retired in Iris 3.9 (:pull:`5833`). + +If you need to know about collisions then you can perform your own checks ahead +of saving. Such operations can be run lazily (:term:`Lazy Data`). Here is an +example:: + + >>> default_fill = netCDF4.default_fillvals[my_cube.dtype.str[1:]] + >>> fill_present = (my_cube.lazy_data() == default_fill).any().compute() Merging ------- diff --git a/docs/src/further_topics/netcdf_io.rst b/docs/src/further_topics/netcdf_io.rst index bae32ebcae..4e1c32b22f 100644 --- a/docs/src/further_topics/netcdf_io.rst +++ b/docs/src/further_topics/netcdf_io.rst @@ -66,7 +66,7 @@ creation of the :data:`iris.fileformats.netcdf.loader.CHUNK_CONTROL` class. Custom Chunking: Set ^^^^^^^^^^^^^^^^^^^^ -There are three context manangers within :data:`~iris.fileformats.netcdf.loader.CHUNK_CONTROL`. The most basic is +There are three context managers within :data:`~iris.fileformats.netcdf.loader.CHUNK_CONTROL`. The most basic is :meth:`~iris.fileformats.netcdf.loader.ChunkControl.set`. This allows you to specify the chunksize for each dimension, and to specify a ``var_name`` specifically to change. diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index cad461340d..1660f6d08c 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -298,7 +298,7 @@ How Iris Represents This .. seealso:: Remember this is a prose summary. Precise documentation is at: - :mod:`iris.experimental.ugrid`. + :mod:`iris.mesh`. .. note:: @@ -310,7 +310,7 @@ The Basics The Iris :class:`~iris.cube.Cube` has several new members: * | :attr:`~iris.cube.Cube.mesh` - | The :class:`iris.experimental.ugrid.Mesh` that describes the + | The :class:`iris.mesh.MeshXY` that describes the :class:`~iris.cube.Cube`\'s horizontal geography. * | :attr:`~iris.cube.Cube.location` | ``node``/``edge``/``face`` - the mesh element type with which this @@ -320,10 +320,10 @@ The Iris :class:`~iris.cube.Cube` has several new members: indexes over the horizontal :attr:`~iris.cube.Cube.data` positions. These members will all be ``None`` for a :class:`~iris.cube.Cube` with no -associated :class:`~iris.experimental.ugrid.Mesh`. +associated :class:`~iris.mesh.MeshXY`. This :class:`~iris.cube.Cube`\'s unstructured dimension has multiple attached -:class:`iris.experimental.ugrid.MeshCoord`\s (one for each axis e.g. +:class:`iris.mesh.MeshCoord`\s (one for each axis e.g. ``x``/``y``), which can be used to infer the points and bounds of any index on the :class:`~iris.cube.Cube`\'s unstructured dimension. @@ -333,7 +333,7 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. from iris.coords import AuxCoord, DimCoord from iris.cube import Cube - from iris.experimental.ugrid import Connectivity, Mesh + from iris.mesh import Connectivity, MeshXY node_x = AuxCoord( points=[0.0, 5.0, 0.0, 5.0, 8.0], @@ -368,7 +368,7 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. ] return [(x, "x"), (y, "y")] - my_mesh = Mesh( + my_mesh = MeshXY( long_name="my_mesh", topology_dimension=2, node_coords_and_axes=[(node_x, "x"), (node_y, "y")], @@ -416,50 +416,50 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. 0 >>> print(edge_cube.mesh.summary(shorten=True)) - + The Detail ---------- How UGRID information is stored ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* | :class:`iris.experimental.ugrid.Mesh` +* | :class:`iris.mesh.MeshXY` | Contains all information about the mesh. | Includes: - * | :attr:`~iris.experimental.ugrid.Mesh.topology_dimension` + * | :attr:`~iris.mesh.MeshXY.topology_dimension` | The maximum dimensionality of shape (1D=edge, 2D=face) supported - by this :class:`~iris.experimental.ugrid.Mesh`. Determines which - :class:`~iris.experimental.ugrid.Connectivity`\s are required/optional + by this :class:`~iris.mesh.MeshXY`. Determines which + :class:`~iris.mesh.Connectivity`\s are required/optional (see below). * 1-3 collections of :class:`iris.coords.AuxCoord`\s: - * | **Required**: :attr:`~iris.experimental.ugrid.Mesh.node_coords` + * | **Required**: :attr:`~iris.mesh.MeshXY.node_coords` | The nodes that are the basis for the mesh. - * | Optional: :attr:`~iris.experimental.ugrid.Mesh.edge_coords`, - :attr:`~iris.experimental.ugrid.Mesh.face_coords` + * | Optional: :attr:`~iris.mesh.Mesh.edge_coords`, + :attr:`~iris.mesh.MeshXY.face_coords` | For indicating the 'centres' of the edges/faces. - | **NOTE:** generating a :class:`~iris.experimental.ugrid.MeshCoord` from - a :class:`~iris.experimental.ugrid.Mesh` currently (``Jan 2022``) + | **NOTE:** generating a :class:`~iris.mesh.MeshCoord` from + a :class:`~iris.mesh.MeshXY` currently (``Jan 2022``) requires centre coordinates for the given ``location``; to be rectified in future. - * 1 or more :class:`iris.experimental.ugrid.Connectivity`\s: + * 1 or more :class:`iris.mesh.Connectivity`\s: * | **Required for 1D (edge) elements**: - :attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity` + :attr:`~iris.mesh.MeshXY.edge_node_connectivity` | Define the edges by connecting nodes. * | **Required for 2D (face) elements**: - :attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` + :attr:`~iris.mesh.MeshXY.face_node_connectivity` | Define the faces by connecting nodes. * Optional: any other connectivity type. See - :attr:`iris.experimental.ugrid.mesh.Connectivity.UGRID_CF_ROLES` for the + :attr:`iris.mesh.Connectivity.UGRID_CF_ROLES` for the full list of types. .. doctest:: ugrid_summaries >>> print(edge_cube.mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -480,30 +480,30 @@ How UGRID information is stored long_name: 'my_mesh' -* | :class:`iris.experimental.ugrid.MeshCoord` +* | :class:`iris.mesh.MeshCoord` | Described in detail in `MeshCoords`_. | Stores the following information: - * | :attr:`~iris.experimental.ugrid.MeshCoord.mesh` - | The :class:`~iris.experimental.ugrid.Mesh` associated with this - :class:`~iris.experimental.ugrid.MeshCoord`. This determines the + * | :attr:`~iris.mesh.MeshCoord.mesh` + | The :class:`~iris.mesh.MeshXY` associated with this + :class:`~iris.mesh.MeshCoord`. This determines the :attr:`~iris.cube.Cube.mesh` attribute of any :class:`~iris.cube.Cube` - this :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see + this :class:`~iris.mesh.MeshCoord` is attached to (see `The Basics`_) - * | :attr:`~iris.experimental.ugrid.MeshCoord.location` + * | :attr:`~iris.mesh.MeshCoord.location` | ``node``/``edge``/``face`` - the element detailed by this - :class:`~iris.experimental.ugrid.MeshCoord`. This determines the + :class:`~iris.mesh.MeshCoord`. This determines the :attr:`~iris.cube.Cube.location` attribute of any :class:`~iris.cube.Cube` this - :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see + :class:`~iris.mesh.MeshCoord` is attached to (see `The Basics`_). .. _ugrid MeshCoords: MeshCoords ~~~~~~~~~~ -Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.Mesh` by +Links a :class:`~iris.cube.Cube` to a :class:`~iris.mesh.MeshXY` by attaching to the :class:`~iris.cube.Cube`\'s unstructured dimension, in the same way that all :class:`~iris.coords.Coord`\s attach to :class:`~iris.cube.Cube` dimensions. This allows a single @@ -511,23 +511,23 @@ same way that all :class:`~iris.coords.Coord`\s attach to dimensions (e.g. horizontal mesh plus vertical levels and a time series), using the same logic for every dimension. -:class:`~iris.experimental.ugrid.MeshCoord`\s are instantiated using a given -:class:`~iris.experimental.ugrid.Mesh`, ``location`` +:class:`~iris.mesh.MeshCoord`\s are instantiated using a given +:class:`~iris.mesh.MeshXY`, ``location`` ("node"/"edge"/"face") and ``axis``. The process interprets the -:class:`~iris.experimental.ugrid.Mesh`\'s -:attr:`~iris.experimental.ugrid.Mesh.node_coords` and if appropriate the -:attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity`/ -:attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` and -:attr:`~iris.experimental.ugrid.Mesh.edge_coords`/ -:attr:`~iris.experimental.ugrid.Mesh.face_coords` +:class:`~iris.mesh.MeshXY`\'s +:attr:`~iris.mesh.MeshXY.node_coords` and if appropriate the +:attr:`~iris.mesh.MeshXY.edge_node_connectivity`/ +:attr:`~iris.mesh.MeshXY.face_node_connectivity` and +:attr:`~iris.mesh.MeshXY.edge_coords`/ +:attr:`~iris.mesh.MeshXY.face_coords` to produce a :class:`~iris.coords.Coord` :attr:`~iris.coords.Coord.points` and :attr:`~iris.coords.Coord.bounds` -representation of all the :class:`~iris.experimental.ugrid.Mesh`\'s +representation of all the :class:`~iris.mesh.MeshXY`\'s nodes/edges/faces for the given axis. -The method :meth:`iris.experimental.ugrid.Mesh.to_MeshCoords` is available to -create a :class:`~iris.experimental.ugrid.MeshCoord` for -every axis represented by that :class:`~iris.experimental.ugrid.Mesh`, +The method :meth:`iris.mesh.MeshXY.to_MeshCoords` is available to +create a :class:`~iris.mesh.MeshCoord` for +every axis represented by that :class:`~iris.mesh.MeshXY`, given only the ``location`` argument .. doctest:: ugrid_summaries @@ -535,7 +535,7 @@ given only the ``location`` argument >>> for coord in edge_cube.coords(mesh_coords=True): ... print(coord) MeshCoord : latitude / (degrees_north) - mesh: + mesh: location: 'edge' points: [3. , 1.5, 1.5, 1.5, 0. , 0. ] bounds: [ @@ -550,7 +550,7 @@ given only the ``location`` argument standard_name: 'latitude' axis: 'y' MeshCoord : longitude / (degrees_east) - mesh: + mesh: location: 'edge' points: [2.5, 0. , 5. , 6.5, 2.5, 6.5] bounds: [ diff --git a/docs/src/further_topics/ugrid/images/plotting.png b/docs/src/further_topics/ugrid/images/plotting.png new file mode 100644 index 0000000000..6e7d570ba2 Binary files /dev/null and b/docs/src/further_topics/ugrid/images/plotting.png differ diff --git a/docs/src/further_topics/ugrid/images/plotting_basic.png b/docs/src/further_topics/ugrid/images/plotting_basic.png deleted file mode 100644 index ba2b0b3329..0000000000 Binary files a/docs/src/further_topics/ugrid/images/plotting_basic.png and /dev/null differ diff --git a/docs/src/further_topics/ugrid/images/plotting_global.png b/docs/src/further_topics/ugrid/images/plotting_global.png deleted file mode 100644 index 62fb56d974..0000000000 Binary files a/docs/src/further_topics/ugrid/images/plotting_global.png and /dev/null differ diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index c45fd271a2..c247a9dc6d 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -9,7 +9,7 @@ Iris includes specialised handling of mesh-located data (as opposed to grid-located data). Iris and its :ref:`partner packages ` are designed to make working with mesh-located data as simple as possible, with new capabilities being added all the time. More detail is in this section and in -the :mod:`iris.experimental.ugrid` API documentation. +the :mod:`iris.mesh` API documentation. This mesh support is based on the `CF-UGRID Conventions`__; UGRID-conformant meshes + data can be loaded from a file into Iris' data model, and meshes + diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index a088b588e1..14e746352f 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -61,7 +61,7 @@ subsequent example operations on this page. >>> import numpy as np >>> from iris.coords import AuxCoord - >>> from iris.experimental.ugrid import Connectivity, Mesh + >>> from iris.mesh import Connectivity, MeshXY # Going to create the following mesh # (node indices are shown to aid understanding): @@ -102,7 +102,7 @@ subsequent example operations on this page. ... indices=face_indices, cf_role="face_node_connectivity" ... ) - >>> my_mesh = Mesh( + >>> my_mesh = MeshXY( ... long_name="my_mesh", ... topology_dimension=2, # Supports 2D (face) elements. ... node_coords_and_axes=[(node_x, "x"), (node_y, "y")], @@ -112,7 +112,7 @@ subsequent example operations on this page. ... ) >>> print(my_mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -143,8 +143,8 @@ Making a Cube (with a Mesh) .. rubric:: |tagline: making a cube| Creating a :class:`~iris.cube.Cube` is unchanged; the -:class:`~iris.experimental.ugrid.Mesh` is linked via a -:class:`~iris.experimental.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): +:class:`~iris.mesh.MeshXY` is linked via a +:class:`~iris.mesh.MeshCoord` (see :ref:`ugrid MeshCoords`): .. dropdown:: Code :icon: code @@ -205,7 +205,7 @@ Save .. note:: UGRID saving support is limited to the NetCDF file format. The Iris saving process automatically detects if the :class:`~iris.cube.Cube` -has an associated :class:`~iris.experimental.ugrid.Mesh` and automatically +has an associated :class:`~iris.mesh.MeshXY` and automatically saves the file in a UGRID-conformant format: .. dropdown:: Code @@ -282,8 +282,8 @@ saves the file in a UGRID-conformant format: } -The :func:`iris.experimental.ugrid.save_mesh` function allows -:class:`~iris.experimental.ugrid.Mesh`\es to be saved to file without +The :func:`iris.mesh.save_mesh` function allows +:class:`~iris.mesh.MeshXY`\es to be saved to file without associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -293,7 +293,7 @@ associated :class:`~iris.cube.Cube`\s: >>> from subprocess import run - >>> from iris.experimental.ugrid import save_mesh + >>> from iris.mesh import save_mesh >>> mesh_path = "my_mesh.nc" >>> save_mesh(my_mesh, mesh_path) @@ -347,16 +347,14 @@ associated :class:`~iris.cube.Cube`\s: Load ---- -.. |tagline: load| replace:: |different| - UGRID parsing is opt-in +.. |tagline: load| replace:: |unchanged| .. rubric:: |tagline: load| .. note:: UGRID loading support is limited to the NetCDF file format. -While Iris' UGRID support remains :mod:`~iris.experimental`, parsing UGRID when -loading a file remains **optional**. To load UGRID data from a file into the -Iris mesh data model, use the -:const:`iris.experimental.ugrid.PARSE_UGRID_ON_LOAD` context manager: +Iris mesh support detects + parses any UGRID information when loading files, to +produce cubes with a non-empty ".mesh" property. .. dropdown:: Code :icon: code @@ -364,10 +362,8 @@ Iris mesh data model, use the .. doctest:: ugrid_operations >>> from iris import load - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - >>> with PARSE_UGRID_ON_LOAD.context(): - ... loaded_cubelist = load(cubelist_path) + >>> loaded_cubelist = load(cubelist_path) # Sort CubeList to ensure consistent result. >>> loaded_cubelist.sort(key=lambda cube: cube.name()) @@ -386,9 +382,8 @@ etcetera: >>> from iris import Constraint, load_cube - >>> with PARSE_UGRID_ON_LOAD.context(): - ... ground_cubelist = load(cubelist_path, Constraint(height=0)) - ... face_cube = load_cube(cubelist_path, "face_data") + >>> ground_cubelist = load(cubelist_path, Constraint(height=0)) + >>> face_cube = load_cube(cubelist_path, "face_data") # Sort CubeList to ensure consistent result. >>> ground_cubelist.sort(key=lambda cube: cube.name()) @@ -412,15 +407,15 @@ etcetera: .. note:: We recommend caution if constraining on coordinates associated with a - :class:`~iris.experimental.ugrid.Mesh`. An individual coordinate value + :class:`~iris.mesh.MeshXY`. An individual coordinate value might not be shared by any other data points, and using a coordinate range will demand notably higher performance given the size of the dimension versus structured grids (:ref:`see the data model detail `). -The :func:`iris.experimental.ugrid.load_mesh` and -:func:`~iris.experimental.ugrid.load_meshes` functions allow only -:class:`~iris.experimental.ugrid.Mesh`\es to be loaded from a file without +The :func:`iris.mesh.load_mesh` and +:func:`~iris.mesh.load_meshes` functions allow only +:class:`~iris.mesh.MeshXY`\es to be loaded from a file without creating any associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -428,13 +423,12 @@ creating any associated :class:`~iris.cube.Cube`\s: .. doctest:: ugrid_operations - >>> from iris.experimental.ugrid import load_mesh + >>> from iris.mesh import load_mesh - >>> with PARSE_UGRID_ON_LOAD.context(): - ... loaded_mesh = load_mesh(cubelist_path) + >>> loaded_mesh = load_mesh(cubelist_path) >>> print(loaded_mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -469,14 +463,18 @@ SEM microscopy), so there is a wealth of tooling available, which :ref:`ugrid geovista` harnesses for cartographic plotting. GeoVista's default behaviour is to convert lat-lon information into full XYZ -coordinates so the data is visualised on the surface of a 3D globe. The plots -are interactive by default, so it's easy to explore the data in detail. +coordinates so the data is visualised on the surface of a 3D globe; 2D +projections are also supported. The plots are interactive by default, so it's +easy to explore the data in detail. -2D projections have also been demonstrated in proofs of concept, and will -be added to API in the near future. +Performing GeoVista operations on your :class:`~iris.cube.Cube` is made +easy via this convenience: +:func:`iris.experimental.geovista.cube_to_polydata`. -This first example uses GeoVista to plot the ``face_cube`` that we created -earlier: +Below is an example of using GeoVista to plot a low-res +sample :attr:`~iris.cube.Cube.mesh` based :class:`~iris.cube.Cube`. For +some truly spectacular visualisations of high-res data please see the +GeoVista :external+geovista:doc:`generated/gallery/index`. .. dropdown:: Code :icon: code @@ -484,130 +482,46 @@ earlier: .. code-block:: python >>> from geovista import GeoPlotter, Transform - >>> from geovista.common import to_xyz + >>> from geovista.common import to_cartesian + >>> import matplotlib.pyplot as plt + >>> from iris import load_cube, sample_data_path + >>> from iris.experimental.geovista import cube_to_polydata - # We'll re-use this to plot some real global data later. - >>> def cube_faces_to_polydata(cube): - ... lons, lats = cube.mesh.node_coords - ... face_node = cube.mesh.face_node_connectivity - ... indices = face_node.indices_by_location() - ... - ... mesh = Transform.from_unstructured( - ... lons.points, - ... lats.points, - ... indices, - ... data=cube.data, - ... name=f"{cube.name()} / {cube.units}", - ... start_index=face_node.start_index, - ... ) - ... return mesh - - >>> print(face_cube) - face_data / (K) (-- : 2; height: 3) - Dimension coordinates: - height - x + >>> sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + >>> print(sample_mesh_cube) + synthetic / (1) (-- : 96) Mesh coordinates: - latitude x - - longitude x - + latitude x + longitude x + Mesh: + name Topology data of 2D unstructured mesh + location face Attributes: - Conventions 'CF-1.7' + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number np.int32(1) # Convert our mesh+data to a PolyData object. - # Just plotting a single height level. - >>> face_polydata = cube_faces_to_polydata(face_cube[:, 0]) + >>> face_polydata = cube_to_polydata(sample_mesh_cube) >>> print(face_polydata) - PolyData (0x7ff4861ff4c0) - N Cells: 2 - N Points: 5 - X Bounds: 9.903e-01, 1.000e+00 - Y Bounds: 0.000e+00, 1.392e-01 - Z Bounds: 6.123e-17, 5.234e-02 - N Arrays: 2 + PolyData (... + N Cells: 96 + N Points: 98 + N Strips: 0 + X Bounds: -1.000e+00, 1.000e+00 + Y Bounds: -1.000e+00, 1.000e+00 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 # Create the GeoVista plotter and add our mesh+data to it. - >>> my_plotter = GeoPlotter() - >>> my_plotter.add_coastlines(color="black") - >>> my_plotter.add_base_layer(color="grey") - >>> my_plotter.add_mesh(face_polydata) - - # Centre the camera on the data. - >>> camera_region = to_xyz( - ... face_cube.coord("longitude").points, - ... face_cube.coord("latitude").points, - ... radius=3, - ... ) - >>> camera_pos = camera_region.mean(axis=0) - >>> my_plotter.camera.position = camera_pos - - >>> my_plotter.show() - - .. image:: images/plotting_basic.png - :alt: A GeoVista plot of the basic example Mesh. - - This artificial data makes West Africa rather chilly! - -Here's another example using a global cubed-sphere data set: - -.. dropdown:: Code - :icon: code - - .. code-block:: python - - >>> from iris import load_cube - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - - # Demonstrating with a global data set. - # You could also download this file from github.com/SciTools/iris-test-data. - >>> from iris.tests import get_data_path - >>> file_path = get_data_path( - ... [ - ... "NetCDF", - ... "unstructured_grid", - ... "lfric_surface_mean.nc", - ... ] - ... ) - >>> with PARSE_UGRID_ON_LOAD.context(): - ... global_cube = load_cube(file_path, "tstar_sea") - >>> print(global_cube) - sea_surface_temperature / (K) (-- : 1; -- : 13824) - Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: mean (interval: 300 s) - 1 time_counter: mean - Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 1 d - name lfric_surface - online_operation average - timeStamp 2020-Feb-07 16:23:14 GMT - title Created by xios - uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b - - >>> global_polydata = cube_faces_to_polydata(global_cube) - >>> print(global_polydata) - PolyData (0x7f761b536160) - N Cells: 13824 - N Points: 13826 - X Bounds: -1.000e+00, 1.000e+00 - Y Bounds: -1.000e+00, 1.000e+00 - Z Bounds: -1.000e+00, 1.000e+00 - N Arrays: 2 - >>> my_plotter = GeoPlotter() >>> my_plotter.add_coastlines() - >>> my_plotter.add_mesh(global_polydata, show_edges=True) - + >>> my_plotter.add_mesh(face_polydata) >>> my_plotter.show() - .. image:: images/plotting_global.png - :alt: A GeoVista plot of a global sea surface temperature Mesh. + .. image:: images/plotting.png + :alt: A GeoVista plot of low-res sample data. Region Extraction ----------------- @@ -619,11 +533,11 @@ As described in :doc:`data_model`, indexing for a range along a :class:`~iris.cube.Cube`\'s :meth:`~iris.cube.Cube.mesh_dim` will not provide a contiguous region, since **position on the unstructured dimension is unrelated to spatial position**. This means that subsetted -:class:`~iris.experimental.ugrid.MeshCoord`\s cannot be reliably interpreted -as intended, and subsetting a :class:`~iris.experimental.ugrid.MeshCoord` is +:class:`~iris.mesh.MeshCoord`\s cannot be reliably interpreted +as intended, and subsetting a :class:`~iris.mesh.MeshCoord` is therefore set to return an :class:`~iris.coords.AuxCoord` instead - breaking the link between :class:`~iris.cube.Cube` and -:class:`~iris.experimental.ugrid.Mesh`: +:class:`~iris.mesh.MeshXY`: .. dropdown:: Code :icon: code @@ -656,118 +570,57 @@ position of the data points before they can be analysed as inside/outside the selected region. The recommended way to do this is using tools provided by :ref:`ugrid geovista`, which is optimised for performant mesh analysis. -This approach centres around using :meth:`geovista.geodesic.BBox.enclosed` to -get the subset of the original mesh that is inside the -:class:`~geovista.geodesic.BBox`. This subset :class:`pyvista.PolyData` object -includes the original indices of each datapoint - the ``vtkOriginalCellIds`` -array, which can be used to index the original :class:`~iris.cube.Cube`. Since -we **know** that this subset :class:`~iris.cube.Cube` represents a regional -mesh, we then reconstruct a :class:`~iris.experimental.ugrid.Mesh` from the -:class:`~iris.cube.Cube`\'s :attr:`~iris.cube.Cube.aux_coords` using -:meth:`iris.experimental.ugrid.Mesh.from_coords`: +Performing GeoVista operations on your :class:`~iris.cube.Cube` is made +easy via this convenience: +:func:`iris.experimental.geovista.cube_to_polydata`. + +An Iris convenience for regional extraction is also provided: +:func:`iris.experimental.geovista.extract_unstructured_region`; demonstrated +below: -.. - Not using doctest here as want to keep GeoVista as optional dependency. .. dropdown:: Code :icon: code - .. code-block:: python + .. doctest:: ugrid_operations - >>> from geovista import Transform >>> from geovista.geodesic import BBox - >>> from iris import load_cube - >>> from iris.experimental.ugrid import Mesh, PARSE_UGRID_ON_LOAD + >>> from iris import load_cube, sample_data_path + >>> from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region - # Need a larger dataset to demonstrate this operation. - # You could also download this file from github.com/SciTools/iris-test-data. - >>> from iris.tests import get_data_path - >>> file_path = get_data_path( - ... [ - ... "NetCDF", - ... "unstructured_grid", - ... "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", - ... ] - ... ) - - >>> with PARSE_UGRID_ON_LOAD.context(): - ... global_cube = load_cube(file_path, "conv_rain") - >>> print(global_cube) - surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 864) + >>> sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + >>> print(sample_mesh_cube) + synthetic / (1) (-- : 96) Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: point + latitude x + longitude x + Mesh: + name Topology data of 2D unstructured mesh + location face Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 300 s - name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain - online_operation instant - timeStamp 2020-Oct-18 21:18:35 GMT - title Created by xios - uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 - - # Convert the Mesh to a GeoVista PolyData object. - >>> lons, lats = global_cube.mesh.node_coords - >>> face_node = global_cube.mesh.face_node_connectivity - >>> indices = face_node.indices_by_location() - >>> global_polydata = Transform.from_unstructured( - ... lons.points, lats.points, indices, start_index=face_node.start_index + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number np.int32(1) + + >>> regional_cube = extract_unstructured_region( + ... cube=sample_mesh_cube, + ... polydata=cube_to_polydata(sample_mesh_cube), + ... region=BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]), + ... preference="center", ... ) - - # Define a region of 4 corners connected by great circles. - # Specialised sub-classes of BBox are also available e.g. panel/wedge. - >>> region = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) - # 'Apply' the region to the PolyData object. - >>> region_polydata = region.enclosed(global_polydata, preference="center") - # Get the remaining face indices, to use for indexing the Cube. - >>> indices = region_polydata["vtkOriginalCellIds"] - - >>> print(type(indices)) - - # 101 is smaller than the original 864. - >>> print(len(indices)) - 101 - >>> print(indices[:10]) - [ 6 7 8 9 10 11 18 19 20 21] - - # Use the face indices to subset the global cube. - >>> region_cube = global_cube[:, indices] - - # In this case we **know** the indices correspond to a contiguous - # region, so we will convert the sub-setted Cube back into a - # Cube-with-Mesh. - >>> new_mesh = Mesh.from_coords(*region_cube.coords(dimensions=1)) - >>> new_mesh_coords = new_mesh.to_MeshCoords(global_cube.location) - >>> for coord in new_mesh_coords: - ... region_cube.remove_coord(coord.name()) - ... region_cube.add_aux_coord(coord, 1) - - # A Mesh-Cube with a subset (101) of the original 864 faces. - >>> print(region_cube) - surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 101) + >>> print(regional_cube) + synthetic / (1) (-- : 11) Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: point + latitude x + longitude x + Mesh: + name unknown + location face Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 300 s - name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain - online_operation instant - timeStamp 2020-Oct-18 21:18:35 GMT - title Created by xios - uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number np.int32(1) + Regridding ---------- @@ -804,7 +657,6 @@ with the >>> from esmf_regrid.experimental.unstructured_scheme import MeshToGridESMFRegridder >>> from iris import load, load_cube - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD # You could also download these files from github.com/SciTools/iris-test-data. >>> from iris.tests import get_data_path @@ -816,8 +668,7 @@ with the ... ) # Load a list of cubes defined on the same Mesh. - >>> with PARSE_UGRID_ON_LOAD.context(): - ... mesh_cubes = load(mesh_file) + >>> mesh_cubes = load(mesh_file) # Extract a specific cube. >>> mesh_cube1 = mesh_cubes.extract_cube("sea_surface_temperature") @@ -888,7 +739,7 @@ with the The initialisation process is computationally expensive so we use caching to improve performance. Once a regridder has been initialised, it can be used on any :class:`~iris.cube.Cube` which has been defined on the same -:class:`~iris.experimental.ugrid.Mesh` (or on the same **grid** in the case of +:class:`~iris.mesh.MeshXY` (or on the same **grid** in the case of :class:`~esmf_regrid.experimental.unstructured_scheme.GridToMeshESMFRegridder`). Since calling a regridder is usually a lot faster than initialising, reusing regridders can save a lot of time. We can demonstrate the reuse of the @@ -956,19 +807,19 @@ Equality .. rubric:: |tagline: equality| -:class:`~iris.experimental.ugrid.Mesh` comparison is supported, and comparing -two ':class:`~iris.experimental.ugrid.Mesh`-:class:`~iris.cube.Cube`\s' will +:class:`~iris.mesh.MeshXY` comparison is supported, and comparing +two ':class:`~iris.mesh.MeshXY`-:class:`~iris.cube.Cube`\s' will include a comparison of the respective -:class:`~iris.experimental.ugrid.Mesh`\es, with no extra action needed by the +:class:`~iris.mesh.MeshXY`\es, with no extra action needed by the user. .. note:: Keep an eye on memory demand when comparing large - :class:`~iris.experimental.ugrid.Mesh`\es, but note that - :class:`~iris.experimental.ugrid.Mesh`\ equality is enabled for lazy + :class:`~iris.mesh.MeshXY`\es, but note that + :class:`~iris.mesh.MeshXY`\ equality is enabled for lazy processing (:doc:`/userguide/real_and_lazy_data`), so if the - :class:`~iris.experimental.ugrid.Mesh`\es being compared are lazy the + :class:`~iris.mesh.MeshXY`\es being compared are lazy the process will use less memory than their total size. Combining Cubes @@ -979,23 +830,23 @@ Combining Cubes Merging or concatenating :class:`~iris.cube.Cube`\s (described in :doc:`/userguide/merge_and_concat`) with two different -:class:`~iris.experimental.ugrid.Mesh`\es is not possible - a +:class:`~iris.mesh.MeshXY`\es is not possible - a :class:`~iris.cube.Cube` must be associated with just a single -:class:`~iris.experimental.ugrid.Mesh`, and merge/concatenate are not yet -capable of combining multiple :class:`~iris.experimental.ugrid.Mesh`\es into +:class:`~iris.mesh.MeshXY`, and merge/concatenate are not yet +capable of combining multiple :class:`~iris.mesh.MeshXY`\es into one. :class:`~iris.cube.Cube`\s that include -:class:`~iris.experimental.ugrid.MeshCoord`\s can still be merged/concatenated -on dimensions other than the :meth:`~iris.cube.Cube.mesh_dim`, since such -:class:`~iris.cube.Cube`\s will by definition share the same -:class:`~iris.experimental.ugrid.Mesh`. +:class:`~iris.mesh.MeshCoord`\s can still be merged/concatenated +on dimensions other than the :meth:`~iris.cube.Cube.mesh_dim`, but only if their +:class:`~iris.cube.Cube.mesh`\es are *equal* (in practice, identical, even to +matching ``var_name``\s). .. seealso:: You may wish to investigate - :func:`iris.experimental.ugrid.recombine_submeshes`, which can be used - for a very specific type of :class:`~iris.experimental.ugrid.Mesh` + :func:`iris.mesh.recombine_submeshes`, which can be used + for a very specific type of :class:`~iris.mesh.MeshXY` combination not detailed here. Arithmetic @@ -1006,7 +857,7 @@ Arithmetic Cube Arithmetic (described in :doc:`/userguide/cube_maths`) has been extended to handle :class:`~iris.cube.Cube`\s that include -:class:`~iris.experimental.ugrid.MeshCoord`\s, and hence have a ``cube.mesh``. +:class:`~iris.mesh.MeshCoord`\s, and hence have a ``cube.mesh``. Cubes with meshes can be combined in arithmetic operations like "ordinary" cubes. They can combine with other cubes without that mesh @@ -1029,4 +880,4 @@ data content. .. |new| replace:: ✨ New .. |unchanged| replace:: ♻️ Unchanged .. |different| replace:: ⚠️ Different -.. |pending| replace:: 🚧 Support Pending \ No newline at end of file +.. |pending| replace:: 🚧 Support Pending diff --git a/docs/src/further_topics/ugrid/other_meshes.rst b/docs/src/further_topics/ugrid/other_meshes.rst index 2fcbeda0d0..19f220be82 100644 --- a/docs/src/further_topics/ugrid/other_meshes.rst +++ b/docs/src/further_topics/ugrid/other_meshes.rst @@ -25,7 +25,7 @@ A FESOM mesh encoded in a NetCDF file includes: To represent the Voronoi Polygons as faces, the corner coordinates will be used as the **nodes** when creating the Iris -:class:`~iris.experimental.ugrid.mesh.Mesh`. +:class:`~iris.ugrid.mesh.MeshXY`. .. dropdown:: Code :icon: code @@ -33,7 +33,7 @@ as the **nodes** when creating the Iris .. code-block:: python >>> import iris - >>> from iris.experimental.ugrid import Mesh + >>> from iris.ugrid import MeshXY >>> temperature_cube = iris.load_cube("my_file.nc", "sea_surface_temperature") @@ -62,7 +62,7 @@ as the **nodes** when creating the Iris # Use a Mesh to represent the Cube's horizontal geography, by replacing # the existing face AuxCoords with new MeshCoords. - >>> fesom_mesh = Mesh.from_coords(temperature_cube.coord('longitude'), + >>> fesom_mesh = MeshXY.from_coords(temperature_cube.coord('longitude'), ... temperature_cube.coord('latitude')) >>> for new_coord in fesom_mesh.to_MeshCoords("face"): ... old_coord = temperature_cube.coord(new_coord.name()) @@ -85,7 +85,7 @@ as the **nodes** when creating the Iris ... >>> print(temperature_cube.mesh) - Mesh : 'unknown' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -113,7 +113,7 @@ An SMC grid encoded in a NetCDF file includes: From this information we can derive face corner coordinates, which will be used as the **nodes** when creating the Iris -:class:`~iris.experimental.ugrid.mesh.Mesh`. +:class:`~iris.ugrid.mesh.MeshXY`. .. dropdown:: Code @@ -122,7 +122,7 @@ as the **nodes** when creating the Iris .. code-block:: python >>> import iris - >>> from iris.experimental.ugrid import Mesh + >>> from iris.ugrid import MeshXY >>> import numpy as np @@ -177,7 +177,7 @@ as the **nodes** when creating the Iris # Use a Mesh to represent the Cube's horizontal geography, by replacing # the existing face AuxCoords with new MeshCoords. - >>> smc_mesh = Mesh.from_coords(faces_x, faces_y) + >>> smc_mesh = MeshXY.from_coords(faces_x, faces_y) >>> for new_coord in smc_mesh.to_MeshCoords("face"): ... old_coord = wave_cube.coord(new_coord.name()) ... unstructured_dim, = old_coord.cube_dims(wave_cube) @@ -209,7 +209,7 @@ as the **nodes** when creating the Iris ... >>> print(wave_cube.mesh) - Mesh : 'unknown' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -265,7 +265,7 @@ dimensions into a single mesh dimension. Since Iris cubes don't support a "resh >>> import iris >>> from iris.coords import AuxCoord, CellMeasure >>> from iris.cube import Cube - >>> from iris.experimental.ugrid.mesh import Mesh, Connectivity + >>> from iris.ugrid.mesh import MeshXY, Connectivity >>> filepath = iris.sample_data_path('orca2_votemper.nc') @@ -313,14 +313,14 @@ dimensions into a single mesh dimension. Since Iris cubes don't support a "resh ... ) >>> # Create a mesh object. - >>> mesh = Mesh( + >>> mesh = MeshXY( ... 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' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 75b54b037f..f69546446c 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -58,7 +58,7 @@ PyVista is described as "VTK for humans" - VTK is a very powerful toolkit for working with meshes, and PyVista brings that power into the Python ecosystem. GeoVista in turn makes it easy to use PyVista specifically for cartographic work, designed from the start with the Iris -:class:`~iris.experimental.ugrid.Mesh` in mind. +:class:`~iris.mesh.MeshXY` in mind. Applications ------------ @@ -93,7 +93,7 @@ Applications * Regrid unstructured to structured. * Regrid with dask integration, computing in parallel and maintaining data laziness. -* | Save a prepared regridder for re-use in subsequent runs. +* | Save a prepared regridder for reuse in subsequent runs. | Regridders can even be re-used on sources with different masks - a significant efficiency gain. diff --git a/docs/src/further_topics/um_files_loading.rst b/docs/src/further_topics/um_files_loading.rst index c5238e6b70..2d2eb973e4 100644 --- a/docs/src/further_topics/um_files_loading.rst +++ b/docs/src/further_topics/um_files_loading.rst @@ -315,6 +315,12 @@ the derived ``altitude``. it produces basic coordinates 'model_level_number', 'sigma' and 'level_pressure', and a manufactured 3D 'air_pressure' coordinate. +**Surface Fields** + +In order for surface fields to be recognised when saving, you must include +`label_surface_fields=True` to :func:`iris.fileformats.pp.save` or +:func:`iris.save`. When surface fields are encountered with this flag set to True, +LBLEV will be set to 9999 and LBVC to 129. .. _um_time_metadata: diff --git a/docs/src/further_topics/which_regridder_to_use.rst b/docs/src/further_topics/which_regridder_to_use.rst index 5d7d7fdba1..dae273252d 100644 --- a/docs/src/further_topics/which_regridder_to_use.rst +++ b/docs/src/further_topics/which_regridder_to_use.rst @@ -341,7 +341,7 @@ of ``kg m-2`` as an area weighted sum. With ``mdtol=0`` this will consistently underestimate this total and with ``mdtol=1`` will consistently overestimate. This can be somewhat mitigated with a choice of ``mdtol=0.5``, but you should still be aware of potential inaccuracies. It should be noted that this choice of ``mdtol`` is highly -context dependent and there wil likely be occasions where a choice of ``mdtol=0`` or +context dependent and there will likely be occasions where a choice of ``mdtol=0`` or ``mdtol=1`` is more suitable. The important thing is to *know your data, know what* *you're doing with your data and know how your regridder fits in this process*. diff --git a/docs/src/installing.rst b/docs/src/installing.rst index a8207c37a5..a0a3fd2c62 100644 --- a/docs/src/installing.rst +++ b/docs/src/installing.rst @@ -19,45 +19,48 @@ Iris can be installed using conda or pip. .. note:: This documentation was built using Python |python_version|. -.. _installing_using_conda: +.. _installing_a_released_version: -Installing a Released Version Using Conda ------------------------------------------ +Installing a Released Version +----------------------------- -To install Iris using conda, you must first download and install conda, -for example from https://docs.conda.io/en/latest/miniconda.html. +.. tab-set:: -Once conda is installed, you can install Iris using conda with the following -command:: + .. tab-item:: conda-forge - conda install -c conda-forge iris + To install Iris using conda, you must first download and install conda, + for example from https://docs.conda.io/en/latest/miniconda.html. -If you wish to run any of the code in the gallery you will also -need the Iris sample data. This can also be installed using conda:: + Once conda is installed, you can install Iris using conda with the following + command:: - conda install -c conda-forge iris-sample-data + conda install -c conda-forge iris -Further documentation on using conda and the features it provides can be found -at https://docs.conda.io/projects/conda/en/latest/index.html. + If you wish to run any of the code in the gallery you will also + need the Iris sample data. This can also be installed using conda:: -.. _installing_using_pip: + conda install -c conda-forge iris-sample-data -Installing a Released Version Using Pip ---------------------------------------- + Further documentation on using conda and the features it provides can be found + at https://docs.conda.io/projects/conda/en/latest/index.html. -Iris is also available from https://pypi.org/ so can be installed with ``pip``:: + .. tab-item:: PyPI - pip install scitools-iris + Iris is also available from https://pypi.org/ so can be installed with ``pip``:: + + pip install scitools-iris + + If you wish to run any of the code in the gallery you will also + need the Iris sample data. This can also be installed using pip:: + + pip install iris-sample-data -If you wish to run any of the code in the gallery you will also -need the Iris sample data. This can also be installed using pip:: - pip install iris-sample-data .. _installing_from_source: -Installing a Development Version from a Git Checkout ----------------------------------------------------- +Installing a Development Version +-------------------------------- The latest Iris source release is available from https://github.com/SciTools/iris. @@ -69,16 +72,9 @@ Once conda is installed, you can create a development environment for Iris using conda and then activate it. The example commands below assume you are in the root directory of your local copy of Iris:: - conda env create --force --file=requirements/iris.yml + conda env create --file=requirements/iris.yml conda activate iris-dev -.. note:: - - The ``--force`` option, used when creating the environment, first removes - any previously existing ``iris-dev`` environment of the same name. This is - particularly useful when rebuilding your environment due to a change in - requirements. - The ``requirements/iris.yml`` file defines the Iris development conda environment *name* and all the relevant *top level* `conda-forge` package dependencies that you need to **code**, **test**, and **build** the diff --git a/docs/src/userguide/plotting_examples/cube_contour.py b/docs/src/userguide/plotting_examples/cube_contour.py index 0d8c1e02aa..e338d395ff 100644 --- a/docs/src/userguide/plotting_examples/cube_contour.py +++ b/docs/src/userguide/plotting_examples/cube_contour.py @@ -3,6 +3,7 @@ Can use iris.plot.contour() or iris.quicplot.contour(). """ + import matplotlib.pyplot as plt import iris diff --git a/docs/src/userguide/plotting_examples/cube_contourf.py b/docs/src/userguide/plotting_examples/cube_contourf.py index 531dd45d25..b76645b380 100644 --- a/docs/src/userguide/plotting_examples/cube_contourf.py +++ b/docs/src/userguide/plotting_examples/cube_contourf.py @@ -3,6 +3,7 @@ Can use iris.plot.contour() or iris.quickplot.contour(). """ + import matplotlib.pyplot as plt import iris diff --git a/docs/src/userguide/plotting_examples/masking_brazil_plot.py b/docs/src/userguide/plotting_examples/masking_brazil_plot.py index 3dc521d451..d1a75a700f 100644 --- a/docs/src/userguide/plotting_examples/masking_brazil_plot.py +++ b/docs/src/userguide/plotting_examples/masking_brazil_plot.py @@ -1,4 +1,5 @@ """Global cube masked to Brazil and plotted with quickplot.""" + import cartopy.io.shapereader as shpreader import matplotlib.pyplot as plt diff --git a/docs/src/userguide/subsetting_a_cube.rst b/docs/src/userguide/subsetting_a_cube.rst index 27a223042e..7440d22adc 100644 --- a/docs/src/userguide/subsetting_a_cube.rst +++ b/docs/src/userguide/subsetting_a_cube.rst @@ -1,3 +1,5 @@ +.. include:: ../common_links.inc + .. _subsetting_a_cube: ================= @@ -338,26 +340,32 @@ Cube Masking Masking from a shapefile ^^^^^^^^^^^^^^^^^^^^^^^^ -Often we want to perform so kind of analysis over a complex geographical feature - only over land points or sea points: -or over a continent, a country, a river watershed or administrative region. These geographical features can often be described by shapefiles. -Shapefiles are a file format first developed for GIS software in the 1990s, and now `Natural Earth`_ maintain a large freely usable database of shapefiles of many geographical and poltical divisions, -accessible via cartopy. Users may also provide their own custom shapefiles. +Often we want to perform some kind of analysis over a complex geographical feature e.g., + +- over only land/sea points +- over a continent, country, or list of countries +- over a river watershed or lake basin +- over states or administrative regions of a country + +These geographical features can often be described by `ESRI Shapefiles`_. Shapefiles are a file format first developed for GIS software in the 1990s, and `Natural Earth`_ maintain a large freely usable database of shapefiles of many geographical and political divisions, +accessible via `cartopy`_. Users may also provide their own custom shapefiles for `cartopy`_ to load, or their own underlying geometry in the same format as a shapefile geometry. These shapefiles can be used to mask an iris cube, so that any data outside the bounds of the shapefile is hidden from further analysis or plotting. -First, we load the correct shapefile from NaturalEarth via the `Cartopy`_ instructions. Here we get one for Brazil. -The `.geometry` attribute of the records in the reader contain the shapely polygon we're interested in - once we have those we just need to provide them to -the :class:`iris.util.mask_cube_from_shapefile` function. Once plotted, we can see that only our area of interest remains in the data. +First, we load the correct shapefile from NaturalEarth via the `Cartopy_shapereader`_ instructions. Here we get one for Brazil. +The `.geometry` attribute of the records in the reader contain the `Shapely`_ polygon we're interested in. They contain the coordinates that define the polygon (or set of lines) being masked +and once we have those we just need to provide them to the :class:`iris.util.mask_cube_from_shapefile` function. +This returns a copy of the cube with a :class:`numpy.masked_array` as the data payload, where the data outside the shape is hidden by the masked array. We can see this in the following example. .. plot:: userguide/plotting_examples/masking_brazil_plot.py :include-source: -We can see that the dimensions of the cube haven't changed - the plot is still global. But only the data over Brazil is plotted - the rest is masked. +We can see that the dimensions of the cube haven't changed - the plot is still global. But only the data over Brazil is plotted - the rest has been masked out. .. note:: While Iris will try to dynamically adjust the shapefile to mask cubes of different projections, it can struggle with rotated pole projections and cubes with Meridians not at 0° - Converting your Cube's coordinate system may help if you get a fully masked cube from this function. + Converting your Cube's coordinate system may help if you get a fully masked cube as the output from this function unexpectedly. Cube Iteration @@ -473,5 +481,8 @@ Similarly, Iris cubes have indexing capability:: print(cube[1, ::-2]) -.. _Cartopy: https://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html#id1 +.. _Cartopy_shapereader: https://scitools.org.uk/cartopy/docs/latest/tutorials/using_the_shapereader.html#id1 .. _Natural Earth: https://www.naturalearthdata.com/ +.. _ESRI Shapefiles: https://support.esri.com/en-us/technical-paper/esri-shapefile-technical-description-279 + + diff --git a/docs/src/voted_issues.rst b/docs/src/voted_issues.rst index 33d1982a7b..116c997f33 100644 --- a/docs/src/voted_issues.rst +++ b/docs/src/voted_issues.rst @@ -20,6 +20,12 @@ the below table. .. raw:: html + + + + + + diff --git a/docs/src/whatsnew/3.10.rst b/docs/src/whatsnew/3.10.rst new file mode 100644 index 0000000000..9007f6f9a6 --- /dev/null +++ b/docs/src/whatsnew/3.10.rst @@ -0,0 +1,245 @@ +.. include:: ../common_links.inc + +v3.10 (13 Aug 2024) +******************* + +This document explains the changes made to Iris for this release +(:doc:`View all changes `.) + + +.. dropdown:: v3.10 Release Highlights + :color: primary + :icon: info + :animate: fade-in + :open: + + The highlights for this minor release of Iris include: + + * Breaking Change: We have moved all of the mesh API from :mod:`iris.experimental.ugrid` to + :mod:`iris.mesh`. This is no longer experimental making this public supported API. + + * We have made a suite of mesh improvements, there is a separate entry below for each of these changes . + + * We have made :meth:`~iris.coords.guess_bounds` capable of setting bounds to the start and end of months and years. + + * We have significantly reduced warning noise during NetCDF loading. The datum :class:`python:FutureWarning` + will now only be raised if the + ``datum_support`` :class:`~iris.Future` flag is disabled AND a datum is + present on the loaded NetCDF grid mapping. + + * Checkout the performance enhancements section for an array of improvements to the performance of Iris. + Special thanks to the `ESMValTool`_ devs for these contributions. + + + And finally, get in touch with us on :issue:`GitHub` if you have + any issues or feature requests for improving Iris. Enjoy! + + +📢 Announcements +================ + +#. Breaking Change: We have moved all of the mesh API from :mod:`iris.experimental.ugrid` to + :mod:`iris.mesh`. This is no longer experimental making this public supported API. + Future changes will honour Semantic Versioning - i.e. breaking changes will only be in major releases, + and ideally will be previewed via :class:`iris.Future` flags. + +#. Note that Iris is currently pinned to NumPy ``<2``, we hope to unpin this in the next minor release (Iris v3.11). + + +✨ Features +=========== + +#. `@ESadek-MO`_ updated the error messages in :meth:`iris.cube.CubeList.concatenate` + to better explain the error. (:pull:`6005`) + +#. `@trexfeathers`_ added the + :meth:`~iris.experimental.ugrid.mesh.MeshCoord.collapsed` method to + :class:`~iris.experimental.ugrid.mesh.MeshCoord`, enabling collapsing of + the :class:`~iris.cube.Cube` :attr:`~iris.cube.Cube.mesh_dim` (see + :ref:`cube-statistics-collapsing`). (:issue:`5377`, :pull:`6003`) + +#. `@pp-mo`_ made a MeshCoord inherit a coordinate system from its location coord, + as it does its metadata. N.B. mesh location coords can not however load a + coordinate system from netcdf at present, as this needs the 'extended' + grid-mappping syntax -- see : :issue:`3388`. + (:issue:`5562`, :pull:`6016`) + +#. `@HGWright`_ added the `monthly` and `yearly` options to the + :meth:`~iris.coords.guess_bounds` method. (:issue:`4864`, :pull:`6090`) + +#. `@HGWright`_ updated to the latest CF Standard Names Table v85 + (30 July 2024). (:pull:`6100`) + + +🐛 Bugs Fixed +============= + +#. `@bouweandela`_ updated the ``chunktype`` of Dask arrays, so it corresponds + to the array content. (:pull:`5801`) + +#. `@rcomer`_ made the :obj:`~iris.analysis.WPERCENTILE` aggregator work with + :func:`~iris.cube.Cube.rolling_window`. (:issue:`5777`, :pull:`5825`) + + +#. `@pp-mo`_ corrected the use of mesh dimensions when saving with multiple + meshes. (:issue:`5908`, :pull:`6004`) + +#. `@trexfeathers`_ fixed the datum :class:`python:FutureWarning` to only be raised if + the ``datum_support`` :class:`~iris.Future` flag is disabled AND a datum is + present on the loaded NetCDF grid mapping. (:issue:`5749`, :pull:`6050`) + + +💣 Incompatible Changes +======================= + +#. `@rcomer`_ removed the *target* parameter from + :func:`~iris.fileformats.pp.as_fields` and + :func:`~iris.fileformats.pp.save_pairs_from_cube` because it had no effect. + (:pull:`5783`) + +#. `@stephenworsley`_ made masked arrays on Iris objects now compare as equal + precisely when all unmasked points are equal and when the masks are identical. + This is due to changes in :func:`~iris.util.array_equal` which previously + ignored masks entirely. (:pull:`4457`) + +#. `@trexfeathers`_ renamed the ``Mesh`` class to + :class:`~iris.experimental.ugrid.mesh.MeshXY`, in preparation for a future + more flexible parent class (:class:`~iris.experimental.ugrid.mesh.Mesh`). + (:issue:`6052` :pull:`6056`) + +#. `@stephenworsley`_ replaced the ``include_nodes``, ``include_edges`` and + ``include_faces`` arguments with a single ``location`` argument in the + :class:`~iris.experimental.ugrid.Mesh` methods + :meth:`~iris.experimental.ugrid.Mesh.coord`, :meth:`~iris.experimental.ugrid.Mesh.coords` + and :meth:`~iris.experimental.ugrid.Mesh.remove_coords`. (:pull:`6055`) + +#. `@pp-mo`_ moved all the mesh API from the :mod:`iris.experimental.ugrid` module to + to :mod:`iris.mesh`, making this public supported API. Note that the + :class:`iris.experimental.ugrid.Mesh` class is renamed as :class:`iris.mesh.MeshXY`, + to allow for possible future mesh types with different properties to exist as + subclasses of a common generic :class:`~iris.mesh.components.Mesh` class. + (:issue:`6057`, :pull:`6061`, :pull:`6077`) + +#. `@pp-mo`_ and `@stephenworsley`_ Turned on UGRID loading by default, effectively removing + the need for and deprecating the :func:`~iris.ugrid.experimental.PARSE_UGRID_ON_LOAD` + context manager. (:pull:`6054`, :pull:`6088`) + + +🚀 Performance Enhancements +=========================== + +#. `@bouweandela`_ added the option to specify the Dask chunks of the target + array in :func:`iris.util.broadcast_to_shape`. (:pull:`5620`) + +#. `@schlunma`_ allowed :func:`iris.analysis.cartography.area_weights` to + return dask arrays with arbitrary chunks. (:pull:`5658`) + +#. `@bouweandela`_ made :meth:`iris.cube.Cube.rolling_window` work with lazy + data. (:pull:`5795`) + +#. `@bouweandela`_ updated :meth:`iris.cube.CubeList.concatenate` so it keeps + ancillary variables and cell measures lazy. (:pull:`6010`) + +#. `@bouweandela`_ made :meth:`iris.cube.CubeList.concatenate` faster for cubes + that have coordinate factories. (:pull:`6038`) + +🔥 Deprecations +=============== + +None! + + +🔗 Dependencies +=============== + +#. `@tkknight`_ removed the pin for ``sphinx <=5.3``, so the latest should + now be used, currently being v7.2.6. + (:pull:`5901`) + +#. `@trexfeathers`_ updated the :mod:`iris.experimental.geovista` + documentation's use of :class:`geovista.geodesic.BBox` + to be compatible with GeoVista v0.5, as well as previous versions. + (:pull:`6064`) + +#. `@pp-mo`_ temporarily pinned matplotlib to ">=3.5, !=3.9.1", to avoid current CI + test failures on plot results, apparently due to a matplotlib bug. + See : https://github.com/matplotlib/matplotlib/issues/28567 + (:pull:`6065`) + +#. Note that Iris is currently pinned to NumPy ``<2``, we hope to unpin this in the next minor release (Iris v3.11). + + + +📚 Documentation +================ + +#. `@hsteptoe`_ added more detailed examples to :class:`~iris.cube.Cube` functions + :func:`~iris.cube.Cube.slices` and :func:`~iris.cube.Cube.slices_over`. (:pull:`5735`) + + +💼 Internal +=========== + +#. `@bouweandela`_ removed a workaround in :meth:`~iris.cube.CubeList.merge` for an + issue with :func:`dask.array.stack` which has been solved since 2017. (:pull:`5923`) + +#. `@trexfeathers`_ introduced a temporary fix for Airspeed Velocity's + deprecated use of the ``conda --force`` argument. To be removed once + `airspeed-velocity/asv#1397`_ is merged and released. (:pull:`5931`) + +#. `@trexfeathers`_ created :func:`iris.tests.stock.realistic_4d_w_everything`; + providing a :class:`~iris.cube.Cube` aimed to exercise as much of Iris as + possible. (:pull:`5949`) + +#. `@trexfeathers`_ deactivated any small 'unit-style' benchmarks for default + benchmark runs, and introduced larger more 'real world' benchmarks where + coverage was needed. (:pull:`5949`). + +#. `@trexfeathers`_ made a Nox `benchmarks` session as the recommended entry + point for running benchmarks. (:pull:`5951`) + +#. `@ESadek-MO`_ added further `benchmarks` for aggregation and collapse. + (:pull:`5954`) + +#. `@trexfeathers`_ set the benchmark data generation environment to + automatically install iris-test-data during setup. (:pull:`5958`) + +#. `@pp-mo`_ reworked benchmark peak-memory measurement to use the + `tracemalloc `_ + package. + (:pull:`5948`) + +#. `@pp-mo`_ added a benchmark 'trialrun' sub-command, to quickly test + benchmarks during development. (:pull:`5957`) + +#. `@pp-mo`_ moved several memory-measurement benchmarks from 'on-demand' to + the standard set, in hopes that use of 'tracemalloc' (:pull:`5948`) makes + the results consistent enough to monitor for performance changes. + (:pull:`5959`) + +#. `@rcomer`_ made some :meth:`~iris.cube.Cube.slices_over` tests go faster (:pull:`5973`) + +#. `@bouweandela`_ enabled mypy checks for type hints. + The entire team would like to thank Bouwe for putting in the hard + work on an unglamorous but highly valuable contribution. (:pull:`5956`) + +#. `@trexfeathers`_ re-wrote the delegated ASV environment plugin to reduce + complexity, remove unnecessary slow operations, apply the least-surprise + principle, be more robust against failures, and improve the ability to + benchmark historic commits (especially older Python versions). + (:pull:`5963`) + +#. `@bouweandela`_ made some tests for :func:`~iris.iterate.izip` faster. (:pull:`6041`) + +.. comment + Whatsnew author names (@github name) in alphabetical order. Note that, + core dev names are automatically included by the common_links.inc: + +.. _@hsteptoe: https://github.com/hsteptoe + + +.. comment + Whatsnew resources in alphabetical order: + +.. _airspeed-velocity/asv#1397: https://github.com/airspeed-velocity/asv/pull/1397 +.. _ESMValTool: https://github.com/ESMValGroup/ESMValTool diff --git a/docs/src/whatsnew/3.11.rst b/docs/src/whatsnew/3.11.rst new file mode 100644 index 0000000000..b6fcae64c1 --- /dev/null +++ b/docs/src/whatsnew/3.11.rst @@ -0,0 +1,179 @@ +.. include:: ../common_links.inc + +v3.11 (28 Oct 2024) [release candidate] +*************************************** + +This document explains the changes made to Iris for this release +(:doc:`View all changes `.) + + +.. dropdown:: v3.11 Release Highlights + :color: primary + :icon: info + :animate: fade-in + :open: + + The highlights for this minor release of Iris include: + + * Iris is now compliant with NumPy v2. See the notes below for how this might + affect your scripts. + + * Loading now supports varying reference fields for hybrid vertical + coordinates, e.g. a time-varying orography. This is controlled by the + :meth:`~iris.LOAD_POLICY` object : see :class:`~iris.LoadPolicy`. + + * We now have type hints in :class:`~iris.cube.Cube`, and + :meth:`iris.cube.CubeList.concatenate` is in places almost an order of + magnitude faster! + + * `@bouweandela`_ added type hints for :class:`~iris.cube.Cube`. + + * Checkout the significant performance enhancements section for a couple of + improvements to the performance of Iris. + Special thanks to `@bouweandela`_ for these contributions. + + * We added ``colorbar`` keyword to allow optional creation of + the colorbar in three quickplot methods! + + And finally, get in touch with us on :issue:`GitHub` if you have + any issues or feature requests for improving Iris. Enjoy! + + +📢 Announcements +================ + +#. Iris is now compliant with NumPy v2. This may affect your scripts. + :ref:`See the full What's New entry for more details `. + + +✨ Features +=========== + +#. `@jrackham-mo`_ added :meth:`~iris.io.format_picker.FormatAgent.copy` and + equality methods to :class:`iris.io.format_picker.FormatAgent`, as requested + in :issue:`6108`, actioned in :pull:`6119`. + +#. `@ukmo-ccbunney`_ added ``colorbar`` keyword to allow optional creation of + the colorbar in the following quickplot methods: + + * :meth:`iris.quickplot.contourf` + + * :meth:`iris.quickplot.pcolor` + + * :meth:`iris.quickplot.pcolormesh` + + Requested in :issue:`5970`, actioned in :pull:`6169`. + +#. `@pp-mo`_ and `@stephenworsley`_ added support for hybrid coordinates whose + references are split across multiple input fields, and :meth:`~iris.LOAD_POLICY` to + control it, as requested in :issue:`5369`, actioned in :pull:`6168`. + +#. `@ESadek-MO`_ has updated :mod:`iris.fileformats.pp_save_rules` and + :mod:`iris.fileformats.pp` to include the `label_surface_fields` flag across + relevant functions, most notably :func:`iris.fileformats.pp.save`. + This allows the user to choose whether or not surface fields are recognised + and handled appropriately. (:issue:`3280`, :pull:`5734`) + +#. `@ESadek-MO`_ updated to the latest CF Standard Names Table v86 + (5 September 2024). (:pull:`6200`) + +🐛 Bugs Fixed +============= + +#. `@rcomer`_ enabled partial collapse of multi-dimensional string coordinates, + fixing :issue:`3653`. (:pull:`5955`) + +#. `@bouweandela`_ made further updates to the ``chunktype`` of Dask arrays, + so it corresponds better with the array content. (:pull:`5989`) + +#. `@ukmo-ccbunney`_ improved error handling for malformed `cell_method` + attribute. Also made cell_method string parsing more lenient w.r.t. + whitespace. (:pull:`6083`) + +#. `@ukmo-ccbunney`_ fixed comparison of cubes with array type attributes; + fixes :issue:`6027` (:pull:`6181`) + +💣 Incompatible Changes +======================= + +#. N/A + + +🚀 Performance Enhancements +=========================== + +#. `@bouweandela`_ made the time coordinate categorisation functions in + :mod:`~iris.coord_categorisation` faster. Anyone using + :func:`~iris.coord_categorisation.add_categorised_coord` + with cftime :class:`~cftime.datetime` objects can benefit from the same + improvement by adding a type hint to their category funcion. (:pull:`5999`) + +#. `@bouweandela`_ made :meth:`iris.cube.CubeList.concatenate` faster if more + than two cubes are concatenated with equality checks on the values of + auxiliary coordinates, derived coordinates, cell measures, or ancillary + variables enabled. + In some cases, this may lead to higher memory use. This can be remedied by + reducing the number of Dask workers. + In rare cases, the new implementation could potentially be slower. This + may happen when there are very many or large auxiliary coordinates, derived + coordinates, cell measures, or ancillary variables to be checked that span + the concatenation axis. This issue can be avoided by disabling the + problematic check. (:pull:`5926` and :pull:`6187`) + +🔥 Deprecations +=============== + +#. N/A + + +🔗 Dependencies +=============== + +.. _numpy2: + +#. `@trexfeathers`_ adapted the Iris codebase to work with NumPy v2. The + `NumPy v2 full release notes`_ have the exhaustive details. Notable + changes that may affect your Iris scripts are below. (:pull:`6035`) + + * `NumPy v2 changed data type promotion`_ + + * `NumPy v2 changed scalar printing`_ + + +📚 Documentation +================ + +#. `@bouweandela`_ added type hints for :class:`~iris.cube.Cube`. (:pull:`6037`) + +#. `@ESadek-MO`_ has updated :ref:`um_files_loading` to include a short description + of the new `label_surface_fields` functionality. (:pull:`5734`) + + +💼 Internal +=========== + +#. `@trexfeathers`_ improved the new ``tracemalloc`` benchmarking (introduced + in Iris v3.10.0, :pull:`5948`) to use the same statistical repeat strategy + as timing benchmarks. (:pull:`5981`) + +#. `@trexfeathers`_ adapted Iris to work with Cartopy v0.24. (:pull:`6171`, + :pull:`6172`) + +#. `@trexfeathers`_ refactored spanning checks in :mod:`iris.fileformats.cf` + to reduce code duplication. (:pull:`6196`) + + +.. comment + Whatsnew author names (@github name) in alphabetical order. Note that, + core dev names are automatically included by the common_links.inc: + +.. _@jrackham-mo: https://github.com/jrackham-mo + + +.. comment + Whatsnew resources in alphabetical order: + +.. _cartopy#2390: https://github.com/SciTools/cartopy/issues/2390 +.. _NumPy v2 changed data type promotion: https://numpy.org/doc/stable/numpy_2_0_migration_guide.html#changes-to-numpy-data-type-promotion +.. _NumPy v2 changed scalar printing: https://numpy.org/doc/stable/release/2.0.0-notes.html#representation-of-numpy-scalars-changed +.. _NumPy v2 full release notes: https://numpy.org/doc/stable/release/2.0.0-notes.html diff --git a/docs/src/whatsnew/3.2.rst b/docs/src/whatsnew/3.2.rst index ce544a5ecc..387cb32a26 100644 --- a/docs/src/whatsnew/3.2.rst +++ b/docs/src/whatsnew/3.2.rst @@ -64,34 +64,34 @@ v3.2.1 (11 Mar 2022) :pull:`4053`, :pull:`4439`) and API (:pull:`4063`, :pull:`4064`), and supporting representation (:pull:`4033`, :pull:`4054`) of data on meshes. Most of this new API can be found in :mod:`iris.experimental.ugrid`. The key - objects introduced are :class:`iris.experimental.ugrid.mesh.Mesh`, + objects introduced are :class:`iris.experimental.ugrid.mesh.MeshXY`, :class:`iris.experimental.ugrid.mesh.MeshCoord` and :obj:`iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. - A :class:`~iris.experimental.ugrid.mesh.Mesh` contains a full description of a UGRID + A :class:`~iris.experimental.ugrid.mesh.MeshXY` contains a full description of a UGRID type mesh. :class:`~iris.experimental.ugrid.mesh.MeshCoord`\ s are coordinates that - reference and represent a :class:`~iris.experimental.ugrid.mesh.Mesh` for use + reference and represent a :class:`~iris.experimental.ugrid.mesh.MeshXY` for use on a :class:`~iris.cube.Cube`. :class:`~iris.cube.Cube`\ s are also given the property :attr:`~iris.cube.Cube.mesh` which returns a - :class:`~iris.experimental.ugrid.mesh.Mesh` if one is attached to the + :class:`~iris.experimental.ugrid.mesh.MeshXY` if one is attached to the :class:`~iris.cube.Cube` via a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. #. `@trexfeathers`_ added support for loading unstructured mesh data from netcdf data, for files using the `CF-UGRID`_ conventions. The context manager :obj:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD` provides a way to load UGRID files so that :class:`~iris.cube.Cube`\ s can be - returned with a :class:`~iris.experimental.ugrid.mesh.Mesh` attached. + returned with a :class:`~iris.experimental.ugrid.mesh.MeshXY` attached. (:pull:`4058`). #. `@pp-mo`_ added support to save cubes with :ref:`meshes ` to netcdf files, using the `CF-UGRID`_ conventions. The existing :meth:`iris.save` function now does this, when saving cubes with meshes. A routine :meth:`iris.experimental.ugrid.save.save_mesh` allows saving - :class:`~iris.experimental.ugrid.mesh.Mesh` objects to netcdf *without* any associated data + :class:`~iris.experimental.ugrid.mesh.MeshXY` objects to netcdf *without* any associated data (i.e. not attached to cubes). (:pull:`4318` and :pull:`4339`). -#. `@trexfeathers`_ added :meth:`iris.experimental.ugrid.mesh.Mesh.from_coords` - for inferring a :class:`~iris.experimental.ugrid.mesh.Mesh` from an +#. `@trexfeathers`_ added :meth:`iris.experimental.ugrid.mesh.MeshXY.from_coords` + for inferring a :class:`~iris.experimental.ugrid.mesh.MeshXY` from an appropriate collection of :class:`iris.coords.Coord`\ s. #. `@larsbarring`_ updated :func:`~iris.util.equalise_attributes` to return a list of dictionaries @@ -130,7 +130,7 @@ v3.2.1 (11 Mar 2022) :class:`~iris.coords.Coord`, :class:`~iris.coords.CellMeasure`, :class:`~iris.coords.AncillaryVariable`, :class:`~iris.experimental.ugrid.mesh.MeshCoord` and - :class:`~iris.experimental.ugrid.mesh.Mesh`. + :class:`~iris.experimental.ugrid.mesh.MeshXY`. These now all provide a more controllable ``summary()`` method, and more convenient and readable ``str()`` and ``repr()`` output in the style of the :class:`iris.cube.Cube`. diff --git a/docs/src/whatsnew/3.6.rst b/docs/src/whatsnew/3.6.rst index 389356df46..b5a23ac401 100644 --- a/docs/src/whatsnew/3.6.rst +++ b/docs/src/whatsnew/3.6.rst @@ -15,11 +15,11 @@ This document explains the changes made to Iris for this release We're so excited about our recent support for **delayed saving of lazy data to netCDF** (:pull:`5191`) that we're celebrating this important step change - in behavour with its very own dedicated release 🥳 + in behaviour with its very own dedicated release 🥳 By using ``iris.save(..., compute=False)`` you can now save to multiple NetCDF files in parallel. See the new ``compute`` keyword in :func:`iris.fileformats.netcdf.save`. - This can share and re-use any common (lazy) result computations, and it makes much + This can share and reuse any common (lazy) result computations, and it makes much better use of resources during any file-system waiting (i.e., it can use such periods to progress the *other* saves). diff --git a/docs/src/whatsnew/3.7.rst b/docs/src/whatsnew/3.7.rst index 3472374711..fdadb20412 100644 --- a/docs/src/whatsnew/3.7.rst +++ b/docs/src/whatsnew/3.7.rst @@ -36,6 +36,21 @@ This document explains the changes made to Iris for this release any issues or feature requests for improving Iris. Enjoy! +v3.7.1 (04 Mar 2024) +==================== + +.. dropdown:: v3.7.1 Patches + :color: primary + :icon: alert + :animate: fade-in + + The patches in this release of Iris include: + + #. `@stephenworsley`_ fixed a potential memory leak for Iris uses of + :func:`dask.array.map_blocks`; known specifically to be a problem in the + :class:`iris.analysis.AreaWeighted` regridder. (:pull:`5767`) + + 📢 Announcements ================ @@ -55,7 +70,7 @@ This document explains the changes made to Iris for this release (:pull:`5382`) #. `@trexfeathers`_ included mesh location coordinates - (e.g. :attr:`~iris.experimental.ugrid.Mesh.face_coords`) in + (e.g. :attr:`~iris.experimental.ugrid.MeshXY.face_coords`) in the data variable's ``coordinates`` attribute when saving to NetCDF. (:issue:`5206`, :pull:`5389`) diff --git a/docs/src/whatsnew/3.8.rst b/docs/src/whatsnew/3.8.rst index 7a1c66d14b..9fa87a9337 100644 --- a/docs/src/whatsnew/3.8.rst +++ b/docs/src/whatsnew/3.8.rst @@ -1,7 +1,7 @@ .. include:: ../common_links.inc -v3.8 (21 Feb 2024) [release candidate] -************************************** +v3.8 (29 Feb 2024) +****************** This document explains the changes made to Iris for this release (:doc:`View all changes `.) @@ -42,6 +42,22 @@ This document explains the changes made to Iris for this release any issues or feature requests for improving Iris. Enjoy! +v3.8.1 (04 Mar 2024) +==================== + +.. dropdown:: v3.8.1 Patches + :color: primary + :icon: alert + :animate: fade-in + :open: + + The patches in this release of Iris include: + + #. `@stephenworsley`_ fixed a potential memory leak for Iris uses of + :func:`dask.array.map_blocks`; known specifically to be a problem in the + :class:`iris.analysis.AreaWeighted` regridder. (:pull:`5767`) + + 📢 Announcements ================ diff --git a/docs/src/whatsnew/3.9.rst b/docs/src/whatsnew/3.9.rst new file mode 100644 index 0000000000..3af0e894b5 --- /dev/null +++ b/docs/src/whatsnew/3.9.rst @@ -0,0 +1,130 @@ +.. include:: ../common_links.inc + +v3.9 (22 Apr 2024) +****************** + +This document explains the changes made to Iris for this release +(:doc:`View all changes `.) + + +.. dropdown:: v3.9 Release Highlights + :color: primary + :icon: info + :animate: fade-in + :open: + + This is a small release to make two important changes available as soon as + possible: + + * The :mod:`iris.experimental.geovista` module. + * Removal of fill value collision warnings in NetCDF saving, which + significantly improves Iris' performance when parallel processing. + + See below for more detail on these changes. + + And finally, get in touch with us on :issue:`GitHub` if you have + any issues or feature requests for improving Iris. Enjoy! + + +📢 Announcements +================ + +#. ⏱️ Performance benchmarking has shown that loading + :term:`Fields File (FF) Format` with a large number of fields via + :func:`iris.fileformats.um.structured_um_loading` has become ~30% slower + since `Dask version 2024.2.1`_. + + +✨ Features +=========== + +#. `@HGWright`_ and `@trexfeathers`_ added the + :mod:`iris.experimental.geovista` module, providing conveniences for using + :ref:`ugrid geovista` with Iris. To see some of this in action, check out + :ref:`ugrid operations`. Note that GeoVista is an **optional** dependency + so you will need to explicitly install it into your environment. + (:pull:`5740`) + + +🐛 Bugs Fixed +============= + +#. `@pp-mo`_ prevented the CHUNK_CONTROL feature from hitting an error when loading + from a NetCDF v3 file. (:pull:`5897`) + + +💣 Incompatible Changes +======================= + +#. Warnings are no longer produced for fill value 'collisions' in NetCDF + saving. :ref:`Read more `. (:pull:`5833`) + + +🚀 Performance Enhancements +=========================== + +#. `@bouweandela`_ made :func:`iris.util.rolling_window` work with lazy arrays. + (:pull:`5775`) + +#. `@stephenworsley`_ fixed a potential memory leak for Iris uses of + :func:`dask.array.map_blocks`; known specifically to be a problem in the + :class:`iris.analysis.AreaWeighted` regridder. (:pull:`5767`) + +#. `@fnattino`_ and `@pp-mo`_ prevented cube printout from showing the values of lazy + scalar coordinates, since this can involve a lengthy computation that must be + re-computed each time. (:pull:`5896`) + + +🔥 Deprecations +=============== + +#. N/A + + +🔗 Dependencies +=============== + +#. `@bjlittle`_ dropped support for ``py39`` and adopted support for ``py312`` as per + the `NEP-29`_ schedule. (:pull:`5894`) + + +📚 Documentation +================ + +#. N/A + + +💼 Internal +=========== + +#. `@trexfeathers`_ setup automatic benchmarking on pull requests that modify + files likely to affect performance or performance testing. Such pull + requests are also labelled using the `Pull Request Labeler Github action`_ + to increase visibility. (:pull:`5763`, :pull:`5776`) + +#. `@tkknight`_ updated codebase to comply with a new enforced rule `NPY002`_ for + `ruff`_. (:pull:`5786`) + +#. `@tkknight`_ enabled `numpydoc validation`_ via the pre-commit hook. The docstrings + have been updated to comply and some rules have been ignored for now. + (:pull:`5762`) + +#. `@jfrost-mo`_ enabled colour output for pytest on GitHub Actions. (:pull:`5895`) + + +.. comment + Whatsnew author names (@github name) in alphabetical order. Note that, + core dev names are automatically included by the common_links.inc: + +.. _@jfrost-mo: https://github.com/jfrost-mo +.. _@fnattino: https://github.com/fnattino + + +.. comment + Whatsnew resources in alphabetical order: + +.. _Pull Request Labeler GitHub action: https://github.com/actions/labeler +.. _NPY002: https://docs.astral.sh/ruff/rules/numpy-legacy-random/ +.. _numpydoc validation: https://numpydoc.readthedocs.io/en/latest/validation.html# +.. _Dask version 2024.2.1: https://docs.dask.org/en/stable/changelog.html#v2024-2-1 +.. _NEP-29: https://numpy.org/neps/nep-0029-deprecation_policy.html#drop-schedule diff --git a/docs/src/whatsnew/index.rst b/docs/src/whatsnew/index.rst index 23cd022f52..34e516c23d 100644 --- a/docs/src/whatsnew/index.rst +++ b/docs/src/whatsnew/index.rst @@ -1,3 +1,4 @@ + .. include:: ../common_links.inc .. _iris_whatsnew: @@ -12,6 +13,9 @@ What's New in Iris :hidden: latest.rst + 3.11.rst + 3.10.rst + 3.9.rst 3.8.rst 3.7.rst 3.6.rst diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index ab5d18d3eb..9022446cb8 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -72,11 +72,7 @@ This document explains the changes made to Iris for this release 💼 Internal =========== -#. `@trexfeathers`_ used the `Pull Request Labeler Github action`_ to add the - ``benchmark_this`` label (:ref:`more info `) to - pull requests that modify ``requirements/locks/*.lock`` files - ensuring - that we know whether dependency changes will affect performance. - (:pull:`5763`) +#. N/A .. comment @@ -87,6 +83,4 @@ This document explains the changes made to Iris for this release .. comment - Whatsnew resources in alphabetical order: - -.. _Pull Request Labeler GitHub action: https://github.com/actions/labeler + Whatsnew resources in alphabetical order: \ No newline at end of file diff --git a/docs/src/whatsnew/latest.rst.template b/docs/src/whatsnew/latest.rst.template index 966a91e976..fedddec5c0 100644 --- a/docs/src/whatsnew/latest.rst.template +++ b/docs/src/whatsnew/latest.rst.template @@ -23,7 +23,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 'latest.rst' + (Please remove this section when creating an initial 'latest.rst') |iris_version| |build_date| =========================== @@ -104,4 +104,4 @@ NOTE: section ABOVE is a template for bugfix patches .. comment - Whatsnew resources in alphabetical order: + Whatsnew resources in alphabetical order: \ No newline at end of file diff --git a/etc/cf-standard-name-table.xml b/etc/cf-standard-name-table.xml index ef05fde69a..f08d927ad7 100644 --- a/etc/cf-standard-name-table.xml +++ b/etc/cf-standard-name-table.xml @@ -1,7 +1,9 @@ - - 84 - 2024-01-19T15:55:10Z + + 86 + CF-StandardNameTable-86 + 2024-09-05T10:52:50Z + 2024-09-05T10:52:50Z Centre for Environmental Data Analysis support@ceda.ac.uk @@ -13,6 +15,41 @@ Acoustic area backscattering strength is 10 times the log10 of the ratio of the area backscattering coefficient to the reference value, 1 (m2 m-2). Area backscattering coefficient is the integral of the volume backscattering coefficient over a defined distance. Volume backscattering coefficient is the linear form of acoustic_volume_backscattering_strength_in_sea_water. For further details see MacLennan et. al (2002) doi:10.1006/jmsc.2001.1158. + + m + + + Acoustic centre of mass is the average of all sampled depths weighted by their volume backscattering coefficient. Volume backscattering coefficient is the linear form of acoustic_volume_backscattering_strength_in_sea_water. For further details see Urmy et. al (2012) doi:10.1093/icesjms/fsr205. + + + + m + + + Acoustic equivalent area is the squared area backscattering coefficient divided by the depth integral of squared volume backscattering coefficient. Area backscattering coefficient is the integral of the volume backscattering coefficient over a defined distance. Volume backscattering coefficient is the linear form of acoustic_volume_backscattering_strength_in_sea_water. The parameter is computed to provide a value that represents the area that would be occupied if all data cells contained the mean density and is the reciprocal of acoustic_index_of_aggregation_in_sea_water. For further details see Urmy et. al (2012) doi:10.1093/icesjms/fsr205 and Woillez et. al (2007) doi.org/10.1093/icesjms/fsm025. + + + + m-1 + + + Acoustic index of aggregation is the depth integral of squared volume backscattering coefficient divided by the squared area backscattering coefficient. Volume backscattering coefficient is the linear form of acoustic_volume_backscattering_strength_in_sea_water. Area backscattering coefficient is the integral of the volume backscattering coefficient over a defined distance. The parameter is computed to provide a value that represents the patchiness of biomass in the water column in the field of fisheries acoustics - the value is high when small areas are much denser than the rest of the distribution. The parameter is also the reciprocal of acoustic_equivalent_area_in_sea_water. For further details see Urmy et. al (2012) doi:10.1093/icesjms/fsr205 and Woillez et. al (2007) doi.org/10.1093/icesjms/fsm025. + + + + m-2 + + + Acoustic inertia is the sum of squared distances from the acoustic_centre_of_mass weighted by the volume backscattering coefficient at each distance and normalized by the total area backscattering coefficient. Volume backscattering coefficient is the linear form of acoustic_volume_backscattering_strength_in_sea_water. Area backscattering coefficient is the integral of the volume backscattering coefficient over a defined distance. For further details see Urmy et. al (2012) doi:10.1093/icesjms/fsr205 and Bez and Rivoirard (2001) doi:10.1016/S0165-7836(00)00241-1. + + + + 1 + + + Acoustic proportion occupied is occupied volume divided by the volume sampled. Occupied volume is the integral of the ratio of acoustic_volume_backscattering_strength_in_sea_water above -90 dB to the reference value, 1 m2 m-2. For further details see Urmy et. al (2012) doi:10.1093/icesjms/fsr205. + + s @@ -73,7 +110,7 @@ day - "Age of surface snow" means the length of time elapsed since the snow accumulated on the earth's surface. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. + "Age of surface snow" means the length of time elapsed since the snow accumulated on the earth's surface. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. @@ -94,21 +131,21 @@ K - The "equivalent potential temperature" is a thermodynamic quantity, with its natural logarithm proportional to the entropy of moist air, that is conserved in a reversible moist adiabatic process. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_potential_temperature. It is the temperature of a parcel of air if all the moisture contained in it were first condensed, releasing latent heat, before moving the parcel dry adiabatically to a standard pressure, typically representative of mean sea level pressure. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with standard name reference_pressure. + The "equivalent potential temperature" is a thermodynamic quantity, with its natural logarithm proportional to the entropy of moist air, that is conserved in a reversible moist adiabatic process. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_potential_temperature. It is the temperature of a parcel of air if all the moisture contained in it were first condensed, releasing latent heat, before moving the parcel dry adiabatically to a standard pressure, typically representative of mean sea level pressure. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with standard name reference_pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The equivalent temperature is the temperature that an air parcel would have if all water vapor were condensed at contstant pressure and the enthalpy released from the vapor used to heat the air. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_temperature. It is the isobaric equivalent temperature and not the adiabatic equivalent temperature, also known as pseudoequivalent temperature, which has the standard name air_pseudo_equivalent_temperature. + The equivalent temperature is the temperature that an air parcel would have if all water vapor were condensed at contstant pressure and the enthalpy released from the vapor used to heat the air. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_temperature. It is the isobaric equivalent temperature and not the adiabatic equivalent temperature, also known as pseudoequivalent temperature, which has the standard name air_pseudo_equivalent_temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K 13 theta - Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with standard name reference_pressure. + Air potential temperature is the temperature a parcel of air would have if moved dry adiabatically to a standard pressure, typically representative of mean sea level pressure. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with standard name reference_pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -178,56 +215,56 @@ K 14 - The pseudoequivalent potential temperature is the temperature a parcel of air would have if it is expanded by a pseudoadiabatic (irreversible moist-adiabatic) process to zero pressure and afterwards compressed by a dry-adiabatic process to a standard pressure, typically representative of mean sea level pressure. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Pseudoequivalent_potential_temperature. A pseudoadiabatic process means that the liquid water that condenses is assumed to be removed as soon as it is formed. Reference: AMS Glossary http:/glossary.ametsoc.org/wiki/Pseudoadiabatic_process. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with the standard name reference_pressure. + The pseudoequivalent potential temperature is the temperature a parcel of air would have if it is expanded by a pseudoadiabatic (irreversible moist-adiabatic) process to zero pressure and afterwards compressed by a dry-adiabatic process to a standard pressure, typically representative of mean sea level pressure. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Pseudoequivalent_potential_temperature. A pseudoadiabatic process means that the liquid water that condenses is assumed to be removed as soon as it is formed. Reference: AMS Glossary http:/glossary.ametsoc.org/wiki/Pseudoadiabatic_process. To specify the standard pressure to which the quantity applies, provide a scalar coordinate variable with the standard name reference_pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The pseudoequivalent temperature is also known as the adiabatic equivalent temperature. It is the temperature that an air parcel would have after undergoing the following process: dry-adiabatic expansion until saturated; pseudoadiabatic expansion until all moisture is precipitated out; dry-adiabatic compression to the initial pressure. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_temperature. This quantity is distinct from the isobaric equivalent temperature, also known as equivalent temperature, which has the standard name air_equivalent_temperature. + The pseudoequivalent temperature is also known as the adiabatic equivalent temperature. It is the temperature that an air parcel would have after undergoing the following process: dry-adiabatic expansion until saturated; pseudoadiabatic expansion until all moisture is precipitated out; dry-adiabatic compression to the initial pressure. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Equivalent_temperature. This quantity is distinct from the isobaric equivalent temperature, also known as equivalent temperature, which has the standard name air_equivalent_temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K 11 E130 ta - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K 25 - "anomaly" means difference from climatology. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The term "anomaly" means difference from climatology. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - cloud_top refers to the top of the highest cloud. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + cloud_top refers to the top of the highest cloud. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The "effective cloud top defined by infrared radiation" is (approximately) the geometric height above the surface that is one optical depth at infrared wavelengths (in the region of 11 micrometers) below the cloud top that would be detected by visible and lidar techniques. Reference: Minnis, P. et al 2011 CERES Edition-2 Cloud Property Retrievals Using TRMM VIRS and Terra and Aqua MODIS Data x2014; Part I: Algorithms IEEE Transactions on Geoscience and Remote Sensing, 49(11), 4374-4400. doi: http://dx.doi.org/10.1109/TGRS.2011.2144601. + The "effective cloud top defined by infrared radiation" is (approximately) the geometric height above the surface that is one optical depth at infrared wavelengths (in the region of 11 micrometers) below the cloud top that would be detected by visible and lidar techniques. Reference: Minnis, P. et al 2011 CERES Edition-2 Cloud Property Retrievals Using TRMM VIRS and Terra and Aqua MODIS Data x2014; Part I: Algorithms IEEE Transactions on Geoscience and Remote Sensing, 49(11), 4374-4400. doi: http://dx.doi.org/10.1109/TGRS.2011.2144601. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K m-1 19 - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. A lapse rate is the negative derivative of a quantity with respect to increasing height above the surface, or the (positive) derivative with respect to increasing depth. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. A lapse rate is the negative derivative of a quantity with respect to increasing height above the surface, or the (positive) derivative with respect to increasing depth. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. Air temperature excess and deficit are calculated relative to the air temperature threshold. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. Air temperature excess and deficit are calculated relative to the air temperature threshold. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: on-scale", meaning that the temperature is relative to the origin of the scale indicated by the units, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -248,7 +285,7 @@ m - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. To apply the altimeter range correction it must be added to the quantity with standard name altimeter_range. "Correction_due_to_ionosphere" means a correction for the atmosphere's electron content in the ionosphere. Additional altimeter range corrections are given by the quantities with standard names altimeter_range_correction_due_to_wet_troposphere, altimeter_range_correction_due_to_dry_troposphere, sea_surface_height_correction_due_to_air_pressure_at_low_frequency and sea_surface_height_correction_due_to_air_pressure_and_wind_at_high_frequency. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. To apply the altimeter range correction it must be added to the quantity with standard name altimeter_range. "Correction_due_to_ionosphere" means a correction for the atmosphere's electron content in the ionosphere. Additional altimeter range corrections are given by the quantities with standard names altimeter_range_correction_due_to_wet_troposphere, altimeter_range_correction_due_to_dry_troposphere, sea_surface_height_correction_due_to_air_pressure_at_low_frequency and sea_surface_height_correction_due_to_air_pressure_and_wind_at_high_frequency. @@ -353,7 +390,7 @@ K - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name apparent_air_temperature is the perceived air temperature derived from either a combination of temperature and wind (which has standard name wind_chill_of_air_temperature) or temperature and humidity (which has standard name heat_index_of_air_temperature) for the hour indicated by the time coordinate variable. When the air temperature falls to 283.15 K or below, wind chill is used for the apparent_air_temperature. When the air temperature rises above 299.817 K, the heat index is used for apparent_air_temperature. For temperatures above 283.15 and below 299.817K, the apparent_air_temperature is the ambient air temperature (which has standard name air_temperature). References: https://digital.weather.gov/staticpages/definitions.php; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/_0-0-21. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name apparent_air_temperature is the perceived air temperature derived from either a combination of temperature and wind (which has standard name wind_chill_of_air_temperature) or temperature and humidity (which has standard name heat_index_of_air_temperature) for the hour indicated by the time coordinate variable. When the air temperature falls to 283.15 K or below, wind chill is used for the apparent_air_temperature. When the air temperature rises above 299.817 K, the heat index is used for apparent_air_temperature. For temperatures above 283.15 and below 299.817K, the apparent_air_temperature is the ambient air temperature (which has standard name air_temperature). References: https://digital.weather.gov/staticpages/definitions.php; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/_0-0-21. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -367,35 +404,35 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. To specify which area is quantified by a variable with standard name area_fraction, provide a coordinate variable or scalar coordinate variable with standard name area_type. Alternatively, if one is defined, use a more specific standard name of X_area_fraction for the fraction of horizontal area occupied by X. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. To specify which area is quantified by a variable with standard name area_fraction, provide a coordinate variable or scalar coordinate variable with standard name area_type. Alternatively, if one is defined, use a more specific standard name of X_area_fraction for the fraction of horizontal area occupied by X. 1 psbg - The quantity with standard name area_fraction_below_surface is the fraction of horizontal area where a given isobaric surface is below the (ground or sea) surface. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The surface called "surface" means the lower boundary of the atmosphere. + The quantity with standard name area_fraction_below_surface is the fraction of horizontal area where a given isobaric surface is below the (ground or sea) surface. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The surface called "surface" means the lower boundary of the atmosphere. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A coordinate variable of solar_zenith_angle indicating the day extent should be specified. Solar zenith angle is the the angle between the line of sight to the sun and the local vertical. @@ -1116,7 +1153,7 @@ kg m-2 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The chemical formula for the hydroperoxyl radical is HO2. In chemistry, a 'radical' is a highly reactive, and therefore short lived, species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The chemical formula for the hydroperoxyl radical is HO2. In chemistry, a 'radical' is a highly reactive, and therefore short lived, species. @@ -1291,14 +1328,14 @@ kg m-2 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. kg m-2 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. @@ -1893,7 +1930,7 @@ mol - The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. + The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. @@ -2089,14 +2126,14 @@ mol - The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. + The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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 - The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. + The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. @@ -2383,21 +2420,21 @@ K - The atmosphere_stability_k_index is an index that indicates the potential of severe convection and is often referred to a simply the k index. The index is derived from the difference in air temperature between 850 and 500 hPa, the dew point temperature at 850 hPa, and the difference between the air temperature and the dew point temperature at 700 hPa. + The atmosphere_stability_k_index is an index that indicates the potential of severe convection and is often referred to as simply the k index. The index is calculated as A + B - C, where A is the difference in air temperature between 850 and 500 hPa, B is the dew point temperature at 850 hPa, and C is the dew point depression (i.e. the amount by which the air temperature exceeds its dew point temperature) at 700 hPa. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The atmosphere_stability_showalter_index is an index used to determine convective and thunderstorm potential and is often referred to as simply the showalter index. The index is defined as the temperature difference between a parcel of air lifted from 850 to 500 hPa (wet adiabatically) and the ambient air temperature at 500 hPa. + The atmosphere_stability_showalter_index is an index used to determine convective and thunderstorm potential and is often referred to as simply the showalter index. The index is defined as the temperature difference between a parcel of air lifted from 850 to 500 hPa (wet adiabatically) and the ambient air temperature at 500 hPa. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The atmosphere_stability_total_totals_index indicates thelikelihood of severe convection and is often referred to as simply thetotal totals index. The index is derived from the difference in airtemperature between 850 and 500 hPa (the vertical totals) and thedifference between the dew point temperature at 850 hPa and the airtemperature at 500 hPa (the cross totals). The vertical totals and crosstotals are summed to obtain the index. + The atmosphere_stability_total_totals_index indicates thelikelihood of severe convection and is often referred to as simply thetotal totals index. The index is derived from the difference in airtemperature between 850 and 500 hPa (the vertical totals) and thedifference between the dew point temperature at 850 hPa and the airtemperature at 500 hPa (the cross totals). The vertical totals and crosstotals are summed to obtain the index. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2418,28 +2455,28 @@ s-1 41 - Atmosphere upward absolute vorticity is the sum of the atmosphere upward relative vorticity and the vertical component of vorticity due to the Earth’s rotation. In contrast, the quantity with standard name atmosphere_upward_relative_vorticity excludes the Earth's rotation. Vorticity is a vector quantity. "Upward" indicates a vector component which is positive when directed upward (negative downward). A positive value of atmosphere_upward_absolute_vorticity indicates anticlockwise rotation when viewed from above. + Atmosphere upward absolute vorticity is the sum of the atmosphere upward relative vorticity and the vertical component of vorticity due to the Earth’s rotation. In contrast, the quantity with standard name atmosphere_upward_relative_vorticity excludes the Earth's rotation. Vorticity is a vector quantity. "Upward" indicates a vector component which is positive when directed upward (negative downward). A positive value of atmosphere_upward_absolute_vorticity indicates anticlockwise rotation when viewed from above. s-1 43 E138 - Atmosphere upward relative vorticity is the vertical component of the 3D air vorticity vector. The vertical component arises from horizontal velocity only. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. In contrast, the quantity with standard name atmosphere_upward_absolute_vorticity includes the Earth's rotation. "Upward" indicates a vector component which is positive when directed upward (negative downward). A positive value of atmosphere_upward_relative_vorticity indicates anticlockwise rotation when viewed from above. + Atmosphere upward relative vorticity is the vertical component of the 3D air vorticity vector. The vertical component arises from horizontal velocity only. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. In contrast, the quantity with standard name atmosphere_upward_absolute_vorticity includes the Earth's rotation. "Upward" indicates a vector component which is positive when directed upward (negative downward). A positive value of atmosphere_upward_relative_vorticity indicates anticlockwise rotation when viewed from above. s-1 - Atmosphere x relative vorticity is the x component of the 3D air vorticity vector. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. "x" indicates a vector component along the grid x-axis, positive with increasing x. A positive value of atmosphere_x_relative_vorticity indicates anticlockwise rotation when viewed by an observer looking along the axis in the direction of decreasing x, i.e. consistent with the "right hand screw" rule. + Atmosphere x relative vorticity is the x component of the 3D air vorticity vector. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. "x" indicates a vector component along the grid x-axis, positive with increasing x. A positive value of atmosphere_x_relative_vorticity indicates anticlockwise rotation when viewed by an observer looking along the axis in the direction of decreasing x, i.e. consistent with the "right hand screw" rule. s-1 - Atmosphere y relative vorticity is the y component of the 3D air vorticity vector. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. "y" indicates a vector component along the grid y-axis, positive with increasing y. A positive value of atmosphere_y_relative_vorticity indicates anticlockwise rotation when viewed by an observer looking along the axis in the direction of decreasing y, i.e. consistent with the "right hand screw" rule. + Atmosphere y relative vorticity is the y component of the 3D air vorticity vector. "Relative" in this context means the vorticity of the air relative to the rotating solid earth reference frame, i.e. excluding the Earth's own rotation. "y" indicates a vector component along the grid y-axis, positive with increasing y. A positive value of atmosphere_y_relative_vorticity indicates anticlockwise rotation when viewed by an observer looking along the axis in the direction of decreasing y, i.e. consistent with the "right hand screw" rule. @@ -2453,7 +2490,7 @@ - The Automated Tropical Cyclone Forecasting System (ATCF) storm identifier is an 8 character string which identifies a tropical cyclone. The storm identifier has the form BBCCYYYY, where BB is the ocean basin, specifically: AL - North Atlantic basin, north of the Equator; SL - South Atlantic basin, south of the Equator; EP - North East Pacific basin, eastward of 140 degrees west longitude; CP - North Central Pacific basin, between the dateline and 140 degrees west longitude; WP - North West Pacific basin, westward of the dateline; IO - North Indian Ocean basin, north of the Equator between 40 and 100 degrees east longitude; SH - South Pacific Ocean basin and South Indian Ocean basin. CC is the cyclone number. Numbers 01 through 49 are reserved for tropical and subtropical cyclones. A cyclone number is assigned to each tropical or subtropical cyclone in each basin as it develops. Numbers are assigned in chronological order. Numbers 50 through 79 are reserved for internal use by operational forecast centers. Numbers 80 through 89 are reserved for training, exercises and testing. Numbers 90 through 99 are reserved for tropical disturbances having the potential to become tropical or subtropical cyclones. The 90's are assigned sequentially and reused throughout the calendar year. YYYY is the four-digit year. This is calendar year for the northern hemisphere. For the southern hemisphere, the year begins July 1, with calendar year plus one. Reference: Miller, R.J., Schrader, A.J., Sampson, C.R., & Tsui, T.L. (1990), The Automated Tropical Cyclone Forecasting System (ATCF), American Meteorological Society Computer Techniques, 5, 653 - 660. + The Automated Tropical Cyclone Forecasting System (ATCF) storm identifier is an 8 character string which identifies a tropical cyclone. The storm identifier has the form BBCCYYYY, where BB is the ocean basin, specifically: AL - North Atlantic basin, north of the Equator; SL - South Atlantic basin, south of the Equator; EP - North East Pacific basin, eastward of 140 degrees west longitude; CP - North Central Pacific basin, between the dateline and 140 degrees west longitude; WP - North West Pacific basin, westward of the dateline; IO - North Indian Ocean basin, north of the Equator between 40 and 100 degrees east longitude; SH - South Pacific Ocean basin and South Indian Ocean basin. CC is the cyclone number. Numbers 01 through 49 are reserved for tropical and subtropical cyclones. A cyclone number is assigned to each tropical or subtropical cyclone in each basin as it develops. Numbers are assigned in chronological order. Numbers 50 through 79 are reserved for internal use by operational forecast centers. Numbers 80 through 89 are reserved for training, exercises and testing. Numbers 90 through 99 are reserved for tropical disturbances having the potential to become tropical or subtropical cyclones. The 90's are assigned sequentially and reused throughout the calendar year. YYYY is the four-digit year. This is calendar year for the northern hemisphere. For the southern hemisphere, the year begins July 1, with calendar year plus one. Reference: Miller, R.J., Schrader, A.J., Sampson, C.R., & Tsui, T.L. (1990), The Automated Tropical Cyclone Forecasting System (ATCF), American Meteorological Society Computer Techniques, 5, 653 - 660. @@ -2554,6 +2591,13 @@ The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level. "Bedrock" is the solid Earth surface beneath land ice, ocean water or soil. The zero of bedrock altitude change is arbitrary. Isostatic adjustment is the vertical movement of the lithosphere due to changing surface ice and water loads. + + m + + + The bedrock_depth_below_ground_level is the vertical distance between the ground and the bedrock. "Bedrock" refers to the surface of the consolidated rock, beneath any unconsolidated rock, sediment, soil, water or land ice. "Ground level" means the level of the solid surface in land areas without permanent inland water, beneath any snow, ice or surface water. + + @@ -2586,21 +2630,21 @@ K 118 - The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. + The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units).. K - The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. "anomaly" means difference from climatology. + The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. "anomaly" means difference from climatology. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - cloud_top refers to the top of the highest cloud. brightness_temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. A coordinate variable of radiation_wavelength, sensor_band_central_radiation_wavelength, or radiation_frequency may be specified to indicate that the brightness temperature applies at specific wavelengths or frequencies. + cloud_top refers to the top of the highest cloud. brightness_temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. A coordinate variable of radiation_wavelength, sensor_band_central_radiation_wavelength, or radiation_frequency may be specified to indicate that the brightness temperature applies at specific wavelengths or frequencies. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2621,7 +2665,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Burned area" means the area of burned vegetation. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Burned area" means the area of burned vegetation. @@ -2635,7 +2679,7 @@ 1 - Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. The surface_albedo restricted to the area type "vegetation" is related to canopy_albedo, but the former also includes the effect of radiation being reflected from the ground underneath the canopy. + Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. The surface_albedo restricted to the area type "vegetation" is related to canopy_albedo, but the former also includes the effect of radiation being reflected from the ground underneath the canopy. @@ -2670,7 +2714,7 @@ K - "Canopy temperature" is the bulk temperature of the canopy, not the surface (skin) temperature. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. + "Canopy temperature" is the bulk temperature of the canopy, not the surface (skin) temperature. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2771,6 +2815,27 @@ Zero change in land ice mass is an arbitrary level. "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. The horizontal domain over which the quantity is calculated is described by the associated coordinate variables and coordinate bounds or by a coordinate variable or scalar coordinate variable with the standard name of "region" supplied according to section 6.1.1 of the CF conventions. + + m + + + The change in local mean sea level relative to the local solid surface, i.e. sea floor. The abbreviation "wrt" means "with respect to". A positive value means sea level rise. + + + + m + + + Sea surface height is a time-varying quantity. A reference ellipsoid is a regular mathematical figure that approximates the irregular shape of the geoid. A number of reference ellipsoids are defined for use in the field of geodesy. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Tides are a significant contributor to the observed sea surface height. The load tidal component of sea surface height describes the variability of the sea surface due to the deformation of the Earth because of the weight of the water masses displaced by ocean tides. + + + + m + + + Sea surface height is a time-varying quantity. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + kg m-2 @@ -2838,7 +2903,7 @@ K - "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. + The phrase "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2866,7 +2931,7 @@ K - Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. + Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The phrase "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2887,7 +2952,7 @@ 1e-3 - "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. @@ -2901,7 +2966,7 @@ K - "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate.Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature applies use a vertical coordinate variable or scalar coordinate variable. There are standard names for sea_surface_temperature, sea_surface_skin_temperature, sea_surface_subskin_temperature and sea_surface_foundation_temperature which can be used to describe data located at the specified surfaces. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "change_over_time_in_X" means change in a quantity X over a time-interval, which should be defined by the bounds of the time coordinate.Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature applies use a vertical coordinate variable or scalar coordinate variable. There are standard names for sea_surface_temperature, sea_surface_skin_temperature, sea_surface_subskin_temperature and sea_surface_foundation_temperature which can be used to describe data located at the specified surfaces. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -2936,7 +3001,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The clear_sky area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. "Clear sky" means in the absence of clouds. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The clear_sky area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. "Clear sky" means in the absence of clouds. @@ -2950,21 +3015,21 @@ 1 - The albedo of cloud. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. + The albedo of cloud. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. 1 71 E164 clt - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". 1 cl - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -3055,14 +3120,14 @@ 1 72 E185 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Convective cloud is that produced by the convection schemes in an atmosphere model. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Convective cloud is that produced by the convection schemes in an atmosphere model. Cloud area fraction is also called "cloud amount" and "cloud cover". 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Standard names also exist for high, medium and low cloud types. Convective cloud is that produced by the convection schemes in an atmosphere model. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Standard names also exist for high, medium and low cloud types. Convective cloud is that produced by the convection schemes in an atmosphere model. Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -3104,21 +3169,21 @@ kg m-2 63 - "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. Convective precipitation is that produced by the convection schemes in an atmosphere model. + "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. Convective precipitation is that produced by the convection schemes in an atmosphere model. kg m-2 s-1 prc - Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. m s-1 - "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. + "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. @@ -3160,7 +3225,7 @@ s-1 - The Coriolis parameter is twice the component of the earth's angular velocity about the local vertical i.e. 2 W sin L, where L is latitude and W the angular speed of the earth. + The Coriolis parameter is twice the component of the earth's angular velocity about the local vertical i.e. 2 W sin L, where L is latitude and W the angular speed of the earth. @@ -3174,7 +3239,7 @@ K m s-1 - Covariance refers to the sample covariance rather than the population covariance. The quantity with standard name covariance_over_longitude_of_northward_wind_and_air_temperature is the covariance of the deviations of meridional air velocity and air temperature about their respective zonal mean values. The data variable must be accompanied by a vertical coordinate variable or scalar coordinate variable and is calculated on an isosurface of that vertical coordinate. "Northward" indicates a vector component which is positive when directed northward (negative southward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name "upward_air_velocity"). Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + Covariance refers to the sample covariance rather than the population covariance. The quantity with standard name covariance_over_longitude_of_northward_wind_and_air_temperature is the covariance of the deviations of meridional air velocity and air temperature about their respective zonal mean values. The data variable must be accompanied by a vertical coordinate variable or scalar coordinate variable and is calculated on an isosurface of that vertical coordinate. "Northward" indicates a vector component which is positive when directed northward (negative southward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name "upward_air_velocity"). Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -3230,7 +3295,7 @@ m - Depth is the vertical distance below the surface. '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 depth_at_shallowest_local_minimum_in_vertical_profile_of_mole_concentration_of_dissolved_molecular_oxygen_in_sea_water is the depth of the local minimum in the oxygen concentration that occurs closest to the sea surface. + Depth is the vertical distance below the surface. '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 depth_at_shallowest_local_minimum_in_vertical_profile_of_mole_concentration_of_dissolved_molecular_oxygen_in_sea_water is the depth of the local minimum in the oxygen concentration that occurs closest to the sea surface. @@ -3258,14 +3323,14 @@ K 18 - Dew point depression is also called dew point deficit. It is the amount by which the air temperature exceeds its dew point temperature. Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity. + Dew point depression is also called dew point deficit. It is the amount by which the air temperature exceeds its dew point temperature. Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K 17 - Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity. + Dew point temperature is the temperature at which a parcel of air reaches saturation upon being cooled at constant pressure and specific humidity. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -3300,7 +3365,7 @@ K - Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any), not the skin or interface temperature, whose standard names are sea_surface_skin_temperature and surface_temperature, respectively. For the temperature of sea water at a particular depth or layer, a data variable of "sea_water_temperature" with a vertical coordinate axis should be used. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any), not the skin or interface temperature, whose standard names are sea_surface_skin_temperature and surface_temperature, respectively. For the temperature of sea water at a particular depth or layer, a data variable of "sea_water_temperature" with a vertical coordinate axis should be used. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -3356,7 +3421,7 @@ degrees - The phrase "direction_of_X" means direction of a vector, a bearing. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. In that case, "displacement" is also the distance across the earth's surface calculated from the change in a moving object's geospatial position between the start and end of the time interval associated with the displacement variable. The "direction of displacement" is the angle between due north and the displacement vector. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + The phrase "direction_of_X" means direction of a vector, a bearing. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. In that case, "displacement" is also the distance across the earth's surface calculated from the change in a moving object's geospatial position between the start and end of the time interval associated with the displacement variable. The "direction of displacement" is the angle between due north and the displacement vector. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -3370,7 +3435,7 @@ m - A measure of distance from the Earth's geocenter, commonly used in satellite tracks. + A measure of distance from the Earth's geocenter, commonly used in satellite tracks. @@ -3531,14 +3596,14 @@ Pa - "Downward" indicates a vector component which is positive when directed downward (negative upward). "x" indicates a vector component along the grid x-axis, positive with increasing x. A downward x stress is a downward flux of momentum towards the positive direction of the model's x-axis. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. + "Downward" indicates a vector component which is positive when directed downward (negative upward). "x" indicates a vector component along the grid x-axis, positive with increasing x. A downward x stress is a downward flux of momentum towards the positive direction of the model's x-axis. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. Pa - "Downward" indicates a vector component which is positive when directed downward (negative upward). "x" indicates a vector component along the grid x-axis, positive with increasing x. A downward x stress is a downward flux of momentum towards the positive direction of the model's x-axis. A positive correction is downward i.e. added to the ocean. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. + "Downward" indicates a vector component which is positive when directed downward (negative upward). "x" indicates a vector component along the grid x-axis, positive with increasing x. A downward x stress is a downward flux of momentum towards the positive direction of the model's x-axis. A positive correction is downward i.e. added to the ocean. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. @@ -3552,14 +3617,14 @@ Pa - "Downward" indicates a vector component which is positive when directed downward (negative upward). "y" indicates a vector component along the grid y-axis, positive with increasing y. A downward y stress is a downward flux of momentum towards the positive direction of the model's y-axis. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. + "Downward" indicates a vector component which is positive when directed downward (negative upward). "y" indicates a vector component along the grid y-axis, positive with increasing y. A downward y stress is a downward flux of momentum towards the positive direction of the model's y-axis. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. Pa - "Downward" indicates a vector component which is positive when directed downward (negative upward). "y" indicates a vector component along the grid y-axis, positive with increasing y. A downward y stress is a downward flux of momentum towards the positive direction of the model's y-axis. A positive correction is downward i.e. added to the ocean. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. + "Downward" indicates a vector component which is positive when directed downward (negative upward). "y" indicates a vector component along the grid y-axis, positive with increasing y. A downward y stress is a downward flux of momentum towards the positive direction of the model's y-axis. A positive correction is downward i.e. added to the ocean. The phrase "sea water surface" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. @@ -3576,6 +3641,20 @@ Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 sr-1 @@ -3730,6 +3809,20 @@ Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -3772,13 +3865,6 @@ The quantity with standard name drainage_amount_through_base_of_soil_model is the amount of water that drains through the bottom of a soil column extending from the surface to a specified depth. "Drainage" is the process of removal of excess water from soil by gravitational flow. "Amount" means mass per unit area. A vertical coordinate variable or scalar coordinate with standard name "depth" should be used to specify the depth to which the soil column extends. - - kg m-2 - - - “Drainage” is the process of removal of excess water from soil by gravitational flow. "Amount" means mass per unit area. The vertical drainage amount in soil is the amount of water that drains through the bottom of a soil column extending from the surface to a specified depth. - - 1 @@ -3839,7 +3925,7 @@ K - The dynamical tropopause used in interpreting the dynamics of the upper troposphere and lower stratosphere. There are various definitions of dynamical tropopause in the scientific literature. + The dynamical tropopause used in interpreting the dynamics of the upper troposphere and lower stratosphere. There are various definitions of dynamical tropopause in the scientific literature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -3937,7 +4023,7 @@ m - "Eastward" indicates a vector component which is positive when directed eastward (negative westward). "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. An eastward displacement is the distance calculated from the change in a moving object's longitude between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "Eastward" indicates a vector component which is positive when directed eastward (negative westward). "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. An eastward displacement is the distance calculated from the change in a moving object's longitude between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -4182,7 +4268,7 @@ K m2 kg-1 s-1 vorpot - The Ertel potential vorticity is the scalar product of the atmospheric absolute vorticity vector and the gradient of potential temperature. It is a conserved quantity in the absence of friction and heat sources [AMS Glossary, http://glossary.ametsoc.org/wiki/Ertel_potential_vorticity]. A frequently used simplification of the general Ertel potential vorticity considers the Earth rotation vector to have only a vertical component. Then, only the vertical contribution of the scalar product is calculated. + The Ertel potential vorticity is the scalar product of the atmospheric absolute vorticity vector and the gradient of potential temperature. It is a conserved quantity in the absence of friction and heat sources [AMS Glossary, http://glossary.ametsoc.org/wiki/Ertel_potential_vorticity]. A frequently used simplification of the general Ertel potential vorticity considers the Earth rotation vector to have only a vertical component. Then, only the vertical contribution of the scalar product is calculated. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -4217,7 +4303,7 @@ K - The overall temperature of a fire area due to contributions from smoldering and flaming biomass. A data variable containing the area affected by fire should be given the standard name fire_area. + The overall temperature of a fire area due to contributions from smoldering and flaming biomass. A data variable containing the area affected by fire should be given the standard name fire_area. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -4238,7 +4324,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A "floating ice shelf", sometimes called a "floating ice sheet", indicates where an ice sheet extending from a land area flows over sea water. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A "floating ice shelf", sometimes called a "floating ice sheet", indicates where an ice sheet extending from a land area flows over sea water. @@ -4273,7 +4359,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Fog means water droplets or minute ice crystals close to the surface which reduce visibility in air to less than 1000m. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Fog means water droplets or minute ice crystals close to the surface which reduce visibility in air to less than 1000m. @@ -4308,7 +4394,7 @@ 1 - "Fraction of time" is the fraction of a time period defined by the bounds of the time coordinate variable for which a characteristic of interest exists. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. Sea ice area fraction is area of the sea surface occupied by sea ice. The area threshold value must be specified by supplying a coordinate variable or scalar coordinate variable with the standard name of sea_ice_area_fraction. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "Fraction of time" is the fraction of a time period defined by the bounds of the time coordinate variable for which a characteristic of interest exists. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. The area threshold value must be specified by supplying a coordinate variable or scalar coordinate variable with the standard name of sea_ice_area_fraction. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -4437,6 +4523,13 @@ Global average sea level change is due to change in volume of the water in the ocean, caused by mass and/or density change, or to change in the volume of the ocean basins, caused by tectonics etc. It is sometimes called "eustatic", which is a term that also has other definitions. It differs from the change in the global average sea surface height relative to the centre of the Earth by the global average vertical movement of the ocean floor. Zero sea level change is an arbitrary level. Because global average sea level change quantifies the change in volume of the world ocean, it is not calculated necessarily by considering local changes in mean sea level. + + m + + + Global average mass volume sea level change is caused by water mass balance (evaporation – precipitation + runoff). This in turn results in a change in volume of the world ocean. Zero sea level change is an arbitrary level. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Because global average sea level change quantifies the change in volume of the world ocean, it is not calculated necessarily by considering local changes in mean sea level. This quantity is sometimes called "barystatic sea level rise" or "barystatic sea level change". It is the part of global-mean sea-level rise which is due to the addition to the ocean of water mass that formerly resided within the land area (as land water storage or land ice) or in the atmosphere (which contains a relatively tiny mass of water). + + m @@ -4539,14 +4632,14 @@ s-1 - The "gross rate of decrease in area fraction" is the fraction of a grid cell that transitions from a given area type per unit time, for example, as a result of land use changes. The quantity described by this standard name is a gross decrease because it includes only land where the use transitions away from the given area type and excludes land that transitions to that area type during the same period. The area type should be specified using a coordinate of scalar coordinate variable with standard name area_type. There is also a standard name for gross_rate_of_increase_in_area_fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area + The "gross rate of decrease in area fraction" is the fraction of a grid cell that transitions from a given area type per unit time, for example, as a result of land use changes. The quantity described by this standard name is a gross decrease because it includes only land where the use transitions away from the given area type and excludes land that transitions to that area type during the same period. The area type should be specified using a coordinate of scalar coordinate variable with standard name area_type. There is also a standard name for gross_rate_of_increase_in_area_fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. s-1 - The "rate of increase in area fraction" is the fraction of a grid cell that transitions to a given area type per unit time, for example, as a result of land use changes. The quantity described by this standard name is a gross increase because it includes only land where the use transitions to the given area type and excludes land that transitions away from that area type during the same period. The area type should be specified using a coordinate or scalar coordinate variable with standard name area_type. There is also a standard name for gross_rate_of_decrease_in_area_fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. + The "rate of increase in area fraction" is the fraction of a grid cell that transitions to a given area type per unit time, for example, as a result of land use changes. The quantity described by this standard name is a gross increase because it includes only land where the use transitions to the given area type and excludes land that transitions away from that area type during the same period. The area type should be specified using a coordinate or scalar coordinate variable with standard name area_type. There is also a standard name for gross_rate_of_decrease_in_area_fraction. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. @@ -4560,7 +4653,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Grounded ice sheet" indicates where the ice sheet rests over bedrock and is thus grounded. It excludes ice-caps, glaciers and floating ice shelves. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Grounded ice sheet" indicates where the ice sheet rests over bedrock and is thus grounded. It excludes ice-caps, glaciers and floating ice shelves. @@ -4700,7 +4793,7 @@ K - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name heat_index_of_air_temperature is the perceived air temperature when relative humidity is taken into consideration (which makes it feel hotter than the actual air temperature). Heat index is only defined when the ambient air temperature is at or above 299.817 K. References: https://www.weather.gov/safety/heat-index; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/_0-0-12. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name heat_index_of_air_temperature is the perceived air temperature when relative humidity is taken into consideration (which makes it feel hotter than the actual air temperature). Heat index is only defined when the ambient air temperature is at or above 299.817 K. References: https://www.weather.gov/safety/heat-index; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/_0-0-12. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -4763,7 +4856,7 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. High type clouds are: Cirrus, Cirrostratus, Cirrocumulus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -4805,14 +4898,14 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. Cloud area fraction is also called "cloud amount" and "cloud cover". 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be "model_level_number", but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be "model_level_number", but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -4847,21 +4940,21 @@ kg degree_C m-2 - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". Depth is the vertical distance below the surface. The phrase "product_of_X_and_Y" means X*Y. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". Depth is the vertical distance below the surface. The phrase "product_of_X_and_Y" means X*Y. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). kg degree_C m-2 - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". The phrase "product_of_X_and_Y" means X*Y. Depth is the vertical distance below the surface. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". The phrase "product_of_X_and_Y" means X*Y. Depth is the vertical distance below the surface. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). 1e-3 kg m-2 - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". The phrase "product_of_X_and_Y" means X*Y. Depth is the vertical distance below the surface. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. Practical salinity units are dimensionless. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. The phrase "wrt" means "with respect to". The phrase "product_of_X_and_Y" means X*Y. Depth is the vertical distance below the surface. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. Practical salinity units are dimensionless. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. Sea water density is the in-situ density (not the potential density). For Boussinesq models, density is the constant Boussinesq reference density, a quantity which has the standard name reference_sea_water_density_for_boussinesq_approximation. @@ -4875,21 +4968,21 @@ K m - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. Depth is the vertical distance below the surface. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. Depth is the vertical distance below the surface. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). mol m-2 s-1 - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. Depth is the vertical distance below the surface."tendency_of_X" means derivative of X with respect to time. 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. Depth is the vertical distance below the surface."tendency_of_X" means derivative of X with respect to time. 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). mol m-2 s-1 - The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. "tendency_of_X" means derivative of X with respect to time. Depth is the vertical distance below the surface. 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + The phrase "integral_wrt_X_of_Y" means int Y dX. To specify the limits of the integral the data variable should have an axis for X and associated coordinate bounds. If no axis for X is associated with the data variable, or no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is air the integral is assumed to be calculated over the full depth of the atmosphere. "wrt" means with respect to. "tendency_of_X" means derivative of X with respect to time. Depth is the vertical distance below the surface. 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. @@ -4924,14 +5017,14 @@ K s - The phrase "integral_wrt_X_of_Y" means int Y dX. The data variable should have an axis for X specifying the limits of the integral as bounds. "wrt" means with respect to. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The air temperature deficit is the air temperature threshold minus the air temperature, where only positive values are included in the integral. Its integral with respect to time is often called after its units of "degree-days". The air_temperature variable, which is the data variable of the integral should have a scalar coordinate variable or a size-one coordinate variable with the standard name of air_temperature_threshold, to indicate the threshold. + The phrase "integral_wrt_X_of_Y" means int Y dX. The data variable should have an axis for X specifying the limits of the integral as bounds. "wrt" means with respect to. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The air temperature deficit is the air temperature threshold minus the air temperature, where only positive values are included in the integral. Its integral with respect to time is often called after its units of "degree-days". The air_temperature variable, which is the data variable of the integral should have a scalar coordinate variable or a size-one coordinate variable with the standard name of air_temperature_threshold, to indicate the threshold. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s - The phrase "integral_wrt_X_of_Y" means int Y dX. The data variable should have an axis for X specifying the limits of the integral as bounds. "wrt" means with respect to. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The air temperature excess is the air temperature minus the air temperature threshold, where only positive values are included in the integral. Its integral with respect to time is often called after its units of "degree-days". The air_temperature variable, which is the data variable of the integral should have a scalar coordinate variable or a size-one coordinate variable with the standard name of air_temperature_threshold, to indicate the threshold. + The phrase "integral_wrt_X_of_Y" means int Y dX. The data variable should have an axis for X specifying the limits of the integral as bounds. "wrt" means with respect to. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The air temperature excess is the air temperature minus the air temperature threshold, where only positive values are included in the integral. Its integral with respect to time is often called after its units of "degree-days". The air_temperature variable, which is the data variable of the integral should have a scalar coordinate variable or a size-one coordinate variable with the standard name of air_temperature_threshold, to indicate the threshold. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -7591,7 +7684,7 @@ 1 clisccp - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. The ISCCP cloud area fraction is diagnosed from atmosphere model output by the ISCCP simulator software in such a way as to be comparable with the observational diagnostics of ISCCP (the International Satellite Cloud Climatology Project). Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. The ISCCP cloud area fraction is diagnosed from atmosphere model output by the ISCCP simulator software in such a way as to be comparable with the observational diagnostics of ISCCP (the International Satellite Cloud Climatology Project). Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -7668,7 +7761,7 @@ 1 81 sftlf - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. @@ -7689,7 +7782,7 @@ 1 sftgif - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. @@ -7717,7 +7810,7 @@ K - "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. The standard name land_ice_basal_temperature means the temperature of the land ice at its lower boundary. + "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. The standard name land_ice_basal_temperature means the temperature of the land ice at its lower boundary. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -7857,7 +7950,7 @@ K - "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. + "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -7937,6 +8030,20 @@ "Content" indicates a quantity per unit area. + + 1 + + + Left singular vectors of the matrix representing the logarithmic scale remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (fractional changes of methane in the retrieved atmosphere relative to the fractional changes of methane in the true atmosphere, Rodgers 2000; Keppens et al., 2015). + + + + 1 + + + Left singular vectors of the matrix representing the remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + J kg-1 @@ -7955,14 +8062,14 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. "Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names also exist for high, medium and low cloud types. "Cloud area fraction is also called "cloud amount" and "cloud cover". 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be "model_level_number", but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be "model_level_number", but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -8067,14 +8174,14 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Low type clouds are: Stratus, Stratocumulus, Cumulus, Cumulonimbus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". m s-1 - Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. + Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. @@ -8088,7 +8195,7 @@ m s-1 - "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. + "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. @@ -8102,7 +8209,7 @@ m s-1 - Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. + Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. "Precipitation rate" means the depth or thickness of the layer formed by precipitation per unit time. @@ -8130,7 +8237,7 @@ m E143 - The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. + The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. Convective precipitation is that produced by the convection schemes in an atmosphere model. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. @@ -8158,7 +8265,7 @@ m - The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. + The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. @@ -8179,7 +8286,7 @@ m E142 - The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. + The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. @@ -8270,7 +8377,7 @@ 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/. + "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/. @@ -8305,14 +8412,14 @@ 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 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 acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic acid. + 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 acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic 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 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. + 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. @@ -8326,14 +8433,14 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. + 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'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. 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 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. + 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. @@ -8347,14 +8454,14 @@ 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 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 alpha_hexachlorocyclohexane is C6H6Cl6. + 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 alpha_hexachlorocyclohexane is C6H6Cl6. 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 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 alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. + 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 alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. @@ -8368,7 +8475,7 @@ 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 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 ammonia is NH3. + 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 ammonia is NH3. @@ -8389,7 +8496,7 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. Aromatic compounds in organic chemistry are compounds that contain at least one benzene ring of six carbon atoms joined by alternating single and double covalent bonds. The simplest aromatic compound is benzene itself. In standard names "aromatic_compounds" is the term used to describe the group of aromatic chemical species 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 aromatic species, e.g. benzene and xylene. + 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'. Aromatic compounds in organic chemistry are compounds that contain at least one benzene ring of six carbon atoms joined by alternating single and double covalent bonds. The simplest aromatic compound is benzene itself. In standard names "aromatic_compounds" is the term used to describe the group of aromatic chemical species 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 aromatic species, e.g. benzene and xylene. @@ -8403,28 +8510,28 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic bromine is Br. + 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 symbol for atomic bromine is Br. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic chlorine is Cl. + 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 symbol for atomic chlorine is Cl. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic nitrogen is N. + 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 symbol for atomic nitrogen is N. 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 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. + 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. @@ -8438,7 +8545,7 @@ 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 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 beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. + 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 beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. @@ -8480,21 +8587,21 @@ 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 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 bromine chloride is BrCl. + 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 bromine chloride is BrCl. 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 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 bromine monoxide is BrO. + 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 bromine monoxide is BrO. 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 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 bromine nitrate is BrONO2. + 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 bromine nitrate is BrONO2. @@ -8508,7 +8615,7 @@ 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 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 butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. @@ -8529,7 +8636,7 @@ 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 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 carbon dioxide is CO2. + 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 carbon dioxide is CO2. @@ -8564,14 +8671,14 @@ 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 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 monoxide is CO. + 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 monoxide is CO. 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 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. + 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. @@ -8627,21 +8734,21 @@ 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 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 chlorine dioxide is OClO. + 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 chlorine dioxide is OClO. 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 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 chlorine monoxide is ClO. + 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 chlorine monoxide is ClO. 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 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 chlorine nitrate is ClONO2. + 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 chlorine nitrate is ClONO2. @@ -8662,7 +8769,7 @@ 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 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. + '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. @@ -8711,7 +8818,7 @@ 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 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. + 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'. 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. @@ -8746,7 +8853,7 @@ 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 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". Cobalt means cobalt in all chemical forms, commonly referred to as "total cobalt". "Sea floor sediment" is sediment deposited at the sea bed. + "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". Cobalt means cobalt in all chemical forms, commonly referred to as "total cobalt". "Sea floor sediment" is sediment deposited at the sea bed. @@ -8809,21 +8916,21 @@ 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 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 dichlorine peroxide is Cl2O2. + 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 dichlorine peroxide is Cl2O2. 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 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 dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. + 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 dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. 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 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. + 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. @@ -8886,28 +8993,28 @@ 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 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 ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the 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 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 ethanol is C2H5OH. + 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 ethanol is C2H5OH. 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 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 ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. + 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 ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the 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 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 ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. + 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 ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. @@ -8928,14 +9035,14 @@ 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 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 formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. + 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 formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. 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 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. + 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. @@ -8949,14 +9056,14 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s) in a salt or to other atom(s) in a molecule. + 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'. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s) in a salt or to other atom(s) in a molecule. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for mercury is Hg. + 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 symbol for mercury is Hg. @@ -8998,14 +9105,14 @@ 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 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 HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. + 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 HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. 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 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 HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. + 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 HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. @@ -9019,42 +9126,42 @@ 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 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 hexachlorobiphenyl is C12H4Cl6. This structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. + 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 hexachlorobiphenyl is C12H4Cl6. This structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. + 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'. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. 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 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 hydrogen bromide is HBr. + 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 hydrogen bromide is HBr. 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 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 hydrogen chloride is HCl. + 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 hydrogen chloride is HCl. 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 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 hydrogen cyanide is HCN. + 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 hydrogen cyanide is HCN. 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 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 hydrogen peroxide is H2O2. + 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 hydrogen peroxide is H2O2. @@ -9075,14 +9182,14 @@ 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 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 hypobromous acid is HOBr. + 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 hypobromous acid is HOBr. 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 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 hypochlorous acid is HOCl. + 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 hypochlorous acid is HOCl. @@ -9103,7 +9210,7 @@ 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 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'. 'Inorganic nitrogen' describes a family of chemical species which, in an ocean model, usually includes nitrite, nitrate and ammonium which act as nitrogen nutrients. 'Inorganic nitrogen' is the term used in standard names for all species belonging to the family 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. + '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'. 'Inorganic nitrogen' describes a family of chemical species which, in an ocean model, usually includes nitrite, nitrate and ammonium which act as nitrogen nutrients. 'Inorganic nitrogen' is the term used in standard names for all species belonging to the family 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. @@ -9180,35 +9287,35 @@ 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 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 methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the 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 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 methanol is CH3OH. + 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 methanol is CH3OH. 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 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 methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. + 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 methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. 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 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 methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. + 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 methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. 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 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 methyl hydroperoxide is CH3OOH. + 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 methyl hydroperoxide is CH3OOH. @@ -9236,7 +9343,7 @@ 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 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. + 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. @@ -9278,7 +9385,7 @@ 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 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 nitric acid is HNO3. + 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 nitric acid is HNO3. @@ -9292,7 +9399,7 @@ 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 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 nitrogen dioxide is NO2. + 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 nitrogen dioxide is NO2. @@ -9306,21 +9413,21 @@ 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 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 nitrogen monoxide is NO. + 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 nitrogen monoxide is NO. 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 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 nitrous acid is HNO2. + 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 nitrous acid is HNO2. 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 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 nitrous oxide is N2O. + 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 nitrous oxide is N2O. @@ -9334,14 +9441,14 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. + 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'. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. + 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'. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. @@ -9383,21 +9490,21 @@ 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 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. Organic detritus are particles of debris from decaying plants and animals. + 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 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. Organic detritus are particles of debris from decaying plants and animals. 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 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. Organic detritus are particles of debris from decaying plants and animals. + 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 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. Organic detritus are particles of debris from decaying plants and animals. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Oxygenated" means containing oxygen. "Hydrocarbon" means a compound containing hydrogen and carbon. + 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'. "Oxygenated" means containing oxygen. "Hydrocarbon" means a compound containing hydrogen and carbon. @@ -9411,7 +9518,7 @@ 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 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. + 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 ozone is O3. @@ -9432,14 +9539,14 @@ 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 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 peroxyacetyl nitrate, sometimes referred to as PAN, is CH3COO2NO2. The IUPAC name for peroxyacetyl_nitrate is nitroethaneperoxoate. + 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 peroxyacetyl nitrate, sometimes referred to as PAN, is CH3COO2NO2. The IUPAC name for peroxyacetyl_nitrate is nitroethaneperoxoate. 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 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 peroxynitric acid, sometimes referred to as PNA, is HO2NO2. + 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 peroxynitric acid, sometimes referred to as PNA, is HO2NO2. @@ -9481,7 +9588,7 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. @@ -9512,6 +9619,69 @@ 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. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. To specify the relative humidity and temperature at which the particle size applies, provide scalar coordinate variables with the standard names of, respectively, "relative_humidity" and "air_temperature." + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for ammonium is NH4+. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the bromide anion is Br-. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the calcium dication is Ca(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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for chloride is Cl-. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the magnesium dication is Mg(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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for methanesulfonic acid is CH3SO3H. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the nitrate anion is NO3-. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the oxalate dianion is C2O4(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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the potassium cation is K+. + + kg m-3 @@ -9526,6 +9696,20 @@ 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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the sodium cation is Na+. + + + + 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". "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. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The chemical formula for the sulfate anion is SO4(2-). + + kg m-3 @@ -9579,21 +9763,21 @@ 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 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 propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the 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 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 propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. + 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 propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for radon is Rn. + 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 symbol for radon is Rn. @@ -9628,7 +9812,7 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. @@ -9656,21 +9840,21 @@ 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 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 sulfur dioxide is SO2. + 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 sulfur dioxide is SO2. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. + 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'. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. @@ -9712,14 +9896,14 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. 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 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. + 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. @@ -9929,49 +10113,49 @@ 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic acid. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic acid. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for aceto-nitrile is CH3CN. The IUPAC name for aceto-nitrile is ethanenitrile. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for aceto-nitrile is CH3CN. The IUPAC name for aceto-nitrile is ethanenitrile. 1 - Mass fraction is used in the construction mass_fraction_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'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. + Mass fraction is used in the construction mass_fraction_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'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. 1 - Mass fraction is used in the construction mass_fraction_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'. 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. + Mass fraction is used in the construction mass_fraction_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'. 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. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for alpha_hexachlorocyclohexane is C6H6Cl6. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for alpha_hexachlorocyclohexane is C6H6Cl6. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for ammonia is NH3. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for ammonia is NH3. @@ -9992,42 +10176,42 @@ 1 - Mass fraction is used in the construction mass_fraction_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'. Aromatic compounds in organic chemistry are compounds that contain at least one benzene ring of six carbon atoms joined by alternating single and double covalent bonds. The simplest aromatic compound is benzene itself. In standard names "aromatic_compounds" is the term used to describe the group of aromatic chemical species 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 aromatic species, e.g. benzene and xylene. + Mass fraction is used in the construction mass_fraction_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'. Aromatic compounds in organic chemistry are compounds that contain at least one benzene ring of six carbon atoms joined by alternating single and double covalent bonds. The simplest aromatic compound is benzene itself. In standard names "aromatic_compounds" is the term used to describe the group of aromatic chemical species 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 aromatic species, e.g. benzene and xylene. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic bromine is Br. + Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic bromine is Br. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic chlorine is Cl. + Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic chlorine is Cl. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic nitrogen is N. + Mass fraction is used in the construction mass_fraction_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'. The chemical symbol for atomic nitrogen is N. 1 - Mass fraction is used in the construction mass_fraction_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'. 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. + Mass fraction is used in the construction mass_fraction_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'. 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. 1 - Mass fraction is used in the construction mass_fraction_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'. The chemical formula for beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. + Mass fraction is used in the construction mass_fraction_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'. The chemical formula for beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. @@ -10167,7 +10351,7 @@ 1 - Mass fraction is used in the construction mass_fraction_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'. 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 which gives the green pigment and a side chain whose structure varies. Chlorophyll-a is the most commonly occurring form of natural chlorophyll. + Mass fraction is used in the construction mass_fraction_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'. 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 which gives the green pigment and a side chain whose structure varies. Chlorophyll-a is the most commonly occurring form of natural chlorophyll. @@ -10342,7 +10526,7 @@ 1 - "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. + "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. @@ -10895,7 +11079,7 @@ 1 - Mass fraction is used in the construction mass_fraction_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). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. + Mass fraction is used in the construction mass_fraction_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). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. @@ -10937,7 +11121,7 @@ 1 - "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. + "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. @@ -10972,7 +11156,7 @@ 1 - "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. + "Mass fraction" is used in the construction "mass_fraction_of_X_in_Y'', where X is a material constituent of Y. It is evaluated as the mass of X divided by the mass of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Grain-size class distribution is based on the Udden-Wentworth scale. @@ -11112,21 +11296,21 @@ 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Middle type clouds are: Altostratus, Altocumulus, Nimbostratus. X_type_cloud_area_fraction is generally determined on the basis of cloud type, though Numerical Weather Prediction (NWP) models often calculate them based on the vertical location of the cloud. For the cloud area fraction between specified levels in the atmosphere, standard names including "cloud_area_fraction_in_atmosphere_layer" are used. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. Cloud area fraction is also called "cloud amount" and "cloud cover". m - Depth is the vertical distance below the surface. 'Undersaturation' means that a solution is unsaturated with respect to a solute. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. The "minimum depth of undersaturation", sometimes called the "saturation horizon", is the shallowest depth at which a body of water is an undersaturated solution of a named solute. + Depth is the vertical distance below the surface. 'Undersaturation' means that a solution is unsaturated with respect to a solute. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. The "minimum depth of undersaturation", sometimes called the "saturation horizon", is the shallowest depth at which a body of water is an undersaturated solution of a named solute. m - Depth is the vertical distance below the surface. 'Undersaturation' means that a solution is unsaturated with respect to a solute. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. The "minimum depth of undersaturation", sometimes called the "saturation horizon", is the shallowest depth at which a body of water is an undersaturated solution of a named solute. + Depth is the vertical distance below the surface. 'Undersaturation' means that a solution is unsaturated with respect to a solute. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. The "minimum depth of undersaturation", sometimes called the "saturation horizon", is the shallowest depth at which a body of water is an undersaturated solution of a named solute. @@ -11416,6 +11600,27 @@ The modified Fosberg Fire Weather Index (mFFWI) is a measure of the potential effect of weather conditions on wildland fire. The Fosberg Fire Weather Index is a function of temperature, wind, and humidity. It is modified with a fuel availability factor based on the Keetch Byram Drought Index. + + 1 + + + The MODIS cloud area fraction is diagnosed from atmosphere model output by the MODIS simulator software in such a way as to be comparable with the observational diagnostics of MODIS (Moderate Resolution Imaging Spectroradiometer). Cloud area fraction is also called “cloud amount” and “cloud cover.” As seen from above, mean fraction of grid column occupied by cloud of optical depths and heights specified by the tau and pressure intervals given above. Dimensions of the histogram are cloud top pressure and cloud optical depth. To distinguish that these are cloud area fractions as seen by a specific satellite instrument simulator, not the same as cloud area fractions diagnosed by the native model, the prefix format of satellite name_ is employed. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. + + + + 1 + + + Ice means ice-topped clouds, as seen by the MODIS simulator. To distinguish that these are cloud area fractions as seen by a specific satellite instrument simulator, not the same as cloud area fractions diagnosed by the native model, the prefix format of satellite name_ is employed. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. + + + + 1 + + + Liquid means liquid-topped clouds, as seen by the MODIS simulator. To distinguish that these are cloud area fractions as seen by a specific satellite instrument simulator, not the same as cloud area fractions diagnosed by the native model, the prefix format of satellite name_ is employed. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. + + kg m-2 @@ -11427,14 +11632,14 @@ 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 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 acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic acid. + 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 acetic_acid is CH3COOH. The IUPAC name for acetic acid is ethanoic acid. 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 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. + 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. @@ -11448,21 +11653,21 @@ 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 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 alpha_hexachlorocyclohexane is C6H6Cl6. + 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 alpha_hexachlorocyclohexane is C6H6Cl6. 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 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 alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. + 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 alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. 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 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 ammonia is NH3. + 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 ammonia is NH3. @@ -11483,7 +11688,7 @@ 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'.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. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. + 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 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. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. @@ -11497,21 +11702,21 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic bromine is Br. + 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 symbol for atomic bromine is Br. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic chlorine is Cl. + 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 symbol for atomic chlorine is Cl. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for atomic nitrogen is N. + 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 symbol for atomic nitrogen is N. @@ -11525,14 +11730,14 @@ 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 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. + 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 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. 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 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 beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. + 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 beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. @@ -11560,21 +11765,21 @@ 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 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 bromine chloride is BrCl. + 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 bromine chloride is BrCl. 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 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 bromine monoxide is BrO. + 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 bromine monoxide is BrO. 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 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 bromine nitrate is BrONO2. + 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 bromine nitrate is BrONO2. @@ -11588,7 +11793,7 @@ 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 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 butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. @@ -11602,7 +11807,7 @@ 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'.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. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. + 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 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. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. @@ -11651,14 +11856,14 @@ 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 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 carbon dioxide is CO2. + 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 carbon dioxide is CO2. 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 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 monoxide is CO. + 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 of carbon monoxide is CO. @@ -11728,21 +11933,21 @@ 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 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 chlorine dioxide is OClO. + 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 chlorine dioxide is OClO. 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 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 chlorine monoxide is ClO. + 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 chlorine monoxide is ClO. 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 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 chlorine nitrate is ClONO2. + 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 chlorine nitrate is ClONO2. @@ -11756,7 +11961,7 @@ 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'.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. Diatoms are single-celled phytoplankton with an external skeleton made of silica.Phytoplankton are autotrophic prokaryotic or eukaryotic algae that live near the water surface where there is sufficient light to support photosynthesis. + 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 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. Diatoms are single-celled phytoplankton with an external skeleton made of silica.Phytoplankton are autotrophic prokaryotic or eukaryotic algae that live near the water surface where there is sufficient light to support photosynthesis. @@ -11777,14 +11982,14 @@ 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 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 dichlorine peroxide is Cl2O2. + 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 dichlorine peroxide is Cl2O2. 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 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 dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. + 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 dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. @@ -11798,7 +12003,7 @@ 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 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. + 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 dinitrogen pentoxide is N2O5. @@ -11917,14 +12122,14 @@ 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 carbon" describes a family of chemical species and is the term used in standard names for all species belonging to the family 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. "Sea floor sediment" is sediment deposited at the sea bed. "Water" means water in all phases. + "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 carbon" describes a family of chemical species and is the term used in standard names for all species belonging to the family 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. "Sea floor sediment" is sediment deposited at the sea bed. "Water" means water in all phases. 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 carbon" describes a family of chemical species and is the term used in standard names for all species belonging to the family 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. + "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 carbon" describes a family of chemical species and is the term used in standard names for all species belonging to the family 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. @@ -11952,21 +12157,21 @@ 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 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 ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes.There are standard names for the alkane group as well as for some of the individual species. + 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 ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes.There are standard names for the alkane group as well as for some of the individual species. 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 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 ethanol is C2H5OH. + 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 ethanol is C2H5OH. 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 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 ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes.There are standard names for the alkene group as well as for some of the individual species. + 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 ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes.There are standard names for the alkene group as well as for some of the individual species. @@ -11980,28 +12185,28 @@ 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 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 formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. + 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 formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. 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 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. + 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 formic acid is HCOOH. The IUPAC name for formic acid is methanoic acid. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s)in a salt or to other atom(s) in a molecule. + 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'. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s)in a salt or to other atom(s) in a molecule. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for mercury is Hg. + 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 symbol for mercury is Hg. @@ -12050,14 +12255,14 @@ 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 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 HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. + 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 HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. 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 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 HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. + 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 HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. @@ -12071,42 +12276,42 @@ 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 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 hexachlorobiphenyl is C12H4Cl6. This structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. + 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 hexachlorobiphenyl is C12H4Cl6. This structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. + 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'. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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 - 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 hydrogen bromide is HBr. + 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 hydrogen bromide is HBr. 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 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 hydrogen chloride is HCl. + 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 hydrogen chloride is HCl. 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 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 hydrogen cyanide is HCN. + 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 hydrogen cyanide is HCN. 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 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 hydrogen peroxide is H2O2. + 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 hydrogen peroxide is H2O2. @@ -12134,14 +12339,14 @@ 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 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 hypobromous acid is HOBr. + 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 hypobromous acid is HOBr. 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 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 hypochlorous acid is HOCl. + 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 hypochlorous acid is HOCl. @@ -12176,49 +12381,49 @@ 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 Xis 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 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. Mesozooplankton are zooplankton ranging between 20 micrometers and 200 micrometers in size. + 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 Xis 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 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. Mesozooplankton are zooplankton ranging between 20 micrometers and 200 micrometers in size. 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 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 in terms of B alone, neglecting all other chemical constituents of A. + 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 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 in terms of B alone, neglecting all other chemical constituents of A. 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 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 methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. 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 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 methanol is CH3OH. + 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 methanol is CH3OH. 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 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 methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. + 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 methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. 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 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 methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. + 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 methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. 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 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 methyl hydroperoxide is CH3OOH. + 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 methyl hydroperoxide is CH3OOH. @@ -12232,14 +12437,14 @@ 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 Xis 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 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. Microzooplankton are zooplankton of less than 20 micrometers in size. + 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 Xis 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 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. Microzooplankton are zooplankton of less than 20 micrometers in size. 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 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 in terms of B alone, neglecting all other chemical constituents of A. + 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 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 in terms of B alone, neglecting all other chemical constituents of A. @@ -12260,14 +12465,14 @@ 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 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. + 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 molecular hydrogen is H2. 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 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 the nitrate anion is NO3-. The chemical formula for the nitrite anion is NO2-. + 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 the nitrate anion is NO3-. The chemical formula for the nitrite anion is NO2-. @@ -12288,7 +12493,7 @@ 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 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 nitric acid is HNO3. + 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 nitric acid is HNO3. @@ -12302,35 +12507,35 @@ 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 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 the nitrite anion is NO2-. + 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 the nitrite anion is NO2-. 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 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 nitrogen dioxide is NO2. + 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 nitrogen dioxide is NO2. 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 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 nitrogen monoxide is NO. + 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 nitrogen monoxide is NO. 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 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 nitrous acid is HNO2. + 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 nitrous acid is HNO2. 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 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 nitrous oxide is N2O. + 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 nitrous oxide is N2O. @@ -12358,28 +12563,28 @@ 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'.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. Organic detritus are particles of debris from decaying plants and animals. + 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 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. Organic detritus are particles of debris from decaying plants and animals. 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 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. Organic detritus are particles of debris from decaying plants and animals. + 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 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. Organic detritus are particles of debris from decaying plants and animals. 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 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. Organic detritus are particles of debris from decaying plants and animals. + 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 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. Organic detritus are particles of debris from decaying plants and animals. 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 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. + 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. @@ -12505,14 +12710,14 @@ 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 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 peroxynitric acid, sometimes referred to as PNA, is HO2NO2. + 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 peroxynitric acid, sometimes referred to as PNA, is HO2NO2. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. @@ -12557,6 +12762,34 @@ 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 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. Picophytoplankton are phytoplankton of less than 2 micrometers in size. Phytoplankton are algae that grow where there is sufficient light to support photosynthesis. + + mol m-3 + + + "Mole concentration" means the 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". "Dissolved inorganic carbon-13" is the sum of CO3_13C, HCO3_13C and H2CO3_13C. The subduction and subsequent transport of surface water carry into the interior ocean considerable quantities of dissolved inorganic carbon-13, which is entirely independent of biological activity (such as organic decomposition and oxidation) after the water leaves the sea surface. Such dissolved inorganic carbon-13 is termed “preformed” dissolved inorganic carbon-13 (Redfield,1942). + + + + mol m-3 + + + "Mole concentration" means the 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". "Dissolved inorganic carbon" is the sum of CO3, HCO3 and H2CO3. The subduction and subsequent transport of surface water carry into the interior ocean considerable quantities of dissolved inorganic carbon, which is entirely independent of biological activity (such as organic decomposition and oxidation) after the water leaves the sea surface. Such dissolved inorganic carbon is termed “preformed” dissolved inorganic carbon (Redfield,1942). + + + + mol m-3 + + + "Mole concentration" means the 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". "Dissolved inorganic phosphorus" means the sum of all inorganic phosphorus in solution (including phosphate, hydrogen phosphate, dihydrogen phosphate, and phosphoric acid). The subduction and subsequent transport of surface water carry into the interior ocean considerable quantities of nutrients, which are entirely independent of biological activity (such as organic decomposition and oxidation) after the water leaves the sea surface. Such nutrients are termed “preformed” nutrients (Redfield,1942). + + + + mol m-3 + + + "Mole concentration" means the 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 subduction and subsequent transport of surface water carry into the interior ocean considerable quantities of dissolved oxygen, which are entirely independent of biological activity (such as organic decomposition and oxidation) after the water leaves the sea surface. Such dissolved oxygen is termed “preformed” dissolved oxygen (Redfield,1942). + + mol m-3 @@ -12568,21 +12801,21 @@ 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 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 propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + 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 propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. 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 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 propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. + 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 propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for radon is Rn. + 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 symbol for radon is Rn. @@ -12596,7 +12829,7 @@ 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 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 sulfur dioxide is SO2. + 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 sulfur dioxide is SO2. @@ -12617,14 +12850,14 @@ 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 denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. + 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'. 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 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. + 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 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. @@ -12708,7 +12941,7 @@ 1 - Mole fraction is used in the construction mole_fraction_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'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. + Mole fraction is used in the construction mole_fraction_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'. Alkanes are saturated hydrocarbons, i.e. they do not contain any chemical double bonds. Alkanes contain only hydrogen and carbon combined in the general proportions C(n)H(2n+2); "alkanes" 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 alkane species, e.g., methane and ethane. @@ -13296,7 +13529,7 @@ 1 - Mole fraction is used in the construction mole_fraction_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 hydrogen sulfide is H2S. + Mole fraction is used in the construction mole_fraction_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 hydrogen sulfide is H2S. @@ -14049,6 +14282,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 100 hour fuel moisture (FM100) represents the modeled moisture content of dead fuels in the 1 to 3 inch diameter class. It can also be used as a very rough estimate of the average moisture content of the forest floor from three-fourths inch to 4 inches below the surface. The 100-hour timelag fuel moisture is a function of length of day (as influenced by latitude and calendar date), maximum and minimum temperature and relative humidity, and precipitation duration in the previous 24 hours. It is a component in the US National Fire Danger Rating System. The US National Fire Danger Rating System comprises several numeric indexes that rate the potential over a large area for wildland fires to ignite, spread, and require action to suppress or manage. It was designed for use in the continental United States, and all its components are relative, not absolute. + + % + + + 10 hour fuel moisture (FM10) represents the modeled moisture content of dead fuels consisting of roundwood in the size range of one quarter to 1 inch in diameter and very roughly, the layer of litter extending from just below the surface to three-quarters of inch below the surface. The 10-hour timelag fuel moisture is a function of length of day (as influenced by latitude and calendar date), daily downwelling shortwave radiation, daily maximum temperature and minimum relative humidity, and daily precipitation values. It is a component in the US National Fire Danger Rating System (cf. https://www.bia.gov/sites/default/files/dup/assets/public/pdf/idc-020513.pdf). The US National Fire Danger Rating System comprises several numeric indexes that rate the potential over a large area for wildland fires to ignite, spread, and require action to suppress or manage. It was designed for use in the continental United States, and all its components are relative, not absolute. + + + + % + + + 1 hour fuel moisture (FM1) represents the modeled moisture content of dead fuels consisting of herbaceous plants or roundwood less than one-quarter inch in diameter. It also includes the uppermost layer of litter on the forest floor. The 1-hour timelag fuel moisture is a function of length of day (as influenced by latitude and calendar date), daily downwelling shortwave radiation, daily maximum temperature and minimum relative humidity, and daily precipitation values. It is a component in the US National Fire Danger Rating System (cf. https://www.bia.gov/sites/default/files/dup/assets/public/pdf/idc-020513.pdf). The US National Fire Danger Rating System comprises several numeric indexes that rate the potential over a large area for wildland fires to ignite, spread, and require action to suppress or manage. It was designed for use in the continental United States, and all its components are relative, not absolute . + + 1 @@ -14410,7 +14657,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m - "Northward" indicates a vector component which is positive when directed northward (negative southward). "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. A northward displacement is the distance calculated from the change in a moving object's latitude between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "Northward" indicates a vector component which is positive when directed northward (negative southward). "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. A northward displacement is the distance calculated from the change in a moving object's latitude between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -14662,7 +14909,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. A variable whose standard name has the form number_of_days_with_X_below|above_threshold is a count of the number of days on which the condition X_below|above_threshold is satisfied. It must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_methods entry for within days which describes the processing of quantity X before the threshold is applied. A number_of_days is an extensive quantity in time, and the cell_methods entry for over days should be "sum". + The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The abbreviation "lwe" means liquid water equivalent. A variable whose standard name has the form number_of_days_with_X_below|above_threshold is a count of the number of days on which the condition X_below|above_threshold is satisfied. It must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_methods entry for within days which describes the processing of quantity X before the threshold is applied. A number_of_days is an extensive quantity in time, and the cell_methods entry for over days should be "sum". @@ -14749,6 +14996,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. See Appendix D of the CF convention for information about parametric vertical coordinates. + + m + + + Ocean dynamic sea level is the contribution to sea surface height variability made by processes other than astronomic forcing of the ocean and shallow water resonance of tidal components, or variations in air pressure. Sea surface height is a time-varying quantity. + + W @@ -15204,18 +15458,11 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. - - 1 - - - "X_volume_fraction" means the fraction of volume occupied by X. It is evaluated as the volume of interest divided by the grid cell volume. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A data variable with standard name ocean_volume_fraction is used to store the fraction of a grid cell underlying sea-water, for example, where part of the grid cell is occupied by land or to record ocean volume on a model's native grid following a regridding operation. - - m3 s-1 - Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. + Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. @@ -15313,7 +15560,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree_C - Perceived temperature (PT) is an equivalent air temperature of the actual thermal condition. It is the air temperature of a reference condition causing the same thermal perception in a human body considering air temperature, wind speed, humidity, solar and thermal radiation as well as clothing and activity level. It is not the perceived air temperature, that derives either from wind chill and heat index and has the standard_name apparent_air_temperature. + Perceived temperature (PT) is an equivalent air temperature of the actual thermal condition. It is the air temperature of a reference condition causing the same thermal perception in a human body considering air temperature, wind speed, humidity, solar and thermal radiation as well as clothing and activity level. It is not the perceived air temperature, that derives either from wind chill and heat index and has the standard_name apparent_air_temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -15327,7 +15574,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Permafrost is soil or rock that has remained at a temperature at or below zero degrees Celsius throughout the seasonal cycle for two or more years. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Permafrost is soil or rock that has remained at a temperature at or below zero degrees Celsius throughout the seasonal cycle for two or more years. @@ -15383,14 +15630,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree_C - Physiological equivalent temperature (PET) is an equivalent air temperature of the actual thermal condition. It is the air temperature of a reference condition without wind and solar radiation at which the heat budget of the human body is balanced with the same core and skin temperature. Note that PET here is not potential evapotranspiration. + Physiological equivalent temperature (PET) is an equivalent air temperature of the actual thermal condition. It is the air temperature of a reference condition without wind and solar radiation at which the heat budget of the human body is balanced with the same core and skin temperature. Note that PET here is not potential evapotranspiration. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). 1 - Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. + Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. @@ -15712,7 +15959,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree - Platform zenith angle is the the angle between the line of sight to the platform and the local zenith at the observation target. This angle is measured starting from directly overhead and its range is from zero (directly overhead the observation target) to 180 degrees (directly below the observation target). Local zenith is a line perpendicular to the Earth's surface at a given location. "Observation target" means a location on the Earth defined by the sensor performing the observations. A standard name also exists for sensor_zenith_angle. For some viewing geometries the sensor and the platform cannot be assumed to be close enough to neglect the difference in calculated zenith angle. A "platform" is a structure or vehicle that serves as a base for mounting sensors. Platforms include, but are not limited to, satellites, aeroplanes, ships, buoys, instruments, ground stations, and masts. + Platform zenith angle is the the angle between the line of sight to the platform and the local zenith at the observation target. This angle is measured starting from directly overhead and its range is from zero (directly overhead the observation target) to 180 degrees (directly below the observation target). Local zenith is a line perpendicular to the Earth's surface at a given location. "Observation target" means a location on the Earth defined by the sensor performing the observations. A standard name also exists for sensor_zenith_angle. For some viewing geometries the sensor and the platform cannot be assumed to be close enough to neglect the difference in calculated zenith angle. A "platform" is a structure or vehicle that serves as a base for mounting sensors. Platforms include, but are not limited to, satellites, aeroplanes, ships, buoys, instruments, ground stations, and masts. @@ -15740,49 +15987,49 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 61 - "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. + "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. kg m-2 s-1 59 pr - "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. kg m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "O" means the element "oxygen" and "17O" is the stable isotope "oxygen-17". + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "O" means the element "oxygen" and "17O" is the stable isotope "oxygen-17". kg m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "O" means the element "oxygen" and "18O" is the stable isotope "oxygen-18". + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "O" means the element "oxygen" and "18O" is the stable isotope "oxygen-18". kg m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "H" means the element "hydrogen" and "2H" is the stable isotope "hydrogen-2", usually called "deuterium". The construction "X_containing_single_Y" means the standard name refers to only that part of X composed of molecules containing a single atom of isotope Y. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The chemical formula for water is H2O. "H" means the element "hydrogen" and "2H" is the stable isotope "hydrogen-2", usually called "deuterium". The construction "X_containing_single_Y" means the standard name refers to only that part of X composed of molecules containing a single atom of isotope Y. kg m-2 s-1 prveg - "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. Previously, the qualifier where_type was used to specify that the quantity applies only to the part of the grid box of the named type. Names containing the where_type qualifier are deprecated and newly created data should use the cell_methods attribute to indicate the horizontal area to which the quantity applies. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. + "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. Previously, the qualifier where_type was used to specify that the quantity applies only to the part of the grid box of the named type. Names containing the where_type qualifier are deprecated and newly created data should use the cell_methods attribute to indicate the horizontal area to which the quantity applies. "Canopy" means the vegetative covering over a surface. The canopy is often considered to be the outer surfaces of the vegetation. Plant height and the distribution, orientation and shape of plant leaves within a canopy influence the atmospheric environment and many plant processes within the canopy. Reference: AMS Glossary http://glossary.ametsoc.org/wiki/Canopy. - A variable with the standard name predominant_precipitation_type_at_surface contains strings which indicate the character of the predominant precipitating hydrometeor at a location or grid cell. These strings have not yet been standardised. Alternatively, the data variable may contain integers which can be translated to strings using flag_values and flag_meanings attributes. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The surface called "surface" means the lower boundary of the atmosphere. + A variable with the standard name predominant_precipitation_type_at_surface contains strings which indicate the character of the predominant precipitating hydrometeor at a location or grid cell. These strings have not yet been standardised. Alternatively, the data variable may contain integers which can be translated to strings using flag_values and flag_meanings attributes. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The surface called "surface" means the lower boundary of the atmosphere. @@ -15803,28 +16050,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - "product_of_X_and_Y" means X*Y. "specific" means per unit mass. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. Specific humidity is the mass fraction of water vapor in (moist) air. + The phrase "product_of_X_and_Y" means X*Y. "specific" means per unit mass. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. Specific humidity is the mass fraction of water vapor in (moist) air. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). m s-1 - "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. K m s-1 - "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). + The phrase "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K m s-1 - "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.) + The phrase "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. "Eastward" indicates a vector component which is positive when directed eastward (negative westward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.) It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -15866,7 +16113,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K Pa s-1 mpwapta - The phrase "product_of_X_and_Y" means X*Y. The phrase "tendency_of_X" means derivative of X with respect to time. The Lagrangian tendency of a quantity is its rate of change following the motion of the fluid, also called the "material derivative" or "convective derivative". The Lagrangian tendency of air pressure, often called "omega", plays the role of the upward component of air velocity when air pressure is being used as the vertical coordinate. If the vertical air velocity is upwards, it is negative when expressed as a tendency of air pressure; downwards is positive. Air pressure is the force per unit area which would be exerted when the moving gas molecules of which the air is composed strike a theoretical surface of any orientation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The phrase "product_of_X_and_Y" means X*Y. The phrase "tendency_of_X" means derivative of X with respect to time. The Lagrangian tendency of a quantity is its rate of change following the motion of the fluid, also called the "material derivative" or "convective derivative". The Lagrangian tendency of air pressure, often called "omega", plays the role of the upward component of air velocity when air pressure is being used as the vertical coordinate. If the vertical air velocity is upwards, it is negative when expressed as a tendency of air pressure; downwards is positive. Air pressure is the force per unit area which would be exerted when the moving gas molecules of which the air is composed strike a theoretical surface of any orientation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -15887,21 +16134,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m s-1 - "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Northward" indicates a vector component which is positive when directed northward (negative southward). Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Northward" indicates a vector component which is positive when directed northward (negative southward). Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. K m s-1 - "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Northward" indicates a vector component which is positive when directed northward (negative southward). + The phrase "product_of_X_and_Y" means X*Y. A velocity is a vector quantity. "Northward" indicates a vector component which is positive when directed northward (negative southward). It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K m s-1 mpvta - "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. "Northward" indicates a vector component which is positive when directed northward (negative southward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.) + The phrase "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. "Northward" indicates a vector component which is positive when directed northward (negative southward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name upward_air_velocity.) It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -15936,7 +16183,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K m s-1 - "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. A velocity is a vector quantity. "Upward" indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. + The phrase "product_of_X_and_Y" means X*Y. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. A velocity is a vector quantity. "Upward" indicates a vector component which is positive when directed upward (negative downward). Upward air velocity is the vertical component of the 3D air velocity vector. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -15946,6 +16193,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. "product_of_X_and_Y" means X*Y. "specific" means per unit mass. A velocity is a vector quantity. "Upward" indicates a vector component which is positive when directed upward (negative downward). Specific humidity is the mass fraction of water vapor in (moist) air. Upward air velocity is the vertical component of the 3D air velocity vector. + + Pa m s-1 + + + The product of windspeed and vapor pressure deficit is referred to as the Hot-Dry-Windy Index (HDW) for interpreting fire weather. It is a fire weather index that indicates the influence that the atmosphere has on a fire through wind, heat, and moisture (cf. https://www.bia.gov/sites/default/files/dup/assets/public/pdf/idc-020513.pdf). The units of HDW do not have an established physical significance for fire processes. As a fire weather index, it should be expressed in units of hPa m s-1. + + radian @@ -18575,7 +18829,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s - The quantity with standard name radio_signal_roundtrip_travel_time_in_air is the time taken for an electromagnetic signal to propagate from an emitting instrument such as a radar or lidar to a reflecting volume and back again. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + Time it takes for a radio wave, that was transmitted by an instrument to propagate through the air to the volume of air where it is scattered and return back to an instrument. The "instrument" (examples are radar and lidar) is the device used to make the observation. The "scatterers" are what causes the transmitted signal to be returned to the instrument (examples are aerosols, hydrometeors and refractive index irregularities in the air). A standard name referring to time taken for a radio signal to propagate from the emitting instrument to a scattering volume and back to an instrument. @@ -18620,6 +18874,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. + + 1 + + + Rank of the matrix representing the logarithmic scale remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (fractional changes of methane in the retrieved atmosphere relative to the fractional changes of methane in the true atmosphere, Rodgers 2000; Keppens et al., 2015). + + + + 1 + + + Rank the matrix representing the remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + 1 @@ -18645,7 +18913,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K s-1 - The quantity with standard name ratio_of_sea_water_potential_temperature_anomaly_to_relaxation_timescale is a correction term applied to modelled sea water potential temperature. The term is estimated as the deviation of model local sea water potential temperature from an observation-based climatology (e.g. World Ocean Database) weighted by a user-specified relaxation coefficient in s-1 (1/(relaxation timescale)). Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The phrase "ratio_of_X_to_Y" means X/Y. The term "anomaly" means difference from climatology. + The quantity with standard name ratio_of_sea_water_potential_temperature_anomaly_to_relaxation_timescale is a correction term applied to modelled sea water potential temperature. The term is estimated as the deviation of model local sea water potential temperature from an observation-based climatology (e.g. World Ocean Database) weighted by a user-specified relaxation coefficient in s-1 (1/(relaxation timescale)). Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The phrase "ratio_of_X_to_Y" means X/Y. The term "anomaly" means difference from climatology. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -18687,7 +18955,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W - The quantity with standard name received_power_of_radio_wave_in_air_scattered_by_air refers to the received power of the signal at an instrument such as a radar or lidar. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + Power of a radio wave, that was transmitted by an instrument and propagates in the air where it's scattered by the air due to which its properties change, and it is received again by an instrument. The "instrument" (examples are radar and lidar) is the device used to make the observation. The "scatterers" are what causes the transmitted signal to be returned to the instrument (examples are aerosols, hydrometeors and refractive index irregularities in the air). A standard name referring to the received power of the signal at the instrument. + + + + W + + + The "instrument" (examples are radar and lidar) is the device used to make the observation. The "scatterers" are what causes the transmitted signal to be returned to the instrument (examples are aerosols, hydrometeors and refractive index irregularities), of whatever kind the instrument detects. A standard name referring to the recieved power of the signal at the instrument. @@ -18704,6 +18979,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The period of time over which a parameter has been summarised (usually by averaging) in order to provide a reference (baseline) against which data has been compared. When a coordinate, scalar coordinate, or auxiliary coordinate variable with this standard name has bounds, then the bounds specify the beginning and end of the time period over which the reference was determined. If the reference represents an instant in time, rather than a period, then bounds may be omitted. It is not the time for which the actual measurements are valid; the standard name of time should be used for that. + + mol/mol + + + This ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. + + Pa @@ -18753,6 +19035,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. relative_sensor_azimuth_angle is the difference between the viewing geometries from two different sensors over the same observation target. It is the difference between the values of two quantities with standard name sensor_azimuth_angle. There is no standardized sign convention for relative_sensor_azimuth_angle. "Observation target" means a location on the Earth defined by the sensor performing the observations. A standard name also exists for relative_platform_azimuth_angle, where "platform" refers to the vehicle from which observations are made e.g. aeroplane, ship, or satellite. For some viewing geometries the sensor and the platform cannot be assumed to be close enough to neglect the difference in calculated azimuth angle. + + 1 + + + Logarithmic scale averaging kernels of the methane mole fractions obtained by a remote sensing observation (Rodgers, 2020). These kernels are also called fractional averaging kernels (Keppens et al., 2015) They represent the fractional changes of methane in the retrieved atmosphere relative to the fractional changes of methane in the true atmosphere. + + + + 1 + + + Averaging kernels of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + 1 @@ -18760,6 +19056,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Richardson number is a measure of dynamic stability and can be used to diagnose the existence of turbulent flow. It is defined as the ratio of the buoyant suppression of turbulence (i.e. how statically stable or unstable the conditions are) to the kinetic energy available to generate turbulence in a shear flow. + + 1 + + + Right singular vectors of the matrix representing the logarithmic scale remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000; Keppens et al., 2015). + + + + 1 + + + Right singular vectors of the matrix representing the remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + m @@ -18848,7 +19158,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. @@ -18911,7 +19221,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - The albedo of sea ice. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + The albedo of sea ice. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -18939,14 +19249,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 91 sic - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. m2 s-1 - Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -18967,7 +19277,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The standard name sea_ice_basal_temperature means the temperature of the sea ice at its lower boundary. + "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The standard name sea_ice_basal_temperature means the temperature of the sea ice at its lower boundary. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19030,7 +19340,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1e-3 - Sea ice salinity is the salt content of sea ice, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + Sea ice salinity is the salt content of sea ice, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -19044,14 +19354,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The surface temperature is the (skin) temperature at the interface, not the bulk temperature of the medium above or below. "Sea ice surface temperature" is the temperature that exists at the interface of sea ice and an overlying medium which may be air or snow. In areas of snow covered sea ice, sea_ice_surface_temperature is not the same as the quantity with standard name surface_temperature. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + The surface temperature is the (skin) temperature at the interface, not the bulk temperature of the medium above or below. "Sea ice surface temperature" is the temperature that exists at the interface of sea ice and an overlying medium which may be air or snow. In areas of snow covered sea ice, sea_ice_surface_temperature is not the same as the quantity with standard name surface_temperature. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Sea ice temperature is the bulk temperature of the sea ice, not the surface (skin) temperature. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + Sea ice temperature is the bulk temperature of the sea ice, not the surface (skin) temperature. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19072,7 +19382,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg s-1 - Transport across_line means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + Transport across_line means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -19086,14 +19396,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m - "x" indicates a vector component along the grid x-axis, positive with increasing x. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. An x displacement is calculated from the difference in the moving object's grid x coordinate between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "x" indicates a vector component along the grid x-axis, positive with increasing x. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. An x displacement is calculated from the difference in the moving object's grid x coordinate between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. N m-2 - "x" indicates a vector component along the grid x-axis, positive with increasing x. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In meteorology and oceanography, the Coriolis effect per unit mass arises solely from the earth's rotation and acts as a deflecting force, normal to the velocity, to the right of the motion in the Northern Hemisphere and to the left in the Southern Hemisphere. Reference: American Meteorological Society Glossary http://glossary.ametsoc.org/wiki/Coriolis_force. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "x" indicates a vector component along the grid x-axis, positive with increasing x. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In meteorology and oceanography, the Coriolis effect per unit mass arises solely from the earth's rotation and acts as a deflecting force, normal to the velocity, to the right of the motion in the Northern Hemisphere and to the left in the Southern Hemisphere. Reference: American Meteorological Society Glossary http://glossary.ametsoc.org/wiki/Coriolis_force. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -19128,14 +19438,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m - "y" indicates a vector component along the grid y-axis, positive with increasing y. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. A y displacement is calculated from the difference in the moving object's grid y coordinate between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "y" indicates a vector component along the grid y-axis, positive with increasing y. "Displacement" means the change in geospatial position of an object that has moved over time. If possible, the time interval over which the motion took place should be specified using a bounds variable for the time coordinate variable. A displacement can be represented as a vector. Such a vector should however not be interpreted as describing a rectilinear, constant speed motion but merely as an indication that the start point of the vector is found at the tip of the vector after the time interval associated with the displacement variable. A displacement does not prescribe a trajectory. Sea ice displacement can be defined as a two-dimensional vector, with no vertical component. A y displacement is calculated from the difference in the moving object's grid y coordinate between the start and end of the time interval associated with the displacement variable. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. N m-2 - "y" indicates a vector component along the grid y-axis, positive with increasing y. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In meteorology and oceanography, the Coriolis effect per unit mass arises solely from the earth's rotation and acts as a deflecting force, normal to the velocity, to the right of the motion in the Northern Hemisphere and to the left in the Southern Hemisphere. Reference: American Meteorological Society Glossary http://glossary.ametsoc.org/wiki/Coriolis_force. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + "y" indicates a vector component along the grid y-axis, positive with increasing y. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In meteorology and oceanography, the Coriolis effect per unit mass arises solely from the earth's rotation and acts as a deflecting force, normal to the velocity, to the right of the motion in the Northern Hemisphere and to the left in the Southern Hemisphere. Reference: American Meteorological Society Glossary http://glossary.ametsoc.org/wiki/Coriolis_force. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. @@ -19191,7 +19501,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The sea surface foundation temperature is the water temperature that is not influenced by a thermally stratified layer of diurnal temperature variability (either by daytime warming or nocturnal cooling). The foundation temperature is named to indicate that it is the temperature from which the growth of the diurnal thermocline develops each day, noting that on some occasions with a deep mixed layer there is no clear foundation temperature in the surface layer. In general, sea surface foundation temperature will be similar to a night time minimum or pre-dawn value at depths of between approximately 1 and 5 meters. In the absence of any diurnal signal, the foundation temperature is considered equivalent to the quantity with standard name sea_surface_subskin_temperature. The sea surface foundation temperature defines a level in the upper water column that varies in depth, space, and time depending on the local balance between thermal stratification and turbulent energy and is expected to change slowly over the course of a day. If possible, a data variable with the standard name sea_surface_foundation_temperature should be used with a scalar vertical coordinate variable to specify the depth of the foundation level. Sea surface foundation temperature is measured at the base of the diurnal thermocline or as close to the water surface as possible in the absence of thermal stratification. Only in situ contact thermometry is able to measure the sea surface foundation temperature. Analysis procedures must be used to estimate sea surface foundation temperature value from radiometric satellite measurements of the quantities with standard names sea_surface_skin_temperature and sea_surface_subskin_temperature. Sea surface foundation temperature provides a connection with the historical concept of a "bulk" sea surface temperature considered representative of the oceanic mixed layer temperature that is typically represented by any sea temperature measurement within the upper ocean over a depth range of 1 to approximately 20 meters. The general term, "bulk" sea surface temperature, has the standard name sea_surface_temperature with no associated vertical coordinate axis. Sea surface foundation temperature provides a more precise, well defined quantity than "bulk" sea surface temperature and, consequently, is more representative of the mixed layer temperature. The temperature of sea water at a particular depth (other than the foundation level) should be reported using the standard name sea_water_temperature and, wherever possible, supplying a vertical coordinate axis or scalar coordinate variable. + The sea surface foundation temperature is the water temperature that is not influenced by a thermally stratified layer of diurnal temperature variability (either by daytime warming or nocturnal cooling). The foundation temperature is named to indicate that it is the temperature from which the growth of the diurnal thermocline develops each day, noting that on some occasions with a deep mixed layer there is no clear foundation temperature in the surface layer. In general, sea surface foundation temperature will be similar to a night time minimum or pre-dawn value at depths of between approximately 1 and 5 meters. In the absence of any diurnal signal, the foundation temperature is considered equivalent to the quantity with standard name sea_surface_subskin_temperature. The sea surface foundation temperature defines a level in the upper water column that varies in depth, space, and time depending on the local balance between thermal stratification and turbulent energy and is expected to change slowly over the course of a day. If possible, a data variable with the standard name sea_surface_foundation_temperature should be used with a scalar vertical coordinate variable to specify the depth of the foundation level. Sea surface foundation temperature is measured at the base of the diurnal thermocline or as close to the water surface as possible in the absence of thermal stratification. Only in situ contact thermometry is able to measure the sea surface foundation temperature. Analysis procedures must be used to estimate sea surface foundation temperature value from radiometric satellite measurements of the quantities with standard names sea_surface_skin_temperature and sea_surface_subskin_temperature. Sea surface foundation temperature provides a connection with the historical concept of a "bulk" sea surface temperature considered representative of the oceanic mixed layer temperature that is typically represented by any sea temperature measurement within the upper ocean over a depth range of 1 to approximately 20 meters. The general term, "bulk" sea surface temperature, has the standard name sea_surface_temperature with no associated vertical coordinate axis. Sea surface foundation temperature provides a more precise, well defined quantity than "bulk" sea surface temperature and, consequently, is more representative of the mixed layer temperature. The temperature of sea water at a particular depth (other than the foundation level) should be reported using the standard name sea_water_temperature and, wherever possible, supplying a vertical coordinate axis or scalar coordinate variable. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19254,7 +19564,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Tides are a significant contributor to the observed sea surface height; the pole tide occurs due to variations in the earth's rotation. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Tides are a significant contributor to the observed sea surface height; the pole tide occurs due to variations in the earth's rotation. @@ -19359,7 +19669,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1e-3 - Sea surface salinity is the salt content of sea water close to the sea surface, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. Sea surface salinity is often abbreviated as "SSS". For the salinity of sea water at a particular depth or layer, a data variable of "sea_water_salinity" or one of the more precisely defined salinities should be used with a vertical coordinate axis. There are standard names for the precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + Sea surface salinity is the salt content of sea water close to the sea surface, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. Sea surface salinity is often abbreviated as "SSS". For the salinity of sea water at a particular depth or layer, a data variable of "sea_water_salinity" or one of the more precisely defined salinities should be used with a vertical coordinate axis. There are standard names for the precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. @@ -19415,14 +19725,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The sea surface skin temperature is the temperature measured by an infrared radiometer typically operating at wavelengths in the range 3.7 - 12 micrometers. It represents the temperature within the conductive diffusion-dominated sub-layer at a depth of approximately 10 - 20 micrometers below the air-sea interface. Measurements of this quantity are subject to a large potential diurnal cycle including cool skin layer effects (especially at night under clear skies and low wind speed conditions) and warm layer effects in the daytime. + The sea surface skin temperature is the temperature measured by an infrared radiometer typically operating at wavelengths in the range 3.7 - 12 micrometers. It represents the temperature within the conductive diffusion-dominated sub-layer at a depth of approximately 10 - 20 micrometers below the air-sea interface. Measurements of this quantity are subject to a large potential diurnal cycle including cool skin layer effects (especially at night under clear skies and low wind speed conditions) and warm layer effects in the daytime. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The sea surface subskin temperature is the temperature at the base of the conductive laminar sub-layer of the ocean surface, that is, at a depth of approximately 1 - 1.5 millimeters below the air-sea interface. For practical purposes, this quantity can be well approximated to the measurement of surface temperature by a microwave radiometer operating in the 6 - 11 gigahertz frequency range, but the relationship is neither direct nor invariant to changing physical conditions or to the specific geometry of the microwave measurements. Measurements of this quantity are subject to a large potential diurnal cycle due to thermal stratification of the upper ocean layer in low wind speed high solar irradiance conditions. + The sea surface subskin temperature is the temperature at the base of the conductive laminar sub-layer of the ocean surface, that is, at a depth of approximately 1 - 1.5 millimeters below the air-sea interface. For practical purposes, this quantity can be well approximated to the measurement of surface temperature by a microwave radiometer operating in the 6 - 11 gigahertz frequency range, but the relationship is neither direct nor invariant to changing physical conditions or to the specific geometry of the microwave measurements. Measurements of this quantity are subject to a large potential diurnal cycle due to thermal stratification of the upper ocean layer in low wind speed high solar irradiance conditions. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19506,7 +19816,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any). More specific terms, namely sea_surface_skin_temperature, sea_surface_subskin_temperature, and surface_temperature are available for the skin, subskin, and interface temperature. respectively. For the temperature of sea water at a particular depth or layer, a data variable of sea_water_temperature with a vertical coordinate axis should be used. + Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any). More specific terms, namely sea_surface_skin_temperature, sea_surface_subskin_temperature, and surface_temperature are available for the skin, subskin, and interface temperature. respectively. For the temperature of sea water at a particular depth or layer, a data variable of sea_water_temperature with a vertical coordinate axis should be used. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19586,6 +19896,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The wave directional spectrum can be written as a five dimensional function S(t,x,y,f,theta) where t is time, x and y are horizontal coordinates (such as longitude and latitude), f is frequency and theta is direction. S has the standard name sea_surface_wave_directional_variance_spectral_density. S can be integrated over direction to give S1= integral(S dtheta) and this quantity has the standard name sea_surface_wave_variance_spectral_density. The quantity with standard name sea_surface_wave_energy_at_variance_spectral_density_maximum, sometimes called peak wave energy, is the maximum value of the variance spectral density (max(S1)). + + W m-1 + + + Wave energy flux, or wave power, is the average rate of transfer of wave energy through a vertical plane of unit width perpendicular to the direction of wave propagation. It should be understood as omnidirectional, or as the sum of all wave power components regardless of direction. In deep water conditions, the wave energy flux can be obtained with the water density, the wave significant height and the energy period. + + s-1 @@ -19642,6 +19959,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The trough is the lowest point of a wave. Trough depth is the vertical distance between the trough and the calm sea surface. Maximum trough depth is the maximum value measured during the observation period. + + degrees + + + The wave direction in each frequency band, calculated from the first-order components of the wave directional spectrum. The full directional wave spectrum is described as a Fourier series: S = a0/2 + a1cos(theta) + b1sin(theta) + a2cos(2theta) + b2sin(2theta). The Fourier coefficients a1, b1, a2, & b2 can be converted to polar coordinates as follows: R1 = (SQRT(a1a1+b1b1))/a0, R2 = (SQRT(a2a2+b2b2))/a0, ALPHA1 = 270.0-ARCTAN(b1,a1), ALPHA2 = 270.0-(0.5*ARCTAN(b2,a2)+{0 or 180, whichever minimizes the difference between ALPHA1 and ALPHA2}). ALPHA1 is the mean wave direction, which is determined from the first-order Fourier coefficients. This spectral parameter is a separate quantity from the bulk parameter (MWDIR), which has the standard name sea_surface_wave_from_direction_at_variance_spectral_density_maximum. The phrase "from_direction" is used in the construction X_from_direction and indicates the direction from which the velocity vector of X is coming. The direction is a bearing in the usual geographical sense, measured positive clockwise from due north. + + m @@ -19740,6 +20064,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Wave period of the highest wave is the period determined from wave crests corresponding to the greatest vertical distance above mean level during the observation period. A period is an interval of time, or the time-period of an oscillation. Wave period is the interval of time between repeated features on the waveform such as crests, troughs or upward passes through the mean level. + + degrees + + + The wave direction in each frequency band, calculated from the second-order components of the wave directional spectrum. Since there is an ambiguity of 180 degrees in the calculation of Alpha2 (i.e. 90 degrees and 270 degrees result in equivalent spectra), the value closer to Alpha1 is selected. The full directional wave spectrum is described as a Fourier series: S = a0/2 + a1cos(theta) + b1sin(theta) + a2cos(2theta) + b2sin(2theta). The Fourier coefficients a1, b1, a2, & b2 can be converted to polar coordinates as follows: R1 = (SQRT(a1a1+b1b1))/a0, R2 = (SQRT(a2a2+b2b2))/a0, ALPHA1 = 270.0-ARCTAN(b1,a1), ALPHA2 = 270.0-(0.5*ARCTAN(b2,a2)+{0 or 180, whichever minimizes the difference between ALPHA1 and ALPHA2}). ALPHA2 is the principal wave direction, which is determined from the second-order Fourier coefficients. This spectral parameter is a separate quantity from the bulk parameter (MWDIR), which has the standard name sea_surface_wave_from_direction_at_variance_spectral_density_maximum. The phrase "from_direction" is used in the construction X_from_direction and indicates the direction from which the velocity vector of X is coming. The direction is a bearing in the usual geographical sense, measured positive clockwise from due north. + + m 100 @@ -19926,14 +20257,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree_C - The quantity with standard name sea_water_added_conservative_temperature is a passive tracer in an ocean model whose surface flux does not come from the atmosphere but is imposed externally upon the simulated climate system. The surface flux is expressed as a heat flux and converted to a passive tracer increment as if it were a heat flux being added to conservative temperature. The passive tracer is transported within the ocean as if it were conservative temperature. The passive tracer is zero in the control climate of the model. The passive tracer records added heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. + The quantity with standard name sea_water_added_conservative_temperature is a passive tracer in an ocean model whose surface flux does not come from the atmosphere but is imposed externally upon the simulated climate system. The surface flux is expressed as a heat flux and converted to a passive tracer increment as if it were a heat flux being added to conservative temperature. The passive tracer is transported within the ocean as if it were conservative temperature. The passive tracer is zero in the control climate of the model. The passive tracer records added heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). degree_C - The quantity with standard name sea_water_added_potential_temperature is a passive tracer in an ocean model whose surface flux does not come from the atmosphere but is imposed externally upon the simulated climate system. The surface flux is expressed as a heat flux and converted to a passive tracer increment as if it were a heat flux being added to potential temperature. The passive tracer is transported within the ocean as if it were potential temperature. The passive tracer is zero in the control climate of the model. The passive tracer records added heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. + The quantity with standard name sea_water_added_potential_temperature is a passive tracer in an ocean model whose surface flux does not come from the atmosphere but is imposed externally upon the simulated climate system. The surface flux is expressed as a heat flux and converted to a passive tracer increment as if it were a heat flux being added to potential temperature. The passive tracer is transported within the ocean as if it were potential temperature. The passive tracer is zero in the control climate of the model. The passive tracer records added heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19947,7 +20278,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol m-3 - 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). + 'sea_water_alkalinity_expressed_as_mole_equivalent' is the total alkalinity equivalent concentration (including carbonate, nitrogen, silicate, and borate components). @@ -19968,7 +20299,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. + Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -19996,7 +20327,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. S m-1 - The electrical conductivity of sea water in a sample measured at a defined reference temperature. The reference temperature should be recorded in a scalar coordinate variable, or a coordinate variable with a single dimension of size one, and the standard name of temperature_of_analysis_of_sea_water. This quantity is sometimes called 'specific conductivity' when the reference temperature 25 degrees Celsius. + The electrical conductivity of sea water in a sample measured at a defined reference temperature. The reference temperature should be recorded in a scalar coordinate variable, or a coordinate variable with a single dimension of size one, and the standard name of temperature_of_analysis_of_sea_water. This quantity is sometimes called 'specific conductivity' when the reference temperature 25 degrees Celsius. @@ -20052,7 +20383,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - 'sea_water_pH_reported_on_total_scale' is the measure of acidity of seawater, defined as the negative logarithm of the concentration of dissolved hydrogen ions plus bisulfate ions in a sea water medium; it can be measured or calculated; when measured the scale is defined according to a series of buffers prepared in artificial seawater containing bisulfate. The quantity may be written as pH(total) = -log([H+](free) + [HSO4-]). + 'sea_water_pH_reported_on_total_scale' is the measure of acidity of seawater, defined as the negative logarithm of the concentration of dissolved hydrogen ions plus bisulfate ions in a sea water medium; it can be measured or calculated; when measured the scale is defined according to a series of buffers prepared in artificial seawater containing bisulfate. The quantity may be written as pH(total) = -log([H+](free) + [HSO4-]). @@ -20066,14 +20397,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - Sea water potential temperature is the temperature a parcel of sea water would have if moved adiabatically to sea level pressure. + Sea water potential temperature is the temperature a parcel of sea water would have if moved adiabatically to sea level pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The potential temperature at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. + Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The potential temperature at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -20097,6 +20428,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The practical salinity at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. Practical Salinity, S_P, is a determination of the salinity of sea water, based on its electrical conductance. The measured conductance, corrected for temperature and pressure, is compared to the conductance of a standard potassium chloride solution, producing a value on the Practical Salinity Scale of 1978 (PSS-78). This name should not be used to describe salinity observations made before 1978, or ones not based on conductance measurements. Conversion of Practical Salinity to other precisely defined salinity measures should use the appropriate formulas specified by TEOS-10. Salinity quantities that do not match any of the precise definitions should be given the more general standard name of sea_water_salinity_at_sea_floor. Reference: www.teos-10.org; Lewis, 1980 doi:10.1109/JOE.1980.1145448. + + mol m-3 + + + "Mole concentration" means the 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". "Alkalinity" refers to total alkalinity equivalent concentration, including carbonate, borate, phosphorus, silicon, and nitrogen components. The subduction and subsequent transport of surface water carry into the interior ocean considerable quantities of alkalinity, which is entirely independent of biological activity (such as organic decomposition and oxidation) after the water leaves the sea surface. Such alkalinity is termed “preformed” alkalinity (Redfield,1942). + + g kg-1 @@ -20136,14 +20474,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree_C - The quantity with standard name sea_water_redistributed_conservative_temperature is a passive tracer in an ocean model which is subject to an externally imposed perturbative surface heat flux. The passive tracer is initialised to the conservative temperature in the control climate before the perturbation is imposed. Its surface flux is the heat flux from the atmosphere, not including the imposed perturbation, and is converted to a passive tracer increment as if it were being added to conservative temperature. The passive tracer is transported within the ocean as if it were conservative temperature. The passive tracer records redistributed heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. + The quantity with standard name sea_water_redistributed_conservative_temperature is a passive tracer in an ocean model which is subject to an externally imposed perturbative surface heat flux. The passive tracer is initialised to the conservative temperature in the control climate before the perturbation is imposed. Its surface flux is the heat flux from the atmosphere, not including the imposed perturbation, and is converted to a passive tracer increment as if it were being added to conservative temperature. The passive tracer is transported within the ocean as if it were conservative temperature. The passive tracer records redistributed heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). degree_C - The quantity with standard name sea_water_redistributed_potential_temperature is a passive tracer in an ocean model which is subject to an externally imposed perturbative surface heat flux. The passive tracer is initialised to the potential temperature in the control climate before the perturbation is imposed. Its surface flux is the heat flux from the atmosphere, not including the imposed perturbation, and is converted to a passive tracer increment as if it were being added to potential temperature. The passive tracer is transported within the ocean as if it were potential temperature. The passive tracer records redistributed heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. + The quantity with standard name sea_water_redistributed_potential_temperature is a passive tracer in an ocean model which is subject to an externally imposed perturbative surface heat flux. The passive tracer is initialised to the potential temperature in the control climate before the perturbation is imposed. Its surface flux is the heat flux from the atmosphere, not including the imposed perturbation, and is converted to a passive tracer increment as if it were being added to potential temperature. The passive tracer is transported within the ocean as if it were potential temperature. The passive tracer records redistributed heat, as described for the CMIP6 FAFMIP experiment (doi:10.5194/gmd-9-3993-2016), following earlier ideas. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -20157,14 +20495,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1e-3 88 so - Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. 1e-3 - The salinity at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. Sea water salinity is the salt concentration of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. Practical salinity units are dimensionless. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + The salinity at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. Sea water salinity is the salt concentration of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. Practical salinity units are dimensionless. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. @@ -20216,6 +20554,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Speed is the magnitude of velocity. The speed at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. + + m s-1 + + + Speed is the magnitude of velocity. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Ekman drift" is the movement of a layer of water (the Ekman layer) due to the combination of wind stress at the sea surface and the Coriolis effect. Ekman drift is to the right of the wind direction in the Northern Hemisphere and the left in the Southern Hemisphere. Reference: https://www.open.edu/openlearn/science-maths-technology/the-oceans/content-section-4.3. + + m s-1 @@ -20234,35 +20579,35 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K 80 to - Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature applies use a vertical coordinate variable or scalar coordinate variable. There are standard names for sea_surface_temperature, sea_surface_skin_temperature, sea_surface_subskin_temperature and sea_surface_foundation_temperature which can be used to describe data located at the specified surfaces. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature applies use a vertical coordinate variable or scalar coordinate variable. There are standard names for sea_surface_temperature, sea_surface_skin_temperature, sea_surface_subskin_temperature and sea_surface_foundation_temperature which can be used to describe data located at the specified surfaces. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The term "anomaly" means difference from climatology. Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature anomaly applies, use a vertical coordinate variable or scalar coordinate variable. + The term "anomaly" means difference from climatology. Sea water temperature is the in situ temperature of the sea water. To specify the depth at which the temperature anomaly applies, use a vertical coordinate variable or scalar coordinate variable. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Sea water temperature is the in situ temperature of the sea water. The temperature at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. + Sea water temperature is the in situ temperature of the sea water. The temperature at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Sea water temperature is the in situ temperature of the sea water. + Sea water temperature is the in situ temperature of the sea water. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). kg s-1 - Transport across_line means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. + Transport across_line means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. @@ -20293,6 +20638,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. A velocity is a vector quantity. The phrase "to_direction" is used in the construction X_to_direction and indicates the direction towards which the velocity vector of X is headed. The direction is a bearing in the usual geographical sense, measured positive clockwise from due north. The direction at the sea floor is that adjacent to the ocean bottom, which would be the deepest grid cell in an ocean model and within the benthic boundary layer for measurements. + + degree + + + A velocity is a vector quantity. The phrase "to_direction" is used in the construction X_to_direction and indicates the direction towards which the velocity vector of X is headed. The direction is a bearing in the usual geographical sense, measured positive clockwise from due north. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Ekman drift" is the movement of a layer of water (the Ekman layer) due to the combination of wind stress at the sea surface and the Coriolis effect. Ekman drift is to the right of the wind direction in the Northern Hemisphere and the left in the Southern Hemisphere. Reference: https://www.open.edu/openlearn/science-maths-technology/the-oceans/content-section-4.3. + + degree @@ -20307,6 +20659,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The quantity with standard name "sea_water_volume" is the total volume of liquid seawater in the global oceans, including enclosed seas. + + 1 + + + "X_volume_fraction" means the fraction of volume occupied by X. It is evaluated as the volume of interest divided by the grid cell volume. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. A data variable with standard name sea_water_volume_fraction is used to store the fraction of a grid cell underlying sea-water, for example, where part of the grid cell is occupied by land or to record ocean volume on a model's native grid following a regridding operation. + + m s-1 @@ -20353,21 +20712,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - sensor_band_central_radiation_frequency is the central frequency of a sensor's band, calculated as the first moment of the band's normalized spectral response function. + sensor_band_central_radiation_frequency is the central frequency of a sensor's band, calculated as the first moment of the band's normalized spectral response function. m - sensor_band_central_radiation_wavelength is the central wavelength of a sensor's band, calculated as the first moment of the band's normalized spectral response function. + sensor_band_central_radiation_wavelength is the central wavelength of a sensor's band, calculated as the first moment of the band's normalized spectral response function. m-1 - sensor_band_central_radiation_wavenumber is the central wavenumber of a sensor's band, calculated as the first moment of the band's normalized spectral response function. + sensor_band_central_radiation_wavenumber is the central wavenumber of a sensor's band, calculated as the first moment of the band's normalized spectral response function. @@ -20388,7 +20747,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. degree - sensor_zenith_angle is the angle between the line of sight to the sensor and the local zenith at the observation target. This angle is measured starting from directly overhead and its range is from zero (directly overhead the observation target) to 180 degrees (directly below the observation target). Local zenith is a line perpendicular to the Earth's surface at a given location. "Observation target" means a location on the Earth defined by the sensor performing the observations. A standard name also exists for platform_zenith_angle, where "platform" refers to the vehicle from which observations are made e.g. aeroplane, ship, or satellite. For some viewing geometries the sensor and the platform cannot be assumed to be close enough to neglect the difference in calculated zenith angle. + sensor_zenith_angle is the angle between the line of sight to the sensor and the local zenith at the observation target. This angle is measured starting from directly overhead and its range is from zero (directly overhead the observation target) to 180 degrees (directly below the observation target). Local zenith is a line perpendicular to the Earth's surface at a given location. "Observation target" means a location on the Earth defined by the sensor performing the observations. A standard name also exists for platform_zenith_angle, where "platform" refers to the vehicle from which observations are made e.g. aeroplane, ship, or satellite. For some viewing geometries the sensor and the platform cannot be assumed to be close enough to neglect the difference in calculated zenith angle. @@ -20416,7 +20775,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - Convective precipitation is that produced by the convection schemes in an atmosphere model. Some atmosphere models differentiate between shallow and deep convection. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + Convective precipitation is that produced by the convection schemes in an atmosphere model. Some atmosphere models differentiate between shallow and deep convection. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. @@ -20454,6 +20813,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. "Single scattering albedo" is the fraction of radiation in an incident light beam scattered by the particles of an aerosol reference volume for a given wavelength. It is the ratio of the scattering and the extinction coefficients of the aerosol particles in the reference volume. A coordinate variable with a standard name of radiation_wavelength or radiation_frequency should be included to specify either the wavelength or frequency. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + 1 + + + Singular values of the matrix representing the remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + + + 1 + + + Singular values of the matrix representing the remote sensing averaging kernels (Weber 2019; Schneider et al., 2022) of the methane mole fractions obtained by a remote sensing observation (changes of methane in the retrieved atmosphere relative to the changes of methane in the true atmosphere, Rodgers 2000). + + kg m-2 s-1 @@ -20500,28 +20873,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol m-2 s-1 - 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. + 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. mol m-2 s-1 - 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. + 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. mol m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. mol m-2 s-1 - 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. + 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. @@ -20535,14 +20908,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. mol m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. @@ -20556,7 +20929,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Snow "viewable from above" refers to the snow on objects or the ground as viewed from above, which excludes, for example, falling snow flakes and snow obscured by a canopy, vegetative cover, or other features resting on the surface. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Snow "viewable from above" refers to the snow on objects or the ground as viewed from above, which excludes, for example, falling snow flakes and snow obscured by a canopy, vegetative cover, or other features resting on the surface. @@ -20584,14 +20957,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg s-1 - Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice dynamics" refers to advection of sea ice. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + Transport "across_line" means that which crosses a particular line on the Earth's surface; formally this means the integral along the line of the normal component of the transport. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice dynamics" refers to advection of sea ice. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. 1 - Soil albedo is the albedo of the soil surface assuming no snow. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. + Soil albedo is the albedo of the soil surface assuming no snow. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. @@ -20612,7 +20985,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m s-1 - Hydraulic conductivity is the constant k in Darcy's Law q=-k grad h for fluid flow q (volume transport per unit area i.e. velocity) through a porous medium, where h is the hydraulic head (pressure expressed as an equivalent depth of water). + Hydraulic conductivity is the constant k in Darcy's Law q=-k grad h for fluid flow q (volume transport per unit area i.e. velocity) through a porous medium, where h is the hydraulic head (pressure expressed as an equivalent depth of water). @@ -20710,21 +21083,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K 85 - Soil temperature is the bulk temperature of the soil, not the surface (skin) temperature. "Soil" means the near-surface layer where plants sink their roots. For subsurface temperatures that extend beneath the soil layer or in areas where there is no surface soil layer, the standard name temperature_in_ground should be used. + Soil temperature is the bulk temperature of the soil, not the surface (skin) temperature. "Soil" means the near-surface layer where plants sink their roots. For subsurface temperatures that extend beneath the soil layer or in areas where there is no surface soil layer, the standard name temperature_in_ground should be used. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). J kg-1 K-1 - Thermal capacity, or heat capacity, is the amount of heat energy required to increase the temperature of 1 kg of material by 1 K. It is a property of the material. + Thermal capacity, or heat capacity, is the amount of heat energy required to increase the temperature of 1 kg of material by 1 K. It is a property of the material. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). W m-1 K-1 - Thermal conductivity is the constant k in the formula q = -k grad T where q is the heat transfer per unit time per unit area of a surface normal to the direction of transfer and grad T is the temperature gradient. Thermal conductivity is a property of the material. + Thermal conductivity is the constant k in the formula q = -k grad T where q is the heat transfer per unit time per unit area of a surface normal to the direction of transfer and grad T is the temperature gradient. Thermal conductivity is a property of the material. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -20745,7 +21118,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1e-3 - The quantity with standard name soil_water_salinity is the salt content of soil water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. + The quantity with standard name soil_water_salinity is the salt content of soil water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. @@ -20913,14 +21286,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. J kg-1 K-1 - Thermal capacity, or heat capacity, is the amount of heat energy required to increase the temperature of 1 kg of material by 1 K. It is a property of the material. + Thermal capacity, or heat capacity, is the amount of heat energy required to increase the temperature of 1 kg of material by 1 K. It is a property of the material. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). J kg-1 K-1 - The specific heat capacity of sea water, Cp(ocean), is used in ocean models to convert between model prognostic temperature (potential or conservative temperature) and model heat content. + The specific heat capacity of sea water, Cp(ocean), is used in ocean models to convert between model prognostic temperature (potential or conservative temperature) and model heat content. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -20969,7 +21342,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Hz - The quantity with standard name spectral_width_of_radio_wave_in_air_scattered_by_air is the frequency width of the signal received by an instrument such as a radar or lidar. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + Frequency width of the radio wave, that was transmitted by an instrument and propagates in the air where it's scattered by the air due to which its properties change, and it is received by an instrument. The "instrument" (examples are radar and lidar) is the device used to make the observation. The "scatterers" are what causes the transmitted signal to be returned to the instrument (examples are aerosols, hydrometeors and refractive index irregularities in the air). A standard name referring to frequency spectra width of the signal received at the instrument. + + + + Hz + + + The "instrument" (examples are radar and lidar) is the device used to make the observation. The "scatterers" are what causes the transmitted signal to be returned to the instrument (examples are aerosols, hydrometeors and refractive index irregularities), of whatever kind the instrument detects. A standard name referring to frequency width of the received signal. @@ -21004,14 +21384,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. day - "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. The abbreviation "lwe" means liquid water equivalent. A spell is the number of consecutive days on which the condition X_below|above_threshold is satisfied. A variable whose standard name has the form spell_length_of_days_with_X_below|above_threshold must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_method entry for within days which describes the processing of quantity X before the threshold is applied. A spell_length_of_days is an intensive quantity in time, and the cell_methods entry for over days can be any of the methods listed in Appendix E appropriate for intensive quantities e.g. "maximum", "minimum" or "mean". + "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. The abbreviation "lwe" means liquid water equivalent. A spell is the number of consecutive days on which the condition X_below|above_threshold is satisfied. A variable whose standard name has the form spell_length_of_days_with_X_below|above_threshold must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_method entry for within days which describes the processing of quantity X before the threshold is applied. A spell_length_of_days is an intensive quantity in time, and the cell_methods entry for over days can be any of the methods listed in Appendix E appropriate for intensive quantities e.g. "maximum", "minimum" or "mean". day - "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases.The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. The abbreviation "lwe" means liquid water equivalent. A spell is the number of consecutive days on which the condition X_below|above_threshold is satisfied. A variable whose standard name has the form spell_length_of_days_with_X_below|above_threshold must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_method entry for within days which describes the processing of quantity X before the threshold is applied. A spell_length_of_days is an intensive quantity in time, and the cell_methods entry for over days can be any of the methods listed in Appendix E appropriate for intensive quantities e.g. "maximum", "minimum" or "mean". + "Amount" means mass per unit area. "Precipitation" in the earth's atmosphere means precipitation of water in all phases.The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. The abbreviation "lwe" means liquid water equivalent. A spell is the number of consecutive days on which the condition X_below|above_threshold is satisfied. A variable whose standard name has the form spell_length_of_days_with_X_below|above_threshold must have a coordinate variable or scalar coordinate variable with the standard name of X to supply the threshold(s). It must have a climatological time variable, and a cell_method entry for within days which describes the processing of quantity X before the threshold is applied. A spell_length_of_days is an intensive quantity in time, and the cell_methods entry for over days can be any of the methods listed in Appendix E appropriate for intensive quantities e.g. "maximum", "minimum" or "mean". @@ -21025,7 +21405,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K2 mptta - "square_of_X" means X*X. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The phrase "square_of_X" means X*X. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -21088,14 +21468,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1e-6 - The phrase "square_of_X" means X*X. Sea surface salinity is the salt concentration of sea water close to the sea surface, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. Sea surface salinity is often abbreviated as "SSS". For the salinity of sea water at a particular depth or layer, a data variable of "sea_water_salinity" or one of the more precisely defined salinities should be used with a vertical coordinate axis. There are standard names for the precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + The phrase "square_of_X" means X*X. Sea surface salinity is the salt concentration of sea water close to the sea surface, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand. Sea surface salinity is often abbreviated as "SSS". For the salinity of sea water at a particular depth or layer, a data variable of "sea_water_salinity" or one of the more precisely defined salinities should be used with a vertical coordinate axis. There are standard names for the precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. K2 - Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any), and not the skin temperature, whose standard name is surface_temperature. For the temperature of sea water at a particular depth or layer, a data variable of sea_water_temperature with a vertical coordinate axis should be used. "square_of_X" means X*X. + Sea surface temperature is usually abbreviated as "SST". It is the temperature of sea water near the surface (including the part under sea-ice, if any), and not the skin temperature, whose standard name is surface_temperature. For the temperature of sea water at a particular depth or layer, a data variable of sea_water_temperature with a vertical coordinate axis should be used. "square_of_X" means X*X. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -21116,7 +21496,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - In thermodynamics and fluid mechanics, stagnation temperature is the temperature at a stagnation point in a fluid flow. At a stagnation point the speed of the fluid is zero and all of the kinetic energy has been converted to internal energy and is added to the local static enthalpy. In both compressible and incompressible fluid flow, the stagnation temperature is equal to the total temperature at all points on the streamline leading to the stagnation point. In aviation, stagnation temperature is known as total air temperature and is measured by a temperature probe mounted on the surface of the aircraft. The probe is designed to bring the air to rest relative to the aircraft. As the air is brought to rest, kinetic energy is converted to internal energy. The air is compressed and experiences an adiabatic increase in temperature. Therefore, total air temperature is higher than the static (or ambient) air temperature. Total air temperature is an essential input to an air data computer in order to enable computation of static air temperature and hence true airspeed. + In thermodynamics and fluid mechanics, stagnation temperature is the temperature at a stagnation point in a fluid flow. At a stagnation point the speed of the fluid is zero and all of the kinetic energy has been converted to internal energy and is added to the local static enthalpy. In both compressible and incompressible fluid flow, the stagnation temperature is equal to the total temperature at all points on the streamline leading to the stagnation point. In aviation, stagnation temperature is known as total air temperature and is measured by a temperature probe mounted on the surface of the aircraft. The probe is designed to bring the air to rest relative to the aircraft. As the air is brought to rest, kinetic energy is converted to internal energy. The air is compressed and experiences an adiabatic increase in temperature. Therefore, total air temperature is higher than the static (or ambient) air temperature. Total air temperature is an essential input to an air data computer in order to enable computation of static air temperature and hence true airspeed. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -21165,14 +21545,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. To specify which area is quantified by a variable with standard name area_fraction, provide a coordinate variable or scalar coordinate variable with standard name area_type. Alternatively, if one is defined, use a more specific standard name of X_area_fraction for the fraction of horizontal area occupied by X. The cloud area fraction is for the whole atmosphere column, as seen from the surface or the top of the atmosphere. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). Cloud area fraction is also called "cloud amount" and "cloud cover". 1 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). Cloud area fraction is also called "cloud amount" and "cloud cover". + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Layer" means any layer with upper and lower boundaries that have constant values in some vertical coordinate. There must be a vertical coordinate variable indicating the extent of the layer(s). If the layers are model layers, the vertical coordinate can be model_level_number, but it is recommended to specify a physical coordinate (in a scalar or auxiliary coordinate variable) as well. Standard names also exist for high, medium and low cloud types. Standard names referring only to "cloud_area_fraction" should be used for quantities for the whole atmosphere column. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). Cloud area fraction is also called "cloud amount" and "cloud cover". @@ -21200,14 +21580,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 62 - "Precipitation" in the earth's atmosphere means precipitation of water in all phases. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Amount" means mass per unit area. + "Precipitation" in the earth's atmosphere means precipitation of water in all phases. Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Amount" means mass per unit area. kg m-2 s-1 - Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + Stratiform precipitation, whether liquid or frozen, is precipitation that formed in stratiform cloud. "Precipitation" in the earth's atmosphere means precipitation of water in all phases. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. @@ -21326,21 +21706,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 84 E174 - The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. To specify the nature of the surface a cell_methods attribute should be supplied as described in Chapter 7.3.3 of the CF Conventions. + The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. To specify the nature of the surface a cell_methods attribute should be supplied as described in Chapter 7.3.3 of the CF Conventions. 1 - The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. + The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. 1 - The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. + The surface called "surface" means the lower boundary of the atmosphere. Albedo is the ratio of outgoing to incoming shortwave irradiance, where 'shortwave irradiance' means that both the incoming and outgoing radiation are integrated across the solar spectrum. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. @@ -21368,7 +21748,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The surface called "surface" means the lower boundary of the atmosphere.The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. + The surface called "surface" means the lower boundary of the atmosphere.The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -21557,7 +21937,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The chemical formula for carbon dioxide is CO2. + "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The chemical formula for carbon dioxide is CO2. @@ -21707,6 +22087,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The surface called "surface" means the lower boundary of the atmosphere. Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -21868,6 +22262,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The surface called "surface" means the lower boundary of the atmosphere. Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. Surface downwelling shortwave is the sum of direct and diffuse solar radiation incident on the surface, and is sometimes called "global radiation". When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -22033,14 +22441,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 - The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). Net downward radiation is the difference between radiation from above (downwelling) and radiation from below (upwelling). The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". + The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). Net downward radiation is the difference between radiation from above (downwelling) and radiation from below (upwelling). The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". W m-2 - The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). Net downward radiation is the difference between radiation from above (downwelling) and radiation from below (upwelling). The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). Net downward radiation is the difference between radiation from above (downwelling) and radiation from below (upwelling). The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. @@ -22082,14 +22490,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. "All land processes" means plant and soil respiration, photosynthesis, animal grazing, crop harvesting, natural fires and anthropogenic land use change. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The chemical formula for carbon dioxide is CO2. + "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. "All land processes" means plant and soil respiration, photosynthesis, animal grazing, crop harvesting, natural fires and anthropogenic land use change. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The chemical formula for carbon dioxide is CO2. kg m-2 s-1 - "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. "All land processes" means plant and soil respiration, photosynthesis, animal grazing, crop harvesting, natural fires and anthropogenic land use change. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The chemical formula for carbon dioxide is CO2. + "Downward" indicates a vector component which is positive when directed downward (negative upward). 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. "All land processes" means plant and soil respiration, photosynthesis, animal grazing, crop harvesting, natural fires and anthropogenic land use change. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The chemical formula for carbon dioxide is CO2. @@ -22103,14 +22511,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 - The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). The term "shortwave" means shortwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". + The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). The term "shortwave" means shortwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". W m-2 - The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). The term "shortwave" means shortwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + The surface called "surface" means the lower boundary of the atmosphere. "Downward" indicates a vector component which is positive when directed downward (negative upward). The term "shortwave" means shortwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. @@ -22138,7 +22546,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. + "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. "Anthropogenic land use change" means human changes to land, excluding forest regrowth. It includes fires ignited by humans for the purpose of land use change and the processes of eventual disposal and decomposition of wood products such as paper, cardboard, furniture and timber for construction. The quantity with standard name surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes is equal to the difference between the quantities with standard names surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes_excluding_anthropogenic_land_use_change and surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. @@ -24847,7 +25255,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 snc - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. @@ -24924,14 +25332,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K E139 ts - The surface called "surface" means the lower boundary of the atmosphere. The surface temperature is the temperature at the interface, not the bulk temperature of the medium above or below. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. Previously, the qualifier where_type was used to specify that the quantity applies only to the part of the grid box of the named type. Names containing the where_type qualifier are deprecated and newly created data should use the cell_methods attribute to indicate the horizontal area to which the quantity applies. + The surface called "surface" means the lower boundary of the atmosphere. The surface temperature is the temperature at the interface, not the bulk temperature of the medium above or below. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. Previously, the qualifier where_type was used to specify that the quantity applies only to the part of the grid box of the named type. Names containing the where_type qualifier are deprecated and newly created data should use the cell_methods attribute to indicate the horizontal area to which the quantity applies. In order to convert the units correctly, it is essential to know whether a temperature is on-scale or a difference. Therefore this standard strongly recommends that any variable whose units involve a temperature unit should also have a units_metadata attribute to make the distinction. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The surface called "surface" means the lower boundary of the atmosphere. "anomaly" means difference from climatology. The surface temperature is the (skin) temperature at the interface, not the bulk temperature of the medium above or below. + The surface called "surface" means the lower boundary of the atmosphere. "anomaly" means difference from climatology. The surface temperature is the (skin) temperature at the interface, not the bulk temperature of the medium above or below. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -25029,7 +25437,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The surface called "surface" means the lower boundary of the atmosphere. "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 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. The chemical formula for carbon dioxide is CO2. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The definition of "crop" is model dependent, for example, some models may include fruit trees, trees grown for timber or other types of agricultural and forestry planting as crops. Crop harvesting means the human activity of collecting plant materials for the purpose of turning them into forestry or agricultural products. + The surface called "surface" means the lower boundary of the atmosphere. "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 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. The chemical formula for carbon dioxide is CO2. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The definition of "crop" is model dependent, for example, some models may include fruit trees, trees grown for timber or other types of agricultural and forestry planting as crops. Crop harvesting means the human activity of collecting plant materials for the purpose of turning them into forestry or agricultural products. @@ -25043,14 +25451,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. "Fires excluding anthropogenic land use change" means all natural fires and human ignited fires that are not associated with change of land use. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. "Anthropogenic" means influenced, caused, or created by human activity. + "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. "Fires excluding anthropogenic land use change" means all natural fires and human ignited fires that are not associated with change of land use. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. "Anthropogenic" means influenced, caused, or created by human activity. kg m-2 s-1 - "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. + "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. @@ -25071,7 +25479,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. + "Upward" indicates a vector component which is positive when directed upward (negative downward). 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. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The surface called "surface" means the lower boundary of the atmosphere. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. @@ -25284,6 +25692,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. The term "longwave" means longwave radiation. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. The 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "longwave" means longwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + mol m-2 s-1 @@ -25382,6 +25804,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + The surface called "surface" means the lower boundary of the atmosphere. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + kg m-2 @@ -25407,28 +25843,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The quantity with standard name temperature_at_base_of_ice_sheet_model is the lower boundary temperature that is used to force ice sheet models. Beneath ice shelves it is the temperature at the ice-ocean interface. Beneath grounded ice, it is the temperature at the ice-bedrock interface. In all instances the temperature is that of the interface itself and not that of the medium above or below the interface. + The quantity with standard name temperature_at_base_of_ice_sheet_model is the lower boundary temperature that is used to force ice sheet models. Beneath ice shelves it is the temperature at the ice-ocean interface. Beneath grounded ice, it is the temperature at the ice-bedrock interface. In all instances the temperature is that of the interface itself and not that of the medium above or below the interface. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The quantity with standard name temperature_at_top_of_ice_sheet_model is the upper boundary temperature that is used to force ice sheet models. It is the temperature at the interface between the ice sheet and the overlying medium which may be snow or the atmosphere. In all instances the temperature is that of the interface itself and not that of the medium above or below the interface. + The quantity with standard name temperature_at_top_of_ice_sheet_model is the upper boundary temperature that is used to force ice sheet models. It is the temperature at the interface between the ice sheet and the overlying medium which may be snow or the atmosphere. In all instances the temperature is that of the interface itself and not that of the medium above or below the interface. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - This quantity is defined as the temperature difference between a parcel of air lifted adiabatically from a starting air pressure to a finishing air pressure in the troposphere and the ambient air temperature at the finishing air pressure in the troposphere. It is often called the lifted index (LI) and provides a measure of the instability of the atmosphere. The air parcel is "lifted" by moving the air parcel from the starting air pressure to the Lifting Condensation Level (dry adiabatically) and then from the Lifting Condensation Level to the finishing air pressure (wet adiabatically). Air temperature is the bulk temperature of the air. Coordinate variables of original_air_pressure_of_lifted_parcel and final_air_pressure_of_lifted_parcel should be specified to indicate the specific air pressures at which the parcel lifting starts (starting air pressure) and the temperature difference is calculated at (finishing air pressure), respectively. + This quantity is defined as the temperature difference between a parcel of air lifted adiabatically from a starting air pressure to a finishing air pressure in the troposphere and the ambient air temperature at the finishing air pressure in the troposphere. It is often called the lifted index (LI) and provides a measure of the instability of the atmosphere. The air parcel is "lifted" by moving the air parcel from the starting air pressure to the Lifting Condensation Level (dry adiabatically) and then from the Lifting Condensation Level to the finishing air pressure (wet adiabatically). Air temperature is the bulk temperature of the air. Coordinate variables of original_air_pressure_of_lifted_parcel and final_air_pressure_of_lifted_parcel should be specified to indicate the specific air pressures at which the parcel lifting starts (starting air pressure) and the temperature difference is calculated at (finishing air pressure), respectively. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - This quantity is defined as the temperature difference between a parcel of air lifted adiabatically from the surface to a finishing air pressure in the troposphere and the ambient air temperature at the finishing air pressure in the troposphere. It is often called the lifted index (LI) and provides a measure of the instability of the atmosphere. The air parcel is "lifted" by moving the air parcel from the surface to the Lifting Condensation Level (dry adiabatically) and then from the Lifting Condensation Level to the finishing air pressure (wet adiabatically). Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The term "surface" means the lower boundary of the atmosphere. A coordinate variable of final_air_pressure_of_lifted_parcel should be specified to indicate the specific air pressure that the temperature difference is calculated at. + This quantity is defined as the temperature difference between a parcel of air lifted adiabatically from the surface to a finishing air pressure in the troposphere and the ambient air temperature at the finishing air pressure in the troposphere. It is often called the lifted index (LI) and provides a measure of the instability of the atmosphere. The air parcel is "lifted" by moving the air parcel from the surface to the Lifting Condensation Level (dry adiabatically) and then from the Lifting Condensation Level to the finishing air pressure (wet adiabatically). Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The term "surface" means the lower boundary of the atmosphere. A coordinate variable of final_air_pressure_of_lifted_parcel should be specified to indicate the specific air pressure that the temperature difference is calculated at. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -25456,28 +25892,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The temperature at any given depth (or in a layer) below the surface of the ground, excluding surficial snow and ice (but not permafrost or soil). For temperatures in surface lying snow and ice, the more specific standard names temperature_in_surface_snow and land_ice_temperature should be used. For temperatures measured or modelled specifically for the soil layer (the near-surface layer where plants sink their roots) the standard name soil_temperature should be used. + The temperature at any given depth (or in a layer) below the surface of the ground, excluding surficial snow and ice (but not permafrost or soil). For temperatures in surface lying snow and ice, the more specific standard names temperature_in_surface_snow and land_ice_temperature should be used. For temperatures measured or modelled specifically for the soil layer (the near-surface layer where plants sink their roots) the standard name soil_temperature should be used. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K E238 - "Temperature in surface snow" is the bulk temperature of the snow, not the surface (skin) temperature. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. + "Temperature in surface snow" is the bulk temperature of the snow, not the surface (skin) temperature. Surface snow refers to the snow on the solid ground or on surface ice cover, but excludes, for example, falling snowflakes and snow on plants. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The temperature_of_analysis_of_sea_water is the reference temperature for the effects of temperature on the measurement of another variable. This temperature should be measured, but may have been calculated, or assumed. For example, the temperature of the sample when measuring pH, or the temperature of equilibration in the case of dissolved gases. The linkage between the data variable and the variable with a standard_name of temperature_of_analysis_of_sea_water is achieved using the ancillary_variables attribute on the data variable. + The temperature_of_analysis_of_sea_water is the reference temperature for the effects of temperature on the measurement of another variable. This temperature should be measured, but may have been calculated, or assumed. For example, the temperature of the sample when measuring pH, or the temperature of equilibration in the case of dissolved gases. The linkage between the data variable and the variable with a standard_name of temperature_of_analysis_of_sea_water is achieved using the ancillary_variables attribute on the data variable. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Temperature_of_sensor_for_oxygen_in_sea_water is the instrument temperature used in calculating the concentration of oxygen in sea water; it is not a measurement of the ambient water temperature. + Temperature_of_sensor_for_oxygen_in_sea_water is the instrument temperature used in calculating the concentration of oxygen in sea water; it is not a measurement of the ambient water temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -25498,154 +25934,154 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K s-1 - "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tnt - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Nonorographic" gravity waves refer to gravity waves which are not generated by flow over orography. The dissipation of gravity waves generates heating through an eddy heat flux convergence and through a viscous stress term. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Nonorographic" gravity waves refer to gravity waves which are not generated by flow over orography. The dissipation of gravity waves generates heating through an eddy heat flux convergence and through a viscous stress term. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Orographic gravity waves" refer to gravity waves which are generated by flow over orography. The dissipation of gravity waves generates heating through an eddy heat flux convergence and through a viscous stress term. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Orographic gravity waves" refer to gravity waves which are generated by flow over orography. The dissipation of gravity waves generates heating through an eddy heat flux convergence and through a viscous stress term. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tntdc - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tntlw - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "longwave" means longwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "longwave" means longwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "tendency_of_X" means derivative of X with respect to time. "longwave" means longwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "tendency_of_X" means derivative of X with respect to time. "longwave" means longwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The term "longwave" means longwave radiation. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". Volcanic aerosols include both volcanic ash and secondary products such as sulphate aerosols formed from gaseous emissions of volcanic eruptions. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The term "longwave" means longwave radiation. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". Volcanic aerosols include both volcanic ash and secondary products such as sulphate aerosols formed from gaseous emissions of volcanic eruptions. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tntmc - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tntsw - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "shortwave" means shortwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "shortwave" means shortwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "tendency_of_X" means derivative of X with respect to time. "shortwave" means shortwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "tendency_of_X" means derivative of X with respect to time. "shortwave" means shortwave radiation. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The term "shortwave" means shortwave radiation. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". Volcanic aerosols include both volcanic ash and secondary products such as sulphate aerosols formed from gaseous emissions of volcanic eruptions. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The term "shortwave" means shortwave radiation. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". Volcanic aerosols include both volcanic ash and secondary products such as sulphate aerosols formed from gaseous emissions of volcanic eruptions. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. A variable with the standard name tendency_of_air_temperature_due_to_stratiform_cloud_and_precipitation should contain net latent heating effects of all processes which convert stratiform clouds and precipitation between water vapor, liquid or ice phases. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. A variable with the standard name tendency_of_air_temperature_due_to_stratiform_cloud_and_precipitation should contain net latent heating effects of all processes which convert stratiform clouds and precipitation between water vapor, liquid or ice phases. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 tntlsp - The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. + The phrase "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -25722,63 +26158,63 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Alcohols include all organic compounds with an alcoholic (OH) group. In standard names "alcohols" is the term used to describe the group of chemical species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -25820,7 +26256,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. @@ -25841,7 +26277,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for alpha_pinene is C10H16. The IUPAC name for alpha-pinene is (1S,5S)-2,6,6-trimethylbicyclo[3.1.1]hept-2-ene. @@ -25855,63 +26291,63 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. he chemical formula for ammonia is NH3. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. he chemical formula for ammonia is NH3. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ammonia is NH3. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -25946,77 +26382,77 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for beta_pinene is C10H16. The IUPAC name for beta-pinene is (1S,5S)-6,6-dimethyl-2-methylenebicyclo[3.1.1]heptane. @@ -26030,91 +26466,91 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for butane is C4H10. Butane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. "Anthropogenic" means influenced, caused, or created by human activity. Anthropogenic emission of carbon dioxide includes fossil fuel use, cement production, agricultural burning and sources associated with anthropogenic land use change, except forest regrowth. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. "Anthropogenic" means influenced, caused, or created by human activity. Anthropogenic emission of carbon dioxide includes fossil fuel use, cement production, agricultural burning and sources associated with anthropogenic land use change, except forest regrowth. @@ -26128,7 +26564,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. Fossil fuel combustion includes cement production and flaring of natural gas. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon dioxide is CO2. Fossil fuel combustion includes cement production and flaring of natural gas. @@ -26142,168 +26578,168 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon monoxide is CO. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon monoxide is CO. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon monoxide is CO. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for carbon monoxide is CO. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon monoxide is CO. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon tetrachloride is CCl4. The IUPAC name for carbon tetrachloride is tetrachloromethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of carbon tetrachloride is CCl4. The IUPAC name for carbon tetrachloride is tetrachloromethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC113a is CCl3CF3. The IUPAC name for CFC113a is 1,1,1-trichloro-2,2,2-trifluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC113a is CCl3CF3. The IUPAC name for CFC113a is 1,1,1-trichloro-2,2,2-trifluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC113 is CCl2FCClF2. The IUPAC name for CFC113 is 1,1,2-trichloro-1,2,2-trifluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC113 is CCl2FCClF2. The IUPAC name for CFC113 is 1,1,2-trichloro-1,2,2-trifluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC114 is CClF2CClF2. The IUPAC name for CFC114 is 1,2-dichloro-1,1,2,2-tetrafluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC114 is CClF2CClF2. The IUPAC name for CFC114 is 1,2-dichloro-1,1,2,2-tetrafluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer are used". The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC115 is CClF2CF3. The IUPAC name for CFC115 is 1-chloro-1,1,2,2,2-pentafluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer are used". The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC115 is CClF2CF3. The IUPAC name for CFC115 is 1-chloro-1,1,2,2,2-pentafluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC11 is CFCl3. The IUPAC name for CFC11 is trichloro(fluoro)methane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula of CFC11 is CFCl3. The IUPAC name for CFC11 is trichloro(fluoro)methane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for CFC12 is CF2Cl2. The IUPAC name for CFC12 is dichloro(difluoro)methane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for CFC12 is CF2Cl2. The IUPAC name for CFC12 is dichloro(difluoro)methane. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Chlorinated hydrocarbons are a group of chemicals composed of carbon, chlorine and hydrogen. As pesticides, they are also referred to by several other names, including chlorinated organics, chlorinated insecticides and chlorinated synthetics. In standard names "chlorinated_hydrocarbons" is the term used to describe the group of chlorinated hydrocarbon species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -26317,21 +26753,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for dimethyl sulfide is (CH3)2S. Dimethyl sulfide is sometimes referred to as DMS. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -26485,308 +26921,308 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Esters in organic chemistry are chemical compounds derived by reacting an oxoacid with a hydroxyl compound such as an alcohol or phenol. Esters are usually derived from an inorganic acid or organic acid in which at least one -OH (hydroxyl) group is replaced by an -O-alkyl (alkoxy) group, and most commonly from carboxylic acids and alcohols. That is, esters are formed by condensing an acid with an alcohol. In standard names "esters" is the term used to describe the group of ester species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethane is C2H6. Ethane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethanol is C2H5OH. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethanol is C2H5OH. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethene is C2H4. Ethene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Ethers are a class of organic compounds that contain an ether group - an oxygen atom connected to two alkyl or aryl groups - of general formula R-O-R. In standard names "ethers" is the term used to describe the group of ether species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for ethyne is HC2H. Ethyne is the IUPAC name for this species, which is also commonly known as acetylene. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -26800,70 +27236,70 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for formaldehyde is CH2O. The IUPAC name for formaldehyde is methanal. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -26898,7 +27334,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s) in a salt or to other atom(s) in a molecule. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. "Divalent mercury" means all compounds in which the mercury has two binding sites to other ion(s) in a salt or to other atom(s) in a molecule. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. @@ -26919,7 +27355,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. @@ -26933,56 +27369,56 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1202 is CBr2F2. The IUPAC name for Halon1202 is dibromo(difluoro)methane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1202 is CBr2F2. The IUPAC name for Halon1202 is dibromo(difluoro)methane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1211 is CBrClF2. The IUPAC name for Halon1211 is bromo-chloro-difluoromethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1211 is CBrClF2. The IUPAC name for Halon1211 is bromo-chloro-difluoromethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1301 is CBrF3. The IUPAC name for Halon1301 is bromo(trifluoro)methane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon1301 is CBrF3. The IUPAC name for Halon1301 is bromo(trifluoro)methane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon2402 is C2Br2F4. The IUPAC name for Halon2402 is 1,2-dibromo-1,1,2,2-tetrafluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for Halon2402 is C2Br2F4. The IUPAC name for Halon2402 is 1,2-dibromo-1,1,2,2-tetrafluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for HCC140a, also called methyl chloroform, is CH3CCl3. The IUPAC name for HCC140a is 1,1,1-trichloroethane. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for HCC140a, also called methyl chloroform, is CH3CCl3. The IUPAC name for HCC140a is 1,1,1-trichloroethane. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for HCFC141b is CH3CCl2F. The IUPAC name for HCFC141b is 1,1-dichloro-1-fluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for HCFC142b is CH3CClF2. The IUPAC name for HCFC142b is 1-chloro-1,1-difluoroethane. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for HCFC22 is CHClF2. The IUPAC name for HCFC22 is chloro(difluoro)methane. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for HCFC22 is CHClF2. The IUPAC name for HCFC22 is chloro(difluoro)methane. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. @@ -26996,7 +27432,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for hexachlorobiphenyl is C12H4Cl6. The structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for hexachlorobiphenyl is C12H4Cl6. The structure of this species consists of two linked benzene rings, each of which is additionally bonded to three chlorine atoms. @@ -27024,7 +27460,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for hydrogen cyanide is HCN. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for hydrogen cyanide is HCN. @@ -27052,98 +27488,98 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The chemical formula for isoprene is CH2=C(CH3)CH=CH2. The IUPAC name for isoprene is 2-methylbuta-1,3-diene. Isoprene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. In organic chemistry, a ketone is a compound with the structure RC(=O)R', where R and R' can be a variety of atoms and groups of atoms. It features a carbonyl group (C=O) bonded to two other carbon atoms. Acetone is the simplest example of a ketone. In standard names "ketones" is the term used to describe the group of ketone species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The chemical formula for limonene is C10H16. The IUPAC name for limonene is 1-methyl-4-prop-1-en-2-ylcyclohexene. Limonene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The chemical formula for limonene is C10H16. The IUPAC name for limonene is 1-methyl-4-prop-1-en-2-ylcyclohexene. Limonene is a member of the group of hydrocarbons known as terpenes. There are standard names for the terpene group as well as for some of the individual species. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. @@ -27171,77 +27607,77 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. he chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. he chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methane is CH4. Methane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27269,21 +27705,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methanol is CH3OH. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methanol is CH3OH. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methyl bromide is CH3Br. The IUPAC name for methyl bromide is bromomethane. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for methyl chloride is CH3Cl. The IUPAC name for methyl chloride is chloromethane. @@ -27297,21 +27733,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for molecular hydrogen is H2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27402,98 +27838,98 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27507,7 +27943,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrous acid is HNO2. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrous acid is HNO2. @@ -27528,7 +27964,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrous oxide is N2O. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrous oxide is N2O. @@ -27626,70 +28062,70 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Nox" means nitric oxide (NO) and nitrogen dioxide (NO2). "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Nox" means nitric oxide (NO) and nitrogen dioxide (NO2). "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27703,7 +28139,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27724,56 +28160,56 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. An organic acid is an organic compound with acidic properties. The most common organic acids are the carboxylic acids, whose acidity is associated with their carboxyl group -COOH. In standard names "organic_acids" is the term used to describe the group of organic acid species 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -27969,63 +28405,63 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for pentane is C5H12. Pentane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -28193,161 +28629,161 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propane is C3H8. Propane is a member of the group of hydrocarbons known as alkanes. There are standard names for the alkane group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for propene is C3H6. Propene is a member of the group of hydrocarbons known as alkenes. There are standard names for the alkene group as well as for some of the individual species. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical symbol for radon is Rn. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical symbol for radon is Rn. @@ -28515,70 +28951,70 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for sulfur dioxide is SO2. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -28592,105 +29028,105 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. Terpenes are hydrocarbons, that is, they contain only hydrogen and carbon combined in the general proportions (C5H8)n where n is an integer greater than on equal to one. The term "terpenes" is 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 terpene species, e.g., isoprene and limonene. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for trimethylbenzene is C9H12. The IUPAC names for trimethylbenzene is 1,3,5-trimethylbenzene. Trimethylbenzene is an aromatic hydrocarbon. There are standard names that refer to aromatic_compounds as a group, as well as those for individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for trimethylbenzene is C9H12. The IUPAC names for trimethylbenzene is 1,3,5-trimethylbenzene. Trimethylbenzene is an aromatic hydrocarbon. There are standard names that refer to aromatic_compounds as a group, as well as those for individual species. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -28767,84 +29203,84 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. + "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including content_of_atmosphere_layer are used. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural production" sector comprises the agricultural processes of enteric fermentation, manure management, rice cultivation, agricultural soils and other. It may also include any not-classified or "other" combustion, which is commonly included in agriculture-related inventory data. "Agricultural production" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 4A, 4B, 4C, 4D and 4G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "agricultural waste burning" sector comprises field burning of agricultural residues. "Agricultural waste burning" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 4F as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "energy production and distribution" sector comprises fuel combustion activities related to energy industries and fugitive emissions from fuels. It may also include any not-classified or "other" combustion, which is commonly included in energy-related inventory data. "Energy production and distribution" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A1 and 1B as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "forest fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in forests. "Forest fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "industrial processes and combustion" sector comprises fuel combustion activities related to manufacturing industries and construction, industrial processes related to mineral products, the chemical industry, metal production, the production of pulp, paper, food and drink, and non-energy industry use of lubricants and waxes. It may also include any not-classified or "other" combustion, which is commonly included in industry-related inventory data. "Industrial processes and combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A2, 2A, 2B, 2C, 2D and 2G as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "land transport" sector includes fuel combustion activities related to road transportation, railways and other transportation. "Land transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A3b, 1A3c and 1A3e as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "maritime transport" sector includes fuel combustion activities related to maritime transport. "Maritime transport" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3d as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "residential and commercial combustion" sector comprises fuel combustion activities related to the commercial/institutional sector, the residential sector and the agriculture/forestry/fishing sector. It may also include any not-classified or "other" combustion, which is commonly included in the inventory data. "Residential and commercial combustion" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 1A4a, 1A4b and 1A4c as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "savanna and grassland fires" sector comprises the burning (natural and human-induced) of living or dead vegetation in non-forested areas. It excludes field burning of agricultural residues. "Savanna and grassland fires" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 5 as defined in the 2006 IPCC guidelines for national greenhouse gas Inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "solvent production and use" sector comprises industrial processes related to the consumption of halocarbons, SF6, solvent and other product use. "Solvent production and use" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 2F and 3 as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-2 s-1 - "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The "atmosphere content" of a quantity refers to the vertical integral from the surface to the top of the atmosphere. For the content between specified levels in the atmosphere, standard names including "content_of_atmosphere_layer" are used. The mass is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. 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. The "waste treatment and disposal" sector comprises solid waste disposal on land, wastewater handling, waste incineration and other waste disposal. "Waste treatment and disposal" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source categories 6A, 6B, 6C and 6D as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -29250,7 +29686,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol s-1 - "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. + "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "HOx" means a combination of two radical species containing hydrogen and oxygen: OH and HO2. 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. @@ -29446,14 +29882,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol s-1 - "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. + "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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 s-1 - "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. + "tendency_of_X" means derivative of X with respect to time. The construction "atmosphere_moles_of_X" means the total number of moles of X in the entire atmosphere, i.e. summed over the atmospheric column and over the entire globe. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). 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. 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. @@ -29747,21 +30183,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-3 s-1 - "tendency_of_X" means derivative of X with respect to time. 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 is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. 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 is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen dioxide is NO2. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-3 s-1 - "tendency_of_X" means derivative of X with respect to time. 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 is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. 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 is the total mass of the molecules. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. The chemical formula for nitrogen monoxide is NO. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". kg m-3 s-1 - "tendency_of_X" means derivative of X with respect to time. 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 specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". + "tendency_of_X" means derivative of X with respect to time. 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 specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Emission" means emission from a primary source located anywhere within the atmosphere, including at the lower boundary (i.e. earth's surface). "Emission" is a process entirely distinct from "re-emission" which is used in some standard names. "Nox" means a combination of two radical species containing nitrogen and oxygen: NO+NO2. 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. The "aviation" sector includes fuel combustion activities related to civil aviation. "Aviation" is the term used in standard names to describe a collection of emission sources. A variable which has this value for the standard_name attribute should be accompanied by a comment attribute which lists the source categories and provides a reference to the categorization scheme, for example, "IPCC (Intergovernmental Panel on Climate Change) source category 1A3a as defined in the 2006 IPCC guidelines for national greenhouse gas inventories". @@ -29880,21 +30316,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. s-1 - Mass fraction is used in the construction mass_fraction_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'. Autoconversion is the process of collision and coalescence which results in the formation of precipitation particles from cloud water droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. + Mass fraction is used in the construction mass_fraction_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'. Autoconversion is the process of collision and coalescence which results in the formation of precipitation particles from cloud water droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. s-1 - Mass fraction is used in the construction mass_fraction_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'. Autoconversion is the process of collision and coalescence which results in the formation of precipitation particles from cloud water droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. + Mass fraction is used in the construction mass_fraction_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'. Autoconversion is the process of collision and coalescence which results in the formation of precipitation particles from cloud water droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. @@ -29915,14 +30351,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) Condensation is the conversion of vapor into liquid. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. + Mass fraction is used in the construction mass_fraction_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'. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) Condensation is the conversion of vapor into liquid. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. "condensed_water" means liquid and ice. @@ -29936,21 +30372,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. Accretion is the growth of a hydrometeor by collision with cloud droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. Accretion is the growth of a hydrometeor by collision with cloud droplets or ice crystals. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. s-1 - Mass fraction is used in the construction mass_fraction_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'. Aggregation is the clumping together of frozen cloud particles to produce snowflakes. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. Aggregation is the clumping together of frozen cloud particles to produce snowflakes. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. @@ -29978,21 +30414,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. s-1 - Mass fraction is used in the construction mass_fraction_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'. Sublimation is the conversion of solid into vapor. Deposition is the opposite of sublimation, i.e. it is the conversion of vapor into solid. Deposition is distinct from the processes of dry deposition and wet deposition of atmospheric aerosol particles, which are referred to in some standard names. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. Sublimation is the conversion of solid into vapor. Deposition is the opposite of sublimation, i.e. it is the conversion of vapor into solid. Deposition is distinct from the processes of dry deposition and wet deposition of atmospheric aerosol particles, which are referred to in some standard names. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. s-1 - Mass fraction is used in the construction mass_fraction_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'. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. @@ -30020,7 +30456,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. @@ -30034,7 +30470,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. @@ -30048,7 +30484,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - Mass fraction is used in the construction mass_fraction_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'. Riming is the rapid freezing of supercooled water onto a surface. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. + Mass fraction is used in the construction mass_fraction_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'. Riming is the rapid freezing of supercooled water onto a surface. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. @@ -30475,14 +30911,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. mol m-2 s-1 - "Content" indicates a quantity per unit area. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. + "Content" indicates a quantity per unit area. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Aragonite is a mineral that is a polymorph of calcium carbonate. The chemical formula of aragonite is CaCO3. Standard names also exist for calcite, another polymorph of calcium carbonate. mol m-2 s-1 - "Content" indicates a quantity per unit area. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. + "Content" indicates a quantity per unit area. 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. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "tendency_of_X" means derivative of X with respect to time. Calcite is a mineral that is a polymorph of calcium carbonate. The chemical formula of calcite is CaCO3. Standard names also exist for aragonite, another polymorph of calcium carbonate. @@ -30818,21 +31254,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice dynamics" refers to the motion of sea ice. + The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice dynamics" refers to the motion of sea ice. s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea ice "ridging" occurs in rough sea conditions. The motion of the sea surface can cause areas of sea ice to deform and fold resulting in ridged upper and lower surfaces. The ridges can be as much as twenty metres thick if thick ice is deformed. + The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea ice "ridging" occurs in rough sea conditions. The motion of the sea surface can cause areas of sea ice to deform and fold resulting in ridged upper and lower surfaces. The ridges can be as much as twenty metres thick if thick ice is deformed. s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice thermodynamics" refers to the addition or subtraction of mass due to surface and basal fluxes. + The phrase "tendency_of_X" means derivative of X with respect to time. "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. Sea ice area fraction is area of the sea surface occupied by sea ice. It is also called "sea ice concentration". "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice thermodynamics" refers to the addition or subtraction of mass due to surface and basal fluxes. @@ -30909,7 +31345,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 - The phrase "tendency_of_X" means derivative of X with respect to time. The phrase "expressed_as_heat_content" means that this quantity is calculated as the specific heat capacity times density of sea water multiplied by the conservative temperature of the sea water in the grid cell and integrated over depth. If used for a layer heat content, coordinate bounds should be used to define the extent of the layers. If no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is sea water the integral is assumed to be calculated over the full depth of the ocean. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. + The phrase "tendency_of_X" means derivative of X with respect to time. The phrase "expressed_as_heat_content" means that this quantity is calculated as the specific heat capacity times density of sea water multiplied by the conservative temperature of the sea water in the grid cell and integrated over depth. If used for a layer heat content, coordinate bounds should be used to define the extent of the layers. If no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is sea water the integral is assumed to be calculated over the full depth of the ocean. Conservative Temperature is defined as part of the Thermodynamic Equation of Seawater 2010 (TEOS-10) which was adopted in 2010 by the International Oceanographic Commission (IOC). Conservative Temperature is specific potential enthalpy (which has the standard name sea_water_specific_potential_enthalpy) divided by a fixed value of the specific heat capacity of sea water, namely cp_0 = 3991.86795711963 J kg-1 K-1. Conservative Temperature is a more accurate measure of the "heat content" of sea water, by a factor of one hundred, than is potential temperature. Because of this, it can be regarded as being proportional to the heat content of sea water per unit mass. Reference: www.teos-10.org; McDougall, 2003 doi: 10.1175/1520-0485(2003)033<0945:PEACOV>2.0.CO;2. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. @@ -30958,49 +31394,49 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 - The phrase "tendency_of_X" means derivative of X with respect to time. The phrase "expressed_as_heat_content" means that this quantity is calculated as the specific heat capacity times density of sea water multiplied by the potential temperature of the sea water in the grid cell and integrated over depth. If used for a layer heat content, coordinate bounds should be used to define the extent of the layers. If no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is sea water the integral is assumed to be calculated over the full depth of the ocean. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. + The phrase "tendency_of_X" means derivative of X with respect to time. The phrase "expressed_as_heat_content" means that this quantity is calculated as the specific heat capacity times density of sea water multiplied by the potential temperature of the sea water in the grid cell and integrated over depth. If used for a layer heat content, coordinate bounds should be used to define the extent of the layers. If no coordinate bounds are specified, it is assumed that the integral is calculated over the entire vertical extent of the medium, e.g, if the medium is sea water the integral is assumed to be calculated over the full depth of the ocean. Potential temperature is the temperature a parcel of air or sea water would have if moved adiabatically to sea level pressure. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. 1e-3 s-1 - "tendency_of_X" means derivative of X with respect to time. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "tendency_of_X" means derivative of X with respect to time. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. 1e-3 s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. 1e-3 s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Horizontal mixing" means any horizontal transport other than by advection and parameterized eddy advection, usually represented as horizontal diffusion in ocean models. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Horizontal mixing" means any horizontal transport other than by advection and parameterized eddy advection, usually represented as horizontal diffusion in ocean models. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. 1e-3 s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Parameterized eddy advection in an ocean model means the part due to a scheme representing parameterized eddy-induced advective effects not included in the resolved model velocity field. Parameterized eddy advection can be represented on various spatial scales and there are standard names for parameterized_mesoscale_eddy_advection and parameterized_submesoscale_eddy_advection which both contribute to the total parameterized eddy advection. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Parameterized eddy advection in an ocean model means the part due to a scheme representing parameterized eddy-induced advective effects not included in the resolved model velocity field. Parameterized eddy advection can be represented on various spatial scales and there are standard names for parameterized_mesoscale_eddy_advection and parameterized_submesoscale_eddy_advection which both contribute to the total parameterized eddy advection. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. 1e-3 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice thermodynamics" refers to the addition or subtraction of sea ice mass due to surface and basal fluxes, i.e. due to melting, sublimation and fusion. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. + The phrase "tendency_of_X" means derivative of X with respect to time. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Sea ice thermodynamics" refers to the addition or subtraction of sea ice mass due to surface and basal fluxes, i.e. due to melting, sublimation and fusion. "Sea ice" means all ice floating in the sea which has formed from freezing sea water, rather than by other processes such as calving of land ice to form icebergs. 1e-3 s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Vertical mixing" means any vertical transport other than by advection and parameterized eddy advection, represented by a combination of vertical diffusion, turbulent mixing and convection in ocean models. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. + "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Vertical mixing" means any vertical transport other than by advection and parameterized eddy advection, represented by a combination of vertical diffusion, turbulent mixing and convection in ocean models. Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and normally given as 1e-3 or 0.001 i.e. parts per thousand. There are standard names for the more precisely defined salinity quantities: sea_water_knudsen_salinity, S_K (used for salinity observations between 1901 and 1966), sea_water_cox_salinity, S_C (used for salinity observations between 1967 and 1977), sea_water_practical_salinity, S_P (used for salinity observations from 1978 to the present day), sea_water_absolute_salinity, S_A, sea_water_preformed_salinity, S_*, and sea_water_reference_salinity. Practical Salinity is reported on the Practical Salinity Scale of 1978 (PSS-78), and is usually based on the electrical conductivity of sea water in observations since the 1960s. Conversion of data between the observed scales follows: S_P = (S_K - 0.03) * (1.80655 / 1.805) and S_P = S_C, however the accuracy of the latter is dependent on whether chlorinity or conductivity was used to determine the S_C value, with this inconsistency driving the development of PSS-78. The more precise standard names should be used where appropriate for both modelled and observed salinities. In particular, the use of sea_water_salinity to describe salinity observations made from 1978 onwards is now deprecated in favor of the term sea_water_practical_salinity which is the salinity quantity stored by national data centers for post-1978 observations. The only exception to this is where the observed salinities are definitely known not to be recorded on the Practical Salinity Scale. The unit "parts per thousand" was used for sea_water_knudsen_salinity and sea_water_cox_salinity. @@ -31049,42 +31485,42 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. kg m-2 s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. + The phrase "tendency_of_X" means derivative of X with respect to time. "Content" indicates a quantity per unit area. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. The phrase "residual_mean_advection" refers to the sum of the model's resolved advective transport plus any parameterized advective transport. Parameterized advective transport includes processes such as parameterized mesoscale and submesoscale transport, as well as any other advectively parameterized transport. When the parameterized advective transport is represented in the model as a skew-diffusion rather than an advection, then the parameterized skew diffusion should be included in this diagnostic, since the convergence of skew-fluxes are identical (in the continuous formulation) to the convergence of advective fluxes. K s-1 - "tendency_of_X" means derivative of X with respect to time. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "tendency_of_X" means derivative of X with respect to time. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Horizontal mixing" means any horizontal transport other than by advection and parameterized eddy advection, usually represented as horizontal diffusion in ocean models. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Horizontal mixing" means any horizontal transport other than by advection and parameterized eddy advection, usually represented as horizontal diffusion in ocean models. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Parameterized eddy advection in an ocean model means the part due to a scheme representing parameterized eddy-induced advective effects not included in the resolved model velocity field. Parameterized eddy advection can be represented on various spatial scales and there are standard names for parameterized_mesoscale_eddy_advection and parameterized_submesoscale_eddy_advection which both contribute to the total parameterized eddy advection. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Parameterized eddy advection in an ocean model means the part due to a scheme representing parameterized eddy-induced advective effects not included in the resolved model velocity field. Parameterized eddy advection can be represented on various spatial scales and there are standard names for parameterized_mesoscale_eddy_advection and parameterized_submesoscale_eddy_advection which both contribute to the total parameterized eddy advection. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K s-1 - "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Vertical mixing" means any vertical transport other than by advection and parameterized eddy advection, represented by a combination of vertical diffusion, turbulent mixing and convection in ocean models. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. + The phrase "tendency_of_X" means derivative of X with respect to time. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Vertical mixing" means any vertical transport other than by advection and parameterized eddy advection, represented by a combination of vertical diffusion, turbulent mixing and convection in ocean models. Sea water temperature is the in situ temperature of the sea water. For observed data, depending on the period during which the observation was made, the measured in situ temperature was recorded against standard "scales". These historical scales include the International Practical Temperature Scale of 1948 (IPTS-48; 1948-1967), the International Practical Temperature Scale of 1968 (IPTS-68, Barber, 1969; 1968-1989) and the International Temperature Scale of 1990 (ITS-90, Saunders 1990; 1990 onwards). Conversion of data between these scales follows t68 = t48 - (4.4 x 10e-6) * t48(100 - t - 48); t90 = 0.99976 * t68. Observations made prior to 1948 (IPTS-48) have not been documented and therefore a conversion cannot be certain. Differences between t90 and t68 can be up to 0.01 at temperatures of 40 C and above; differences of 0.002-0.007 occur across the standard range of ocean temperatures (-10 - 30 C). The International Equation of State of Seawater 1980 (EOS-80, UNESCO, 1981) and the Practical Salinity Scale (PSS-78) were both based on IPTS-68, while the Thermodynamic Equation of Seawater 2010 (TEOS-10) is based on ITS-90. References: Barber, 1969, doi: 10.1088/0026-1394/5/2/001; UNESCO, 1981; Saunders, 1990, WOCE Newsletter, 10, September 1990. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31147,21 +31583,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. "Specific" means per unit mass. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. A variable with the standard name of tendency_of_specific_humidity_due_to_stratiform_cloud_and_precipitation should contain the effects of all processes which convert stratiform clouds and precipitation to or from water vapor. + The phrase "tendency_of_X" means derivative of X with respect to time. "Specific" means per unit mass. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. A variable with the standard name of tendency_of_specific_humidity_due_to_stratiform_cloud_and_precipitation should contain the effects of all processes which convert stratiform clouds and precipitation to or from water vapor. s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). + The phrase "tendency_of_X" means derivative of X with respect to time. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. "Boundary layer mixing" means turbulent motions that transport heat, water, momentum and chemical constituents within the atmospheric boundary layer and affect exchanges between the surface and the atmosphere. The atmospheric boundary layer is typically characterised by a well-mixed sub-cloud layer of order 500 metres, and by a more extended conditionally unstable layer with boundary-layer clouds up to 2 km. (Reference: IPCC Third Assessment Report, Working Group 1: The Scientific Basis, 7.2.2.3, https://archive.ipcc.ch/ipccreports/tar/wg1/273.htm). s-1 - The phrase "tendency_of_X" means derivative of X with respect to time. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. + The phrase "tendency_of_X" means derivative of X with respect to time. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes). "Precipitation" in the earth's atmosphere means precipitation of water in all phases. @@ -31294,7 +31730,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-1 K-1 - Thermal conductivity is the constant k in the formula q = -k grad T where q is the heat transfer per unit time per unit area of a surface normal to the direction of transfer and grad T is the temperature gradient. Thermal conductivity is a property of the material. + Thermal conductivity is the constant k in the formula q = -k grad T where q is the heat transfer per unit time per unit area of a surface normal to the direction of transfer and grad T is the temperature gradient. Thermal conductivity is a property of the material. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31497,28 +31933,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. "toa" means top of atmosphere. + The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. "toa" means top of atmosphere. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "toa" means top of atmosphere. + The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "toa" means top of atmosphere. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - toa_brightness_temperature_bias_at_standard_scene_due_to_intercalibration is the difference between top-of-atmosphere (TOA) brightness temperatureof the reference sensor and TOA brightness temperature of themonitored sensor. This TOA brightness temperature difference is a measure of the calibration difference between the monitored and reference sensors. The standard scene is a target area with typical Earth surface and atmospheric conditions that is accepted as a reference. Brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area at a given wavenumber. TOA brightness temperature of the standard scene is calculated using a radiative transfer simulation for a given viewing geometry. The resultant top-of-atmosphere spectral radiance is then integrated with each sensor's spectral response function and converted to equivalent brightness temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + toa_brightness_temperature_bias_at_standard_scene_due_to_intercalibration is the difference between top-of-atmosphere (TOA) brightness temperature of the reference sensor and TOA brightness temperature of the monitored sensor. This TOA brightness temperature difference is a measure of the calibration difference between the monitored and reference sensors. The standard scene is a target area with typical Earth surface and atmospheric conditions that is accepted as a reference. Brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area at a given wavenumber. TOA brightness temperature of the standard scene is calculated using a radiative transfer simulation for a given viewing geometry. The resultant top-of-atmosphere spectral radiance is then integrated with each sensor's spectral response function and converted to equivalent brightness temperature. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. It is strongly recommended that a variable with this standard name should have the attribute units_metadata="temperature: difference", meaning that it refers to temperature differences and implying that the origin of the temperature scale is irrelevant, because it is essential to know whether a temperature is on-scale or a difference in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - "toa" means top of atmosphere. The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area at a given wavenumber. The standard scene is a target area with typical Earth surface and atmospheric conditions that is accepted as a reference. The toa radiance of the standard scene is calculated using a radiative transfer model for a given viewing geometry. The resultant toa spectral radiance is then integrated with a sensor's spectral response function and converted to equivalent brightness temperature. + "toa" means top of atmosphere. The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area at a given wavenumber. The standard scene is a target area with typical Earth surface and atmospheric conditions that is accepted as a reference. The toa radiance of the standard scene is calculated using a radiative transfer model for a given viewing geometry. The resultant toa spectral radiance is then integrated with a sensor's spectral response function and converted to equivalent brightness temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31567,7 +32003,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 - "toa" means top of atmosphere. The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + "toa" means top of atmosphere. The term "longwave" means longwave radiation. "X_direct_radiative_effect" refers to the instantaneous radiative impact of X on the Earth's energy balance, excluding secondary effects such as changes in cloud cover which may be caused by X. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. @@ -31640,6 +32076,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "longwave" means longwave radiation. "toa" means top of atmosphere. The TOA outgoing longwave flux is the upwelling thermal radiative flux, often called the "outgoing longwave radiation" or "OLR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + W/m2 + + + A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "longwave" means longwave radiation. "toa" means top of atmosphere. The TOA outgoing longwave flux is the upwelling thermal radiative flux, often called the "outgoing longwave radiation" or "OLR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "longwave" means longwave radiation. "toa" means top of atmosphere. The TOA outgoing longwave flux is the upwelling thermal radiative flux, often called the "outgoing longwave radiation" or "OLR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -31672,28 +32122,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. W m-2 sr-1 (m-1)-1 - toa_outgoing_radiance_per_unit_wavenumber_mean_within_collocation_scene is an average of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation scene. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation scene" is a grouping of a sensor's adjacent field-of-views centered on a collocation target. The size of the collocation scene is typically about twice that of the collocation target. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. + toa_outgoing_radiance_per_unit_wavenumber_mean_within_collocation_scene is an average of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation scene. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation scene" is a grouping of a sensor's adjacent field-of-views centered on a collocation target. The size of the collocation scene is typically about twice that of the collocation target. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. W m-2 sr-1 (m-1)-1 - toa_outgoing_radiance_per_unit_wavenumber_mean_within_collocation_target is an average of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation target. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. + toa_outgoing_radiance_per_unit_wavenumber_mean_within_collocation_target is an average of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation target. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. W m-2 sr-1 (m-1)-1 - toa_outgoing_radiance_per_unit_wavenumber_stdev_within_collocation_scene is the standard deviation of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation scene. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation scene" is a grouping of a sensor's adjacent field-of-views centered on a collocation target. The size of the collocation scene is typically about twice that of the collocation target. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. + toa_outgoing_radiance_per_unit_wavenumber_stdev_within_collocation_scene is the standard deviation of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation scene. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation scene" is a grouping of a sensor's adjacent field-of-views centered on a collocation target. The size of the collocation scene is typically about twice that of the collocation target. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. W m-2 sr-1 (m-1)-1 - toa_outgoing_radiance_per_unit_wavenumber_stdev_within_collocation_target is the standard deviation of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation target. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. + toa_outgoing_radiance_per_unit_wavenumber_stdev_within_collocation_target is the standard deviation of observations of the quantity with standard name toa_outgoing_radiance_per_unit_wavenumber from a sensor's adjacent field-of-views within a collocation target. "toa" means top of atmosphere. The TOA outgoing radiance is the upwelling radiance, i.e., toward outer space. Radiance is the radiative flux in a particular direction, per unit of solid angle. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The "collocation target" is an area on the Earth's surface at which observations from at least two sensors are collected. Its size is defined by the sensor with the largest field-of-view footprint. Two events are deemed to be collocated based on some set of spatial, temporal, and viewing geometry criteria. @@ -31717,6 +32167,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The abbreviation "toa" means top of atmosphere. The term "shortwave" means shortwave radiation. The TOA outgoing shortwave flux is the reflected and scattered solar radiative flux i.e. the "upwelling" TOA shortwave flux, sometimes called the "outgoing shortwave radiation" or "OSR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The abbreviation "toa" means top of atmosphere. The term "shortwave" means shortwave radiation. The TOA outgoing shortwave flux is the reflected and scattered solar radiative flux i.e. the "upwelling" TOA shortwave flux, sometimes called the "outgoing shortwave radiation" or "OSR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -31724,6 +32181,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The abbreviation "toa" means top of atmosphere. The term "shortwave" means shortwave radiation. The TOA outgoing shortwave flux is the reflected and scattered solar radiative flux i.e. the "upwelling" TOA shortwave flux, sometimes called the "outgoing shortwave radiation" or "OSR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. + + W/m2 + + + The abbreviation "toa" means top of atmosphere. The term "shortwave" means shortwave radiation. The TOA outgoing shortwave flux is the reflected and scattered solar radiative flux i.e. the "upwelling" TOA shortwave flux, sometimes called the "outgoing shortwave radiation" or "OSR". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 @@ -31777,7 +32241,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - The quantity with standard name tropical_cyclone_eye_brightness_temperature is the warmest brightness temperature value in the eye region of a tropical cyclone (0 - 24 km from the storm center) derived using the Advanced Dvorak Technique, based on satellite observations. Reference: Olander, T. L., & Velden, C. S., The Advanced Dvorak Technique: Continued Development of an Objective Scheme to Estimate Tropical Cyclone Intensity Using Geostationary Infrared Satellite Imagery (2007). American Meteorological Society Weather and Forecasting, 22, 287-298. The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. + The quantity with standard name tropical_cyclone_eye_brightness_temperature is the warmest brightness temperature value in the eye region of a tropical cyclone (0 - 24 km from the storm center) derived using the Advanced Dvorak Technique, based on satellite observations. Reference: Olander, T. L., & Velden, C. S., The Advanced Dvorak Technique: Continued Development of an Objective Scheme to Estimate Tropical Cyclone Intensity Using Geostationary Infrared Satellite Imagery (2007). American Meteorological Society Weather and Forecasting, 22, 287-298. The brightness temperature of a body is the temperature of a black body which radiates the same power per unit solid angle per unit area. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31819,7 +32283,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31938,28 +32402,28 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. To specify the amount of cloud cover at which the data variable applies, provide a scalar coordinate variable with standard name "cloud_area_fraction". Standard names are also defined for the quantities ultraviolet_index_assuming_clear_sky and ultraviolet_index_assuming_overcast_sky. + The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. To specify the amount of cloud cover at which the data variable applies, provide a scalar coordinate variable with standard name "cloud_area_fraction". Standard names are also defined for the quantities ultraviolet_index_assuming_clear_sky and ultraviolet_index_assuming_overcast_sky. 1 - The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. Standard names are also defined for the quantities ultraviolet_index and ultraviolet_index_assuming_overcast_sky. + The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. Standard names are also defined for the quantities ultraviolet_index and ultraviolet_index_assuming_overcast_sky. 1 - The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Overcast" means a fractional sky cover of 95% or more when at least a portion of this amount is attributable to clouds or obscuring phenomena (such as haze, dust, smoke, fog, etc.) aloft. (Reference: AMS Glossary: http://glossary.ametsoc.org/wiki/Main_Page). Standard names are also defined for the quantities ultraviolet_index and ultraviolet_index_assuming_clear_sky. + The "Ultraviolet Index" (UVI) is a measure of the amount of solar ultraviolet radiation that reaches the surface of the earth depending on factors such as time of day and cloud cover. It is often used to alert the public of the need to limit sun exposure and use sun creams to protect the skin. Each point on the Index scale is equivalent to 25 mW m-2 of UV radiation (reference: Australian Bureau of Meteorology, http://www.bom.gov.au/uv/about_uv_index.shtml). The UVI range is expressed as a numeric value from 0 to 20 and sometimes graphically as bands of color indicating the attendant risk of skin damage. A UVI of 0-2 is described as 'Low' (represented graphically in green); a UVI of 11 or greater is described as "Extreme" (represented graphically in purple). The higher the UVI, the greater the potential health risk to humans and the less time it takes for harm to occur. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Overcast" means a fractional sky cover of 95% or more when at least a portion of this amount is attributable to clouds or obscuring phenomena (such as haze, dust, smoke, fog, etc.) aloft. (Reference: AMS Glossary: http://glossary.ametsoc.org/wiki/Main_Page). Standard names are also defined for the quantities ultraviolet_index and ultraviolet_index_assuming_clear_sky. degree_C - Universal Thermal Comfort Index (UTCI) is an equivalent temperature of the actual thermal condition. Reference: utci.org. It is the air temperature of a reference condition causing the same dynamic physiological response in a human body considering its energy budget, physiology and clothing adaptation. + Universal Thermal Comfort Index (UTCI) is an equivalent temperature of the actual thermal condition. Reference: utci.org. It is the air temperature of a reference condition causing the same dynamic physiological response in a human body considering its energy budget, physiology and clothing adaptation. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -31971,16 +32435,16 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. s-1 - 45 + The quantity with standard name upward_derivative_of_eastward_wind is the derivative of the eastward component of wind with respect to height. The phrase "component_derivative_of_X" means derivative of X with respect to distance in the component direction, which may be "northward", "southward", "eastward", "westward", "upward", "downward", "x" or "y". The last two indicate derivatives along the axes of the grid, in the case where they are not true longitude and latitude. A positive value indicates that X is increasing with distance along the positive direction of the axis. Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name "upward_air_velocity"). s-1 - 46 + - The quantity with standard name upward_derivative_of_northward_wind is the derivative of the northward component of wind with respect to height. The phrase "component_derivative_of_X" means derivative of X with respect to distance in the component direction, which may be "northward", "southward", "eastward", "westward", "upward", "downward", "x" or "y". The last two indicate derivatives along the axes of the grid, in the case where they are not true longitude and latitude. A positive value indicates that X is increasing with distance along the positive direction of the axis. Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name "upward_air_velocity"). + The quantity with standard name upward_derivative_of_northward_wind is the derivative of the northward component of wind speed with respect to height. The phrase "component_derivative_of_X" means derivative of X with respect to distance in the component direction, which may be "northward", "southward", "eastward", "westward", "upward", "downward", "x" or "y". The last two indicate derivatives along the axes of the grid, in the case where they are not true longitude and latitude. A positive value indicates that X is increasing with distance along the positive direction of the axis. Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component. (Vertical motion in the atmosphere has the standard name "upward_air_velocity"). @@ -32032,18 +32496,18 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. "Eliassen Palm flux" is a widely used vector in the meridional plane, and the divergence of this flux appears as a forcing in the Transformed Eulerian mean formulation of the zonal mean zonal wind equation. "Upward" indicates a vector component which is positive when directed upward (negative downward). - + W m-2 - "Land ice" means glaciers, ice-caps and ice-sheets resting on bedrock and also includes ice-shelves. "ground_level" means the land surface (including beneath snow, ice and surface water, if any). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Upward" indicates a vector component which is positive when directed upward (negative downward). The quantity with standard name upward_geothermal_heat_flux_at_ground_level_in_land_ice is the upward heat flux at the interface between the ice and bedrock. It does not include any heat flux from the ocean into an ice shelf. + "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. - + W m-2 - "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Upward" indicates a vector component which is positive when directed upward (negative downward). "Grounded ice sheet" indicates where the ice sheet rests over bedrock and is thus grounded. It excludes ice-caps, glaciers and floating ice shelves. The quantity with standard name upward_heat_flux_at_base_of_grounded_ice_sheet is the upward heat flux at the interface between the ice and bedrock. It does not include any heat flux from the ocean into an ice shelf. @@ -32193,6 +32657,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The term "longwave" means longwave radiation. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + The term "longwave" means longwave radiation. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + The term "longwave" means longwave radiation. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase assuming_condition indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 sr-1 @@ -32242,6 +32720,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. + + W/m2 + + + Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. "Clear sky" means in the absence of clouds. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + + + W/m2 + + + Upwelling radiation is radiation from below. It does not mean "net upward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. The term "shortwave" means shortwave radiation. When thought of as being incident on a surface, a radiative flux is sometimes called "irradiance". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called "vector irradiance". In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. A phrase "assuming_condition" indicates that the named quantity is the value which would obtain if all aspects of the system were unaltered except for the assumption of the circumstances specified by the condition. This 3D ozone field acts as a reference ozone field in a diagnostic call to the model's radiation scheme. It is expressed in terms of mole fraction of ozone in air. It may be observation-based or model-derived. It may be from any time period. By using the same ozone reference in the diagnostic radiation call in two model simulations and calculating differences between the radiative flux diagnostics from the prognostic call to the radiation scheme and the diagnostic call to the radiation scheme with the ozone reference, an instantaneous radiative forcing for ozone can be calculated. + + W m-2 sr-1 @@ -32253,7 +32745,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 87 - "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Vegetation" means any plants e.g. trees, shrubs, grass. The term "plants" refers to the kingdom of plants in the modern classification which excludes fungi. Plants are autotrophs i.e. "producers" of biomass using carbon obtained from carbon dioxide. + "Area fraction" is the fraction of a grid cell's horizontal area that has some characteristic of interest. It is evaluated as the area of interest divided by the grid cell area, or if the cell_methods restricts the evaluation to some portion of that grid cell (e.g. "where sea_ice"), then it is the area of interest divided by the area of the identified portion. It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. "Vegetation" means any plants e.g. trees, shrubs, grass. The term "plants" refers to the kingdom of plants in the modern classification which excludes fungi. Plants are autotrophs i.e. "producers" of biomass using carbon obtained from carbon dioxide. @@ -32351,7 +32843,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K 12 - The virtual temperature of air is the temperature at which the dry air constituent of a parcel of moist air would have the same density as the moist air at the same pressure. + The virtual temperature of air is the temperature at which the dry air constituent of a parcel of moist air would have the same density as the moist air at the same pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -32361,6 +32853,34 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The visibility is the distance at which something can be seen. + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with "specific_" instead of "volume_". A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32368,6 +32888,195 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with "specific_" instead of "volume_". The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths unless a coordinate of "radiation_wavelength" or "radiation_frequency" is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol" means that the aerosol sample has been dried from the ambient state, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32410,6 +33119,34 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Volume backwards scattering coefficient by ranging instrument is the fraction of radiative flux, per unit path length and per unit solid angle, scattered at 180 degrees angle respect to the incident radiation and obtained through ranging techniques like lidar and radar. Backwards scattering coefficient is assumed to be related to the same wavelength of incident radiation. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32417,6 +33154,195 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol" means that the aerosol sample has been dried from the ambient state, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. Backwards scattering refers to the sum of scattering into all backward angles i.e. scattering_angle exceeds pi/2 radians. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32445,18 +33371,18 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. The volume extinction Angstrom exponent is the Angstrom exponent obtained for the aerosol extinction instead that for the aerosol optical thickness. It is alpha in the following equation relating aerosol extinction (ext) at the wavelength lambda to aerosol extinction at a different wavelength lambda0: ext(lambda) = ext(lambda0) * [lambda/lambda0] ** (-1 * alpha). "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. - + m-1 - The volume extinction coefficient is the fractional change of radiative flux per unit path length. Extinction is the sum of absorption and scattering, sometimes called "attenuation". "Extinction" is the term most commonly used at optical wavelengths whereas "attenuation" is more often used at radio and radar wavelengths. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + The volume extinction coefficient is the fractional change of radiative flux per unit path length. Extinction is the sum of absorption and scattering, sometimes called "attenuation". "Extinction" is the term most commonly used at optical wavelengths whereas "attenuation" is more often used at radio and radar wavelengths. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. - + m-1 - The volume extinction coefficient is the fractional change of radiative flux per unit path length. Extinction is the sum of absorption and scattering, sometimes called "attenuation". "Extinction" is the term most commonly used at optical wavelengths whereas "attenuation" is more often used at radio and radar wavelengths. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Cloud particles" means suspended liquid or ice water droplets. A coordinate of radiation_wavelength or radiation_frequency should be included to specify either the wavelength or frequency. + The volume extinction coefficient is the fractional change of radiative flux per unit path length. Extinction is the sum of absorption and scattering, sometimes called "attenuation". "Extinction" is the term most commonly used at optical wavelengths whereas "attenuation" is more often used at radio and radar wavelengths. Radiative flux is the sum of shortwave and longwave radiative fluxes. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Cloud particles" means suspended liquid or ice water droplets. A coordinate of radiation_wavelength or radiation_frequency should be included to specify either the wavelength or frequency. @@ -32540,7 +33466,7 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. 1 - "Volume fraction" is used in the construction volume_fraction_of_X_in_Y, where X is a material constituent of Y. It is evaluated as the volume of X divided by the volume of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The volume_fraction_of_water_in_soil_at_saturation is the volume fraction at which a soil has reached it's maximum water holding capacity. + "Volume fraction" is used in the construction volume_fraction_of_X_in_Y, where X is a material constituent of Y. It is evaluated as the volume of X divided by the volume of Y (including X). It may be expressed as a fraction, a percentage, or any other dimensionless representation of a fraction. The volume_fraction_of_water_in_soil_at_saturation is the volume fraction at which a soil has reached it's maximum water holding capacity. @@ -32550,6 +33476,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. "ratio_of_X_to_Y" means X/Y. "stp" means standard temperature (0 degC) and pressure (101325 Pa). + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32557,6 +33497,13 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Radiative flux is the sum of shortwave and longwave radiative fluxes. Scattering of radiation is its deflection from its incident path without loss of energy. The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with "specific_" instead of "volume_". The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths unless a coordinate of "radiation_wavelength" or "radiation_frequency" is included to specify the wavelength. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exist in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the quantity described by the standard name applies, provide a scalar coordinate variable with the standard name of "relative_humidity". + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32564,6 +33511,195 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. Radiative flux is the sum of shortwave and longwave radiative fluxes. Scattering of radiation is its deflection from its incident path without loss of energy. The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with "specific_" instead of "volume_". The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths unless a coordinate of "radiation_wavelength" or "radiation_frequency" is included to specify the wavelength. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm1 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm10 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Dried_aerosol_particles" means that the aerosol sample has been dried from the ambient state before sizing, but that the dry state (relative humidity less than 40 per cent) has not necessarily been reached. To specify the relative humidity at which the sample was measured, provide a scalar coordinate variable with the standard name of "relative_humidity". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. + + + + m-1 + + + The volume scattering/absorption/attenuation coefficient is the fractional change of radiative flux per unit path length due to the stated process. Coefficients with canonical units of m2 s-1 i.e. multiplied by density have standard names with specific_ instead of volume_. A scattering_angle should not be specified with this quantity. The scattering/absorption/attenuation coefficient is assumed to be an integral over all wavelengths, unless a coordinate of radiation_wavelength is included to specify the wavelength. Radiative flux is the sum of shortwave and longwave radiative fluxes. "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. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Pm2p5 aerosol particles" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. "Standard_temperature_and_pressure" refer to a reference volume at 273.15 K temperature and 1013.25 hPa pressure. + + m-1 @@ -32750,14 +33886,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. m - 'Water surface height above reference datum' means the height of the upper surface of a body of liquid water, such as sea, lake or river, above an arbitrary reference datum. The altitude of the datum should be provided in a variable with standard name water_surface_reference_datum_altitude. The surface called "surface" means the lower boundary of the atmosphere. + 'Water surface height above reference datum' means the height of the upper surface of a body of liquid water, such as sea, lake or river, above an arbitrary reference datum. The altitude of the datum should be provided in a variable with standard name water_surface_reference_datum_altitude. The surface called "surface" means the lower boundary of the atmosphere. m - Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level. 'Water surface reference datum altitude' means the altitude of the arbitrary datum referred to by a quantity with standard name 'water_surface_height_above_reference_datum'. The surface called "surface" means the lower boundary of the atmosphere. + Altitude is the (geometric) height above the geoid, which is the reference geopotential surface. The geoid is similar to mean sea level. 'Water surface reference datum altitude' means the altitude of the arbitrary datum referred to by a quantity with standard name 'water_surface_height_above_reference_datum'. The surface called "surface" means the lower boundary of the atmosphere. @@ -32820,21 +33956,21 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. K - Wet bulb potential temperature is the temperature a parcel of air would have if moved dry adiabatically until it reaches saturation and thereafter moist adiabatically to sea level pressure. + Wet bulb potential temperature is the temperature a parcel of air would have if moved dry adiabatically until it reaches saturation and thereafter moist adiabatically to sea level pressure. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - + It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). K - Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name wind_chill_of_air_temperature is the perceived air temperature when wind is factored in with the ambient air temperature (which makes it feel colder than the actual air temperature). Wind chill is based on the rate of heat loss from exposed skin caused by wind and cold. Wind chill temperature is only defined for ambient temperatures at or below 283.1 K and wind speeds above 1.34 m s-1. References: https://www.weather.gov/safety/cold-wind-chill-chart; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/0-0-13. + Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The quantity with standard name wind_chill_of_air_temperature is the perceived air temperature when wind is factored in with the ambient air temperature (which makes it feel colder than the actual air temperature). Wind chill is based on the rate of heat loss from exposed skin caused by wind and cold. Wind chill temperature is only defined for ambient temperatures at or below 283.1 K and wind speeds above 1.34 m s-1. References: https://www.weather.gov/safety/cold-wind-chill-chart; WMO codes registry entry http://codes.wmo.int/grib2/codeflag/4.2/0-0-13. It is strongly recommended that a variable with this standard name should have a units_metadata attribute, with one of the values "on-scale" or "difference", whichever is appropriate for the data, because it is essential to know whether the temperature is on-scale (meaning relative to the origin of the scale indicated by the units) or refers to temperature differences (implying that the origin of the temperature scale is irrevelant), in order to convert the units correctly (cf. https://cfconventions.org/cf-conventions/cf-conventions.html#temperature-units). @@ -32978,248 +34114,248 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. - - isotropic_longwave_radiance_in_air + + mass_concentration_of_chlorophyll_in_sea_water - - isotropic_shortwave_radiance_in_air + + mass_concentration_of_chlorophyll_in_sea_water - - mole_fraction_of_ozone_in_air + + leaf_mass_content_of_carbon - - product_of_northward_wind_and_specific_humidity + + surface_drag_coefficient_for_heat_in_air - - radiation_wavelength + + surface_drag_coefficient_for_momentum_in_air - - specific_gravitational_potential_energy + + tendency_of_atmosphere_moles_of_methyl_chloride - - surface_drag_coefficient_for_heat_in_air + + atmosphere_moles_of_carbon_monoxide - - surface_drag_coefficient_for_momentum_in_air + + tendency_of_atmosphere_moles_of_molecular_hydrogen - - surface_drag_coefficient_in_air + + land_ice_lwe_surface_specific_mass_balance_rate - - sea_surface_swell_wave_period + + land_ice_surface_specific_mass_balance_rate - - sea_surface_wind_wave_period + + atmosphere_moles_of_methyl_chloride - - mass_fraction_of_convective_cloud_condensed_water_in_air + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_roots - - mass_fraction_of_ozone_in_air + + atmosphere_moles_of_molecular_hydrogen - - wave_frequency + + atmosphere_moles_of_nitrous_oxide - - northward_eliassen_palm_flux_in_air + + isotropic_radiance_per_unit_wavelength_in_air - - northward_heat_flux_in_air_due_to_eddy_advection + + isotropic_radiance_per_unit_wavelength_in_air - - upward_eliassen_palm_flux_in_air + + x_wind - - upward_eastward_momentum_flux_in_air_due_to_nonorographic_eastward_gravity_waves + + mass_concentration_of_suspended_matter_in_sea_water - - upward_eastward_momentum_flux_in_air_due_to_nonorographic_westward_gravity_waves + + kinetic_energy_dissipation_in_atmosphere_boundary_layer - - upward_eastward_momentum_flux_in_air_due_to_orographic_gravity_waves + + y_wind - - water_flux_into_sea_water + + mole_concentration_of_organic_detritus_expressed_as_nitrogen_in_sea_water - - wind_mixing_energy_flux_into_sea_water + + mole_concentration_of_organic_detritus_expressed_as_silicon_in_sea_water - - mole_fraction_of_chlorine_dioxide_in_air + + mass_content_of_cloud_condensed_water_in_atmosphere_layer - - mole_fraction_of_chlorine_monoxide_in_air + + tendency_of_atmosphere_mass_content_of_water_due_to_advection - - mole_fraction_of_hypochlorous_acid_in_air + + tendency_of_troposphere_moles_of_methane - - surface_net_downward_radiative_flux + + radiation_wavelength - - surface_temperature + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_shallow_convection - - surface_temperature + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_convection - - surface_temperature + + tendency_of_troposphere_moles_of_methyl_bromide - - surface_upward_sensible_heat_flux + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_deep_convection - - atmosphere_moles_of_carbon_monoxide + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_turbulence - - atmosphere_moles_of_methane + + mass_content_of_water_in_atmosphere_layer - - atmosphere_moles_of_methyl_bromide + + mass_content_of_water_vapor_in_atmosphere_layer - - atmosphere_moles_of_methyl_chloride + + tendency_of_troposphere_moles_of_methyl_chloride - - atmosphere_moles_of_molecular_hydrogen + + tendency_of_troposphere_moles_of_molecular_hydrogen - - atmosphere_moles_of_nitrous_oxide + + isotropic_longwave_radiance_in_air - - mass_concentration_of_suspended_matter_in_sea_water + + isotropic_shortwave_radiance_in_air - - mole_concentration_of_mesozooplankton_expressed_as_nitrogen_in_sea_water + + sea_water_x_velocity - - mole_concentration_of_microzooplankton_expressed_as_nitrogen_in_sea_water + + sea_water_y_velocity - - mole_concentration_of_organic_detritus_expressed_as_nitrogen_in_sea_water + + tendency_of_middle_atmosphere_moles_of_methane - - mole_concentration_of_organic_detritus_expressed_as_silicon_in_sea_water + + tendency_of_middle_atmosphere_moles_of_methyl_chloride - - tendency_of_atmosphere_moles_of_methyl_bromide + + tendency_of_middle_atmosphere_moles_of_molecular_hydrogen - - tendency_of_atmosphere_moles_of_methyl_chloride + + omnidirectional_spherical_irradiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_moles_of_molecular_hydrogen + + sea_surface_wind_wave_period - - tendency_of_atmosphere_moles_of_nitrous_oxide + + sea_water_volume - - tendency_of_middle_atmosphere_moles_of_carbon_monoxide + + thickness_of_stratiform_rainfall_amount - - tendency_of_middle_atmosphere_moles_of_methane + + stratiform_snowfall_flux - - tendency_of_middle_atmosphere_moles_of_methyl_bromide + + mole_fraction_of_ozone_in_air - - tendency_of_middle_atmosphere_moles_of_methyl_chloride + + product_of_northward_wind_and_specific_humidity - - tendency_of_middle_atmosphere_moles_of_molecular_hydrogen + + specific_gravitational_potential_energy - - tendency_of_troposphere_moles_of_carbon_monoxide + + surface_drag_coefficient_in_air - - tendency_of_troposphere_moles_of_methane + + sea_surface_swell_wave_period - - tendency_of_troposphere_moles_of_methyl_bromide + + mass_fraction_of_convective_cloud_condensed_water_in_air - - tendency_of_troposphere_moles_of_methyl_chloride + + mass_fraction_of_ozone_in_air - - tendency_of_troposphere_moles_of_molecular_hydrogen + + upward_eastward_momentum_flux_in_air_due_to_nonorographic_westward_gravity_waves - - atmosphere_net_upward_convective_mass_flux + + upward_eastward_momentum_flux_in_air_due_to_orographic_gravity_waves - - eastward_water_vapor_flux_in_air + + upward_eliassen_palm_flux_in_air - - kinetic_energy_dissipation_in_atmosphere_boundary_layer + + water_flux_into_sea_water - - lwe_stratiform_snowfall_rate + + wind_mixing_energy_flux_into_sea_water - - lwe_thickness_of_stratiform_snowfall_amount + + surface_net_downward_radiative_flux - - northward_water_vapor_flux_in_air + + surface_upward_sensible_heat_flux @@ -33238,34 +34374,18 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. stratiform_snowfall_amount - - stratiform_snowfall_flux - - - - thickness_of_stratiform_rainfall_amount + + lwe_stratiform_snowfall_rate - - thickness_of_stratiform_snowfall_amount + + northward_water_vapor_flux_in_air atmosphere_mass_content_of_cloud_condensed_water - - atmosphere_mass_content_of_cloud_ice - - - - atmosphere_mass_content_of_convective_cloud_condensed_water - - - - atmosphere_mass_content_of_water_vapor - - surface_downward_mole_flux_of_carbon_dioxide @@ -33274,1796 +34394,1728 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. surface_upward_mole_flux_of_carbon_dioxide - - atmosphere_mass_content_of_sulfate + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_turbulence - - atmosphere_mass_content_of_sulfate + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles - - change_over_time_in_atmosphere_mass_content_of_water_due_to_advection + + atmosphere_absorption_optical_thickness_due_to_ambient_aerosol_particles - - change_over_time_in_atmosphere_mass_content_of_water_due_to_advection + + atmosphere_mass_content_of_dust_dry_aerosol_particles - - lwe_thickness_of_atmosphere_mass_content_of_water_vapor + + atmosphere_mass_content_of_sulfate_ambient_aerosol_particles - - mass_content_of_cloud_condensed_water_in_atmosphere_layer + + atmosphere_mass_content_of_sulfate_ambient_aerosol_particles - - mass_content_of_cloud_ice_in_atmosphere_layer + + mass_concentration_of_ammonium_dry_aerosol_particles_in_air - - mass_content_of_water_in_atmosphere_layer + + mass_concentration_of_particulate_organic_matter_dry_aerosol_particles_in_air - - mass_content_of_water_vapor_in_atmosphere_layer + + mass_concentration_of_nitrate_dry_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_due_to_advection + + mass_concentration_of_water_in_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor + + mass_fraction_of_dust_dry_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_convection + + mole_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_deep_convection + + number_concentration_of_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_shallow_convection + + number_concentration_of_nucleation_mode_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_turbulence + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_wet_deposition - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_dry_deposition - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_convection + + tendency_of_atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_deep_convection + + sea_surface_wave_significant_height - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_shallow_convection + + atmosphere_mass_content_of_ammonium_dry_aerosol_particles - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_turbulence + + mass_concentration_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air - - equivalent_thickness_at_stp_of_atmosphere_ozone_content + + number_concentration_of_coarse_mode_ambient_aerosol_particles_in_air - - sea_water_x_velocity + + mass_fraction_of_particulate_organic_matter_dry_aerosol_particles_in_air - - sea_water_y_velocity + + mass_fraction_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air - - x_wind + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - y_wind + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_advection - - - - land_ice_surface_specific_mass_balance_rate - - - - land_ice_lwe_surface_specific_mass_balance_rate - - - - isotropic_radiance_per_unit_wavelength_in_air - - - - isotropic_radiance_per_unit_wavelength_in_air - - - - omnidirectional_spherical_irradiance_per_unit_wavelength_in_sea_water - - - - mass_concentration_of_chlorophyll_in_sea_water - - - - mass_concentration_of_chlorophyll_in_sea_water - - - - atmosphere_convective_available_potential_energy - - - - atmosphere_convective_available_potential_energy - - - - gross_primary_productivity_of_biomass_expressed_as_carbon - - - - net_primary_productivity_of_biomass_expressed_as_carbon - - - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_leaves - - - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_roots - - - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_wood - - - - atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles - - - - atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles - - - - mass_fraction_of_particulate_organic_matter_dry_aerosol_particles_in_air + + mass_concentration_of_dust_dry_aerosol_particles_in_air - - mass_fraction_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air + + mass_concentration_of_sulfate_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + mass_concentration_of_sulfate_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_gravitational_settling + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_energy_production_and_distribution - - 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_expressed_as_carbon_due_to_emission_from_industrial_processes_and_combustion - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + mass_fraction_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + mass_fraction_of_water_in_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + mass_concentration_of_sulfate_dry_aerosol_particles_in_air - - atmosphere_absorption_optical_thickness_due_to_ambient_aerosol_particles + + mass_fraction_of_nitrate_dry_aerosol_particles_in_air - - angstrom_exponent_of_ambient_aerosol_in_air + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_dry_deposition - - atmosphere_absorption_optical_thickness_due_to_dust_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_wet_deposition - - atmosphere_absorption_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_residential_and_commercial_combustion - - atmosphere_absorption_optical_thickness_due_to_sulfate_ambient_aerosol_particles + + atmosphere_mass_content_of_water_in_ambient_aerosol_particles - - atmosphere_mass_content_of_ammonium_dry_aerosol_particles + + mass_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - atmosphere_mass_content_of_dust_dry_aerosol_particles + + atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles - - atmosphere_mass_content_of_mercury_dry_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_emission - - atmosphere_mass_content_of_nitrate_dry_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition - - atmosphere_mass_content_of_nitric_acid_trihydrate_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition - - atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles + + sea_surface_swell_wave_significant_height - - atmosphere_mass_content_of_sulfate_ambient_aerosol_particles + + sea_surface_wind_wave_significant_height - - atmosphere_mass_content_of_sulfate_ambient_aerosol_particles + + mass_content_of_water_in_soil - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles + + mass_content_of_water_in_soil_layer - - atmosphere_mass_content_of_water_in_ambient_aerosol_particles + + sea_surface_swell_wave_to_direction - - atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles + + sea_surface_wind_wave_to_direction - - atmosphere_optical_thickness_due_to_ambient_aerosol_particles + + sea_surface_swell_wave_mean_period - - atmosphere_optical_thickness_due_to_ambient_aerosol_particles + + sea_surface_wave_mean_period - - atmosphere_optical_thickness_due_to_dust_ambient_aerosol_particles + + sea_surface_wind_wave_mean_period - - atmosphere_optical_thickness_due_to_dust_dry_aerosol_particles + + ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity_deficit - - atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles + + sea_floor_depth_below_mean_sea_level - - mass_concentration_of_dust_dry_aerosol_particles_in_air + + air_pressure_at_mean_sea_level - - mass_concentration_of_coarse_mode_ambient_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - mass_concentration_of_ammonium_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur + + atmosphere_mass_content_of_sea_salt_dry_aerosol_particles - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur + + atmosphere_mass_content_of_sea_salt_dry_aerosol_particles - - mass_concentration_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air + + atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - mass_concentration_of_particulate_organic_matter_dry_aerosol_particles_in_air + + atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - atmosphere_optical_thickness_due_to_water_in_ambient_aerosol_particles + + mass_concentration_of_sea_salt_dry_aerosol_particles_in_air - - mass_concentration_of_mercury_dry_aerosol_particles_in_air + + mass_concentration_of_sea_salt_dry_aerosol_particles_in_air - - mass_concentration_of_nitrate_dry_aerosol_particles_in_air + + mass_fraction_of_sea_salt_dry_aerosol_particles_in_air - - mass_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + mass_fraction_of_sea_salt_dry_aerosol_particles_in_air - - mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - mass_concentration_of_sulfate_ambient_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - mass_concentration_of_sulfate_ambient_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - mass_concentration_of_sulfate_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - mass_concentration_of_water_in_ambient_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - mass_fraction_of_ammonium_dry_aerosol_particles_in_air + + atmosphere_optical_thickness_due_to_pm1_ambient_aerosol_particles - - mass_fraction_of_dust_dry_aerosol_particles_in_air + + mass_concentration_of_pm1_ambient_aerosol_particles_in_air - - mass_fraction_of_nitrate_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition - - mass_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition - - mass_fraction_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling - - mass_fraction_of_sulfate_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling - - mass_fraction_of_water_in_ambient_aerosol_particles_in_air + + mass_fraction_of_pm1_ambient_aerosol_particles_in_air - - mole_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + mass_fraction_of_pm1_ambient_aerosol_particles_in_air - - mole_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + atmosphere_optical_thickness_due_to_pm2p5_ambient_aerosol_particles - - number_concentration_of_ambient_aerosol_particles_in_air + + mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air - - number_concentration_of_coarse_mode_ambient_aerosol_particles_in_air + + mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air - - number_concentration_of_nucleation_mode_ambient_aerosol_particles_in_air + + mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air - - optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles + + surface_geostrophic_eastward_sea_water_velocity - - optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles + + atmosphere_optical_thickness_due_to_pm10_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_dry_deposition + + mass_concentration_of_pm10_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_wet_deposition + + mass_fraction_of_pm10_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_dry_deposition + + mass_fraction_of_pm10_ambient_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_gravitational_settling + + tendency_of_sea_surface_height_above_mean_sea_level - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_turbulent_deposition + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_wet_deposition + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_dry_deposition + + surface_geostrophic_sea_water_x_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_wet_deposition + + surface_geostrophic_northward_sea_water_velocity - - tendency_of_atmosphere_mass_content_of_nitrate_dry_aerosol_particles_due_to_dry_deposition + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_dry_deposition - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_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_pm10_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production + + atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_dry_deposition + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition + + sea_floor_depth_below_geoid - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling + + surface_geostrophic_sea_water_y_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling + + surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition + + surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition + + sea_surface_height_above_mean_sea_level - - tendency_of_atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles + + sea_surface_height_above_mean_sea_level - - tendency_of_atmosphere_moles_of_sulfate_dry_aerosol_particles + + surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_emission + + surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_emission + + sea_surface_height_above_geoid - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_residential_and_commercial_combustion + + sea_surface_height_above_geoid - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_waste_treatment_and_disposal + + lagrangian_tendency_of_air_pressure - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_savanna_and_grassland_fires + + lagrangian_tendency_of_air_pressure - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_emission + + mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_land_transport + + atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_agricultural_waste_burning + + mass_fraction_of_elemental_carbon_dry_aerosol_particles_in_air - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_energy_production_and_distribution + + tendency_of_atmosphere_mass_content_of_elemental_carbon_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_maritime_transport + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_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_elemental_carbon_dry_aerosol_particles_due_to_emission_from_energy_production_and_distribution - - 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_elemental_carbon_dry_aerosol_particles_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_forest_fires + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_industrial_processes_and_combustion - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_industrial_processes_and_combustion + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_land_transport - - sea_surface_swell_wave_significant_height + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_maritime_transport - - sea_surface_wind_wave_significant_height + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_residential_and_commercial_combustion - - sea_surface_wave_significant_height + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_savanna_and_grassland_fires - - mass_content_of_water_in_soil_layer + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_waste_treatment_and_disposal - - mass_content_of_water_in_soil + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_gravitational_settling - - sea_surface_swell_wave_to_direction + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_turbulent_deposition - - sea_surface_wind_wave_to_direction + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_wet_deposition - - sea_surface_wave_mean_period + + tendency_of_mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air_due_to_emission_from_aviation - - sea_surface_wind_wave_mean_period + + atmosphere_convective_available_potential_energy - - sea_surface_swell_wave_mean_period + + atmosphere_convective_available_potential_energy - - ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity_deficit + + angstrom_exponent_of_ambient_aerosol_in_air - - atmosphere_mass_content_of_sea_salt_dry_aerosol_particles + + atmosphere_absorption_optical_thickness_due_to_dust_ambient_aerosol_particles - - atmosphere_mass_content_of_sea_salt_dry_aerosol_particles + + atmosphere_absorption_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles - - atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + atmosphere_absorption_optical_thickness_due_to_sulfate_ambient_aerosol_particles - - atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_dry_deposition - - mass_concentration_of_sea_salt_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_wet_deposition - - mass_concentration_of_sea_salt_dry_aerosol_particles_in_air + + integral_wrt_time_of_surface_downward_latent_heat_flux - - mass_fraction_of_sea_salt_dry_aerosol_particles_in_air + + integral_wrt_time_of_surface_downward_sensible_heat_flux - - mass_fraction_of_sea_salt_dry_aerosol_particles_in_air + + integral_wrt_time_of_surface_net_downward_longwave_flux - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_emission + + integral_wrt_time_of_toa_net_downward_shortwave_flux - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + integral_wrt_time_of_toa_outgoing_longwave_flux - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + northward_ocean_salt_transport_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + ocean_heat_x_transport_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling + + ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling + + ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition + + ocean_heat_y_transport_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition + + northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection - - atmosphere_optical_thickness_due_to_pm1_ambient_aerosol_particles + + sea_water_y_velocity_due_to_parameterized_mesoscale_eddies - - mass_concentration_of_pm1_ambient_aerosol_particles_in_air + + tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection - - mass_fraction_of_pm1_ambient_aerosol_particles_in_air + + integral_wrt_time_of_surface_net_downward_shortwave_flux - - mass_fraction_of_pm1_ambient_aerosol_particles_in_air + + tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection - - atmosphere_optical_thickness_due_to_pm2p5_ambient_aerosol_particles + + upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air + + northward_ocean_heat_transport_due_to_parameterized_eddy_advection - - mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air + + sea_water_x_velocity_due_to_parameterized_mesoscale_eddies - - mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air + + ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection - - atmosphere_optical_thickness_due_to_pm10_ambient_aerosol_particles + + ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection - - mass_concentration_of_pm10_ambient_aerosol_particles_in_air + + lwe_stratiform_precipitation_rate - - mass_fraction_of_pm10_ambient_aerosol_particles_in_air + + litter_mass_content_of_carbon - - mass_fraction_of_pm10_ambient_aerosol_particles_in_air + + stratiform_precipitation_flux - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_emission + + atmosphere_moles_of_carbon_tetrachloride - - sea_floor_depth_below_mean_sea_level + + mole_concentration_of_dissolved_inorganic_14C_in_sea_water - - sea_surface_height_above_mean_sea_level + + stem_mass_content_of_carbon - - sea_surface_height_above_mean_sea_level + + subsurface_litter_mass_content_of_carbon - - surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + mass_flux_of_carbon_into_litter_from_vegetation - - surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + eastward_transformed_eulerian_mean_air_velocity - - surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + northward_transformed_eulerian_mean_air_velocity - - surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil - - surface_geostrophic_sea_water_x_velocity_assuming_mean_sea_level_for_geoid + + surface_litter_mass_content_of_carbon - - surface_geostrophic_sea_water_y_velocity_assuming_mean_sea_level_for_geoid + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth - - tendency_of_sea_surface_height_above_mean_sea_level + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance - - surface_geostrophic_northward_sea_water_velocity + + carbon_mass_content_of_forestry_and_agricultural_products - - surface_geostrophic_eastward_sea_water_velocity + + carbon_mass_content_of_forestry_and_agricultural_products - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_dry_deposition + + miscellaneous_living_matter_mass_content_of_carbon - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_deposition + + root_mass_content_of_carbon - - atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + slow_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_sea_salt_dry_aerosol_particles_due_to_emission + + fast_soil_pool_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 - - sea_surface_height_above_geoid + + mole_concentration_of_dissolved_inorganic_13C_in_sea_water - - sea_surface_height_above_geoid + + surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon - - sea_floor_depth_below_geoid + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration - - air_pressure_at_mean_sea_level + + medium_soil_pool_mass_content_of_carbon - - lagrangian_tendency_of_air_pressure + + integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity - - lagrangian_tendency_of_air_pressure + + integral_wrt_depth_of_sea_water_practical_salinity - - mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air + + integral_wrt_height_of_product_of_northward_wind_and_specific_humidity - - atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles + + volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles - - mass_fraction_of_elemental_carbon_dry_aerosol_particles_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_dry_deposition + + water_flux_into_sea_water_from_rivers - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission + + wood_debris_mass_content_of_carbon - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_energy_production_and_distribution + + toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_forest_fires + + stratiform_graupel_flux - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_industrial_processes_and_combustion + + surface_water_evaporation_flux - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_land_transport + + water_volume_transport_into_sea_water_from_rivers - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_maritime_transport + + surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_residential_and_commercial_combustion + + surface_upwelling_radiance_per_unit_wavelength_in_air - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_savanna_and_grassland_fires + + surface_upwelling_radiative_flux_per_unit_wavelength_in_air - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_waste_treatment_and_disposal + + surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_gravitational_settling + + surface_upwelling_longwave_flux_in_air - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_turbulent_deposition + + incoming_water_volume_transport_along_river_channel - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_wet_deposition + + surface_upwelling_radiance_per_unit_wavelength_in_sea_water - - tendency_of_mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air_due_to_emission_from_aviation + + surface_upwelling_shortwave_flux_in_air - - integral_wrt_time_of_air_temperature_deficit + + surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - integral_wrt_time_of_air_temperature_excess + + upwelling_radiance_per_unit_wavelength_in_air - - integral_wrt_time_of_surface_downward_latent_heat_flux + + upwelling_radiative_flux_per_unit_wavelength_in_air - - integral_wrt_time_of_surface_downward_sensible_heat_flux + + upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - integral_wrt_time_of_surface_net_downward_longwave_flux + + surface_upwelling_longwave_flux_in_air_assuming_clear_sky - - integral_wrt_time_of_surface_net_downward_shortwave_flux + + surface_upwelling_shortwave_flux_in_air_assuming_clear_sky - - integral_wrt_time_of_toa_net_downward_shortwave_flux + + downwelling_photon_radiance_per_unit_wavelength_in_sea_water - - integral_wrt_time_of_toa_outgoing_longwave_flux + + downwelling_radiance_per_unit_wavelength_in_air - - northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection + + downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water - - northward_ocean_salt_transport_due_to_parameterized_eddy_advection + + downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - ocean_heat_x_transport_due_to_parameterized_eddy_advection + + downwelling_radiative_flux_per_unit_wavelength_in_air - - ocean_heat_y_transport_due_to_parameterized_eddy_advection + + downwelling_radiative_flux_per_unit_wavelength_in_sea_water - - ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection + + downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water - - ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection + + surface_downwelling_longwave_flux_in_air - - ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection + + integral_wrt_time_of_surface_downwelling_longwave_flux_in_air - - ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection + + integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air - - tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection + + surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water - - tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection + + surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water - - northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + surface_downwelling_radiative_flux_per_unit_wavelength_in_air - - sea_water_x_velocity_due_to_parameterized_mesoscale_eddies + + surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water - - sea_water_y_velocity_due_to_parameterized_mesoscale_eddies + + magnitude_of_sea_ice_displacement - - upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + lwe_thickness_of_stratiform_precipitation_amount - - ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection + + outgoing_water_volume_transport_along_river_channel - - ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection + + sea_ice_temperature_expressed_as_heat_content - - tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection + + sea_ice_temperature_expressed_as_heat_content - - northward_ocean_heat_transport_due_to_parameterized_eddy_advection + + sea_water_potential_temperature_expressed_as_heat_content - - mole_concentration_of_dissolved_inorganic_13C_in_sea_water + + sea_water_potential_temperature_expressed_as_heat_content - - surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C + + tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice - - surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon + + surface_downwelling_shortwave_flux_in_air - - mole_concentration_of_dissolved_inorganic_14C_in_sea_water + + surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water - - stem_mass_content_of_carbon + + surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water - - subsurface_litter_mass_content_of_carbon + + surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water - - mass_flux_of_carbon_into_litter_from_vegetation + + downwelling_radiance_per_unit_wavelength_in_sea_water - - litter_mass_content_of_carbon + + downwelling_photon_flux_per_unit_wavelength_in_sea_water - - surface_litter_mass_content_of_carbon + + upwelling_radiative_flux_per_unit_wavelength_in_sea_water - - eastward_transformed_eulerian_mean_air_velocity + + surface_downwelling_radiance_per_unit_wavelength_in_sea_water - - northward_transformed_eulerian_mean_air_velocity + + surface_downwelling_shortwave_flux_in_air_assuming_clear_sky - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration + + precipitation_flux_onto_canopy - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil + + water_evaporation_flux_from_canopy - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration + + atmosphere_mass_content_of_convective_cloud_condensed_water - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_dry_deposition - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance + + tendency_of_atmosphere_moles_of_nitrous_oxide - - carbon_mass_content_of_forestry_and_agricultural_products + + lwe_convective_precipitation_rate - - carbon_mass_content_of_forestry_and_agricultural_products + + stratiform_precipitation_amount - - leaf_mass_content_of_carbon + + atmosphere_mass_content_of_cloud_ice - - medium_soil_pool_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_emission - - fast_soil_pool_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_gravitational_settling - - miscellaneous_living_matter_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_turbulent_deposition - - root_mass_content_of_carbon + + water_evaporation_amount_from_canopy - - slow_soil_pool_mass_content_of_carbon + + tendency_of_specific_humidity_due_to_stratiform_precipitation - - soil_mass_content_of_carbon + + platform_pitch - - volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles + + platform_id - - volume_scattering_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles + + platform_name - - integral_wrt_depth_of_sea_water_practical_salinity + + water_vapor_partial_pressure_in_air - - integral_wrt_depth_of_sea_water_temperature + + platform_roll - - integral_wrt_depth_of_sea_water_temperature + + platform_yaw - - integral_wrt_depth_of_sea_water_temperature + + tendency_of_atmosphere_mole_concentration_of_carbon_monoxide_due_to_chemical_destruction - - integral_wrt_depth_of_sea_water_temperature + + tendency_of_mole_concentration_of_dissolved_inorganic_silicon_in_sea_water_due_to_biological_processes - - integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity + + tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes - - integral_wrt_height_of_product_of_northward_wind_and_specific_humidity + + mole_concentration_of_diatoms_expressed_as_nitrogen_in_sea_water - - water_flux_into_sea_water_from_rivers + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_calcareous_phytoplankton - - toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diatoms - - wood_debris_mass_content_of_carbon + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_phytoplankton - - stratiform_graupel_flux + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_picophytoplankton - - water_volume_transport_into_sea_water_from_rivers + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_due_to_nitrate_utilization - - surface_water_evaporation_flux + + mole_concentration_of_phytoplankton_expressed_as_nitrogen_in_sea_water - - sea_ice_temperature_expressed_as_heat_content + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_wet_deposition - - sea_ice_temperature_expressed_as_heat_content + + tendency_of_atmosphere_moles_of_carbon_monoxide - - sea_water_potential_temperature_expressed_as_heat_content + + tendency_of_atmosphere_moles_of_carbon_tetrachloride - - sea_water_potential_temperature_expressed_as_heat_content + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning - - incoming_water_volume_transport_along_river_channel + + water_vapor_saturation_deficit_in_air - - surface_upwelling_longwave_flux_in_air + + mole_fraction_of_inorganic_bromine_in_air - - surface_upwelling_radiance_per_unit_wavelength_in_air + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton - - surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water + + tendency_of_atmosphere_moles_of_methane - - surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water + + mole_fraction_of_noy_expressed_as_nitrogen_in_air - - surface_upwelling_radiance_per_unit_wavelength_in_sea_water + + mole_fraction_of_methylglyoxal_in_air - - surface_upwelling_radiative_flux_per_unit_wavelength_in_air + + atmosphere_moles_of_hcc140a - - surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water + + mass_fraction_of_mercury_dry_aerosol_particles_in_air - - surface_upwelling_shortwave_flux_in_air + + carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change - - surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure - - upwelling_radiance_per_unit_wavelength_in_air + + atmosphere_moles_of_halon2402 - - upwelling_radiative_flux_per_unit_wavelength_in_air + + effective_radius_of_convective_cloud_snow_particles - - upwelling_radiative_flux_per_unit_wavelength_in_sea_water + + effective_radius_of_stratiform_cloud_rain_particles - - upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + effective_radius_of_stratiform_cloud_graupel_particles - - surface_upwelling_longwave_flux_in_air_assuming_clear_sky + + effective_radius_of_convective_cloud_ice_particles - - surface_upwelling_shortwave_flux_in_air_assuming_clear_sky + + effective_radius_of_stratiform_cloud_ice_particles - - downwelling_photon_flux_per_unit_wavelength_in_sea_water + + diameter_of_ambient_aerosol_particles - - downwelling_photon_radiance_per_unit_wavelength_in_sea_water + + lagrangian_tendency_of_atmosphere_sigma_coordinate - - downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water + + lagrangian_tendency_of_atmosphere_sigma_coordinate - - downwelling_radiance_per_unit_wavelength_in_air + + tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition - - downwelling_radiance_per_unit_wavelength_in_sea_water + + atmosphere_moles_of_hcfc22 - - downwelling_radiative_flux_per_unit_wavelength_in_air + + tendency_of_atmosphere_moles_of_hcfc22 - - downwelling_radiative_flux_per_unit_wavelength_in_sea_water + + tendency_of_troposphere_moles_of_hcfc22 - - downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + tendency_of_middle_atmosphere_moles_of_hcc140a - - downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_troposphere_moles_of_hcc140a - - integral_wrt_time_of_surface_downwelling_longwave_flux_in_air + + effective_radius_of_convective_cloud_rain_particles - - integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air + + tendency_of_atmosphere_moles_of_hcc140a - - surface_downwelling_longwave_flux_in_air + + tendency_of_atmosphere_moles_of_halon2402 - - surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water + + atmosphere_moles_of_halon1301 - - surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water + + atmosphere_moles_of_cfc115 - - surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_moles_of_halon1301 - - surface_downwelling_radiance_per_unit_wavelength_in_sea_water + + atmosphere_moles_of_halon1211 - - surface_downwelling_radiative_flux_per_unit_wavelength_in_air + + tendency_of_atmosphere_moles_of_halon1211 - - surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water + + atmosphere_moles_of_halon1202 - - surface_downwelling_shortwave_flux_in_air + + tendency_of_atmosphere_moles_of_halon1202 - - surface_downwelling_shortwave_flux_in_air_assuming_clear_sky + + atmosphere_moles_of_cfc12 - - surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + tendency_of_atmosphere_moles_of_cfc12 - - surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_moles_of_cfc115 - - magnitude_of_sea_ice_displacement + + atmosphere_moles_of_cfc114 - - tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice + + tendency_of_atmosphere_moles_of_cfc114 - - outgoing_water_volume_transport_along_river_channel + + atmosphere_moles_of_cfc113 - - precipitation_flux_onto_canopy + + tendency_of_atmosphere_moles_of_cfc113 - - water_evaporation_flux_from_canopy + + atmosphere_moles_of_cfc11 - - water_evaporation_amount_from_canopy + + moles_of_cfc11_per_unit_mass_in_sea_water - - lwe_stratiform_precipitation_rate + + tendency_of_atmosphere_moles_of_cfc11 - - lwe_thickness_of_stratiform_precipitation_amount + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition - - stratiform_precipitation_amount + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition - - stratiform_precipitation_flux + + product_of_northward_wind_and_lagrangian_tendency_of_air_pressure - - tendency_of_air_temperature_due_to_stratiform_precipitation + + backscattering_ratio_in_air - - tendency_of_specific_humidity_due_to_stratiform_precipitation + + atmosphere_mass_content_of_mercury_dry_aerosol_particles - - platform_roll + + atmosphere_mass_content_of_nitrate_dry_aerosol_particles - - platform_pitch + + atmosphere_mass_content_of_nitric_acid_trihydrate_ambient_aerosol_particles - - platform_yaw + + mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air - - platform_id + + effective_radius_of_stratiform_cloud_snow_particles - - platform_name + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_emission - - water_vapor_partial_pressure_in_air + + histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid - - volume_extinction_coefficient_in_air_due_to_ambient_aerosol_particles + + electrical_mobility_diameter_of_ambient_aerosol_particles - - tendency_of_atmosphere_mole_concentration_of_carbon_monoxide_due_to_chemical_destruction + + atmosphere_moles_of_methane - - tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes + + tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing - - tendency_of_mole_concentration_of_dissolved_inorganic_silicon_in_sea_water_due_to_biological_processes + + product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height - - mole_concentration_of_diatoms_expressed_as_nitrogen_in_sea_water + + volume_fraction_of_condensed_water_in_soil - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_calcareous_phytoplankton + + volume_fraction_of_condensed_water_in_soil_at_critical_point - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diatoms + + volume_fraction_of_condensed_water_in_soil_at_field_capacity - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_phytoplankton + + volume_fraction_of_condensed_water_in_soil_at_wilting_point - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_picophytoplankton + + tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_due_to_nitrate_utilization + + tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing - - mole_concentration_of_phytoplankton_expressed_as_nitrogen_in_sea_water + + product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_wet_deposition + + product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity - - tendency_of_atmosphere_moles_of_carbon_monoxide + + atmosphere_moles_of_methyl_bromide - - tendency_of_atmosphere_moles_of_carbon_tetrachloride + + tendency_of_atmosphere_moles_of_methyl_bromide - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning + + integral_wrt_depth_of_product_of_salinity_and_sea_water_density - - water_vapor_saturation_deficit_in_air + + atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles - - mole_fraction_of_inorganic_bromine_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_gravitational_settling - - rate_of_hydroxyl_radical_destruction_due_to_reaction_with_nmvoc + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission - - tendency_of_atmosphere_moles_of_methane + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission - - mole_fraction_of_noy_expressed_as_nitrogen_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_turbulent_deposition - - mole_fraction_of_dichlorine_peroxide_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - mole_fraction_of_methylglyoxal_in_air + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - atmosphere_moles_of_carbon_tetrachloride + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition - - floating_ice_shelf_area_fraction + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition - - stratiform_cloud_area_fraction + + 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_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition + + 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_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_land_transport - - mass_fraction_of_mercury_dry_aerosol_particles_in_air + + 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_mercury_dry_aerosol_particles_due_to_emission + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_savanna_and_grassland_fires - - carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_waste_treatment_and_disposal - - product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure + + atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles - - product_of_northward_wind_and_lagrangian_tendency_of_air_pressure + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_convection - - backscattering_ratio_in_air + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_deep_convection - - histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid + + atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles - - effective_radius_of_convective_cloud_ice_particles + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - effective_radius_of_convective_cloud_rain_particles + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production - - effective_radius_of_convective_cloud_snow_particles + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production - - effective_radius_of_stratiform_cloud_graupel_particles + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - effective_radius_of_stratiform_cloud_ice_particles + + atmosphere_mass_content_of_sulfate - - effective_radius_of_stratiform_cloud_rain_particles + + atmosphere_mass_content_of_sulfate - - mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur - - diameter_of_ambient_aerosol_particles + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur - - electrical_mobility_diameter_of_ambient_aerosol_particles + + tendency_of_middle_atmosphere_moles_of_methyl_bromide - - lagrangian_tendency_of_atmosphere_sigma_coordinate + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling - - lagrangian_tendency_of_atmosphere_sigma_coordinate + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling - - tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition + + atmosphere_mass_content_of_water_vapor - - atmosphere_moles_of_hcfc22 + + change_over_time_in_atmosphere_mass_content_of_water_due_to_advection - - tendency_of_atmosphere_moles_of_hcfc22 + + change_over_time_in_atmosphere_mass_content_of_water_due_to_advection - - tendency_of_troposphere_moles_of_hcfc22 + + lwe_thickness_of_atmosphere_mass_content_of_water_vapor - - tendency_of_middle_atmosphere_moles_of_hcc140a + + tendency_of_atmosphere_mass_content_of_water_vapor - - tendency_of_troposphere_moles_of_hcc140a + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_advection - - atmosphere_moles_of_hcc140a + + tendency_of_middle_atmosphere_moles_of_carbon_monoxide - - tendency_of_atmosphere_moles_of_hcc140a + + atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles - - atmosphere_moles_of_halon2402 + + atmosphere_net_upward_convective_mass_flux - - tendency_of_atmosphere_moles_of_halon2402 + + atmosphere_optical_thickness_due_to_ambient_aerosol_particles - - atmosphere_moles_of_halon1301 + + atmosphere_optical_thickness_due_to_ambient_aerosol_particles - - tendency_of_atmosphere_moles_of_halon1301 + + atmosphere_optical_thickness_due_to_dust_ambient_aerosol_particles - - atmosphere_moles_of_halon1211 + + atmosphere_optical_thickness_due_to_dust_dry_aerosol_particles - - tendency_of_atmosphere_moles_of_halon1211 + + equivalent_thickness_at_stp_of_atmosphere_ozone_content - - atmosphere_moles_of_halon1202 + + lwe_thickness_of_stratiform_snowfall_amount - - tendency_of_atmosphere_moles_of_halon1202 + + atmosphere_optical_thickness_due_to_water_in_ambient_aerosol_particles - - atmosphere_moles_of_cfc12 + + optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles - - tendency_of_atmosphere_moles_of_cfc12 + + optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles - - atmosphere_moles_of_cfc115 + + thickness_of_stratiform_snowfall_amount - - tendency_of_atmosphere_moles_of_cfc115 + + sea_water_velocity_from_direction - - atmosphere_moles_of_cfc114 + + eastward_water_vapor_flux_in_air - - tendency_of_atmosphere_moles_of_cfc114 + + gross_primary_productivity_of_biomass_expressed_as_carbon - - atmosphere_moles_of_cfc113 + + sea_water_velocity_to_direction - - tendency_of_atmosphere_moles_of_cfc113 + + sea_water_velocity_to_direction - - atmosphere_moles_of_cfc11 + + mass_concentration_of_coarse_mode_ambient_aerosol_particles_in_air - - moles_of_cfc11_per_unit_mass_in_sea_water + + mass_concentration_of_mercury_dry_aerosol_particles_in_air - - tendency_of_atmosphere_moles_of_cfc11 + + mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air - - effective_radius_of_stratiform_cloud_snow_particles + + mass_content_of_cloud_ice_in_atmosphere_layer - - tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer - - tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_shallow_convection - - tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing + + mass_fraction_of_ammonium_dry_aerosol_particles_in_air - - product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + mass_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + mass_fraction_of_sulfate_dry_aerosol_particles_in_air - - product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height + + atmosphere_mass_content_of_cloud_liquid_water - - product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity + + effective_radius_of_stratiform_cloud_liquid_water_particles - - product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity + + effective_radius_of_cloud_liquid_water_particles - - volume_fraction_of_condensed_water_in_soil + + effective_radius_of_convective_cloud_liquid_water_particles - - volume_fraction_of_condensed_water_in_soil_at_critical_point + + effective_radius_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top - - volume_fraction_of_condensed_water_in_soil_at_field_capacity + + effective_radius_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top - - volume_fraction_of_condensed_water_in_soil_at_wilting_point + + mole_concentration_of_mesozooplankton_expressed_as_nitrogen_in_sea_water - - integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density + + mole_concentration_of_microzooplankton_expressed_as_nitrogen_in_sea_water - - integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density + + mole_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - integral_wrt_depth_of_product_of_salinity_and_sea_water_density + + net_primary_productivity_of_biomass_expressed_as_carbon - - sea_water_velocity_to_direction + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_leaves - - sea_water_velocity_to_direction + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_wood - - sea_water_velocity_from_direction + + northward_eliassen_palm_flux_in_air - - atmosphere_mass_content_of_cloud_liquid_water + + northward_heat_flux_in_air_due_to_eddy_advection - - effective_radius_of_cloud_liquid_water_particles + + tendency_of_atmosphere_mass_content_of_nitrate_dry_aerosol_particles_due_to_dry_deposition - - effective_radius_of_convective_cloud_liquid_water_particles + + tendency_of_atmosphere_moles_of_sulfate_dry_aerosol_particles - - effective_radius_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top + + tendency_of_troposphere_moles_of_carbon_monoxide - - effective_radius_of_stratiform_cloud_liquid_water_particles + + upward_eastward_momentum_flux_in_air_due_to_nonorographic_eastward_gravity_waves - - effective_radius_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top + + wave_frequency @@ -35074,22 +36126,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. number_concentration_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top - - air_equivalent_potential_temperature + + biological_taxon_lsid mass_content_of_cloud_liquid_water_in_atmosphere_layer - - air_pseudo_equivalent_temperature - - - - air_equivalent_temperature - - effective_radius_of_cloud_liquid_water_particles_at_liquid_water_cloud_top @@ -35098,60 +36142,56 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. atmosphere_mass_content_of_convective_cloud_liquid_water - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_riming_from_cloud_liquid_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_heterogeneous_nucleation_from_cloud_liquid_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_melting_to_cloud_liquid_water + + nitrogen_growth_limitation_of_diazotrophic_phytoplankton - - air_pseudo_equivalent_potential_temperature + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_riming_from_cloud_liquid_water - - growth_limitation_of_diazotrophic_phytoplankton_due_to_solar_irradiance + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_heterogeneous_nucleation_from_cloud_liquid_water - - iron_growth_limitation_of_diazotrophic_phytoplankton + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_melting_to_cloud_liquid_water mass_concentration_of_diazotrophic_phytoplankton_expressed_as_chlorophyll_in_sea_water - - mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water - - - - 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 + + mass_fraction_of_liquid_precipitation_in_air - - nitrogen_growth_limitation_of_diazotrophic_phytoplankton + + mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water tendency_of_mole_concentration_of_particulate_organic_matter_expressed_as_carbon_in_sea_water_due_to_net_primary_production_by_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 + + iron_growth_limitation_of_diazotrophic_phytoplankton @@ -35162,24 +36202,20 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. area_type - - upward_derivative_of_eastward_wind - - upward_derivative_of_northward_wind - - atmosphere_upward_absolute_vorticity - - atmosphere_upward_relative_vorticity - - surface_snow_density + + atmosphere_upward_absolute_vorticity + + + + upward_derivative_of_eastward_wind @@ -35194,10 +36230,6 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. integral_wrt_time_of_surface_downward_eastward_stress - - temperature_in_surface_snow - - thermal_energy_content_of_surface_snow @@ -35214,22 +36246,14 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. soot_content_of_surface_snow - - biological_taxon_lsid - - - - temperature_in_ground + + surface_snow_density water_evapotranspiration_flux - - drainage_amount_through_base_of_soil_model - - moles_of_particulate_inorganic_carbon_per_unit_mass_in_sea_water @@ -35238,34 +36262,30 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. drainage_amount_through_base_of_soil_model - - universal_thermal_comfort_index + + heat_flux_into_sea_water_due_to_flux_adjustment water_flux_into_sea_water_due_to_flux_adjustment - - heat_flux_into_sea_water_due_to_flux_adjustment + + volume_extinction_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles - - upward_derivative_of_eastward_wind + + volume_extinction_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles - - upward_derivative_of_northward_wind + + volume_extinction_coefficient_of_radiative_flux_in_air_due_to_cloud_particles volume_backwards_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles - - volume_attenuated_backwards_scattering_coefficient_of_radiative_flux_in_air_assuming_no_aerosol_or_cloud - - volume_attenuated_backwards_scattering_coefficient_of_radiative_flux_in_air @@ -35273,6 +36293,114 @@ http://vocab.nerc.ac.uk/collection/P01/current/TPHSDSZZ/6/. volume_absorption_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles + + + volume_attenuated_backwards_scattering_coefficient_of_radiative_flux_in_air_assuming_no_aerosol_or_cloud + + + + air_equivalent_temperature + + + + air_equivalent_potential_temperature + + + + air_pseudo_equivalent_potential_temperature + + + + air_pseudo_equivalent_temperature + + + + surface_temperature + + + + surface_temperature + + + + surface_temperature + + + + temperature_in_ground + + + + temperature_in_surface_snow + + + + integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density + + + + integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density + + + + integral_wrt_depth_of_sea_water_temperature + + + + integral_wrt_depth_of_sea_water_temperature + + + + integral_wrt_depth_of_sea_water_temperature + + + + integral_wrt_depth_of_sea_water_temperature + + + + universal_thermal_comfort_index + + + + product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + + + product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + + + integral_wrt_time_of_air_temperature_deficit + + + + integral_wrt_time_of_air_temperature_excess + + + + tendency_of_air_temperature_due_to_stratiform_precipitation + + + + tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection + + + + upward_heat_flux_at_base_of_grounded_ice_sheet + + + + sea_water_volume_fraction + + + + floating_ice_shelf_area_fraction + + + + stratiform_cloud_area_fraction + diff --git a/lib/iris/__init__.py b/lib/iris/__init__.py index f0421e9662..d4454efe89 100644 --- a/lib/iris/__init__.py +++ b/lib/iris/__init__.py @@ -94,6 +94,7 @@ def callback(cube, field, filename): import itertools import os.path import threading +from typing import Callable, Literal, Mapping import iris._constraints import iris.config @@ -120,6 +121,8 @@ def callback(cube, field, filename): "FUTURE", "Future", "IrisDeprecation", + "LOAD_POLICY", + "LoadPolicy", "NameConstraint", "load", "load_cube", @@ -189,7 +192,7 @@ def __repr__(self): return msg.format(self.datum_support, self.pandas_ndim, self.save_split_attrs) # deprecated_options = {'example_future_flag': 'warning',} - deprecated_options = {} + deprecated_options: dict[str, Literal["error", "warning"]] = {} def __setattr__(self, name, value): if name in self.deprecated_options: @@ -248,7 +251,10 @@ def context(self, **kwargs): # Initialise the site configuration dictionary. #: Iris site configuration dictionary. -site_configuration = {} +site_configuration: dict[ + Literal["cf_profile", "cf_patch", "cf_patch_conventions"], + Callable | Literal[False] | None, +] = {} try: from iris.site_config import update as _update @@ -288,8 +294,17 @@ def _generate_cubes(uris, callback, constraints): def _load_collection(uris, constraints=None, callback=None): from iris.cube import _CubeFilterCollection + from iris.fileformats.rules import _MULTIREF_DETECTION try: + # This routine is called once per iris load operation. + # Control of the "multiple refs" handling is implicit in this routine + # NOTE: detection of multiple reference fields, and it's enabling of post-load + # concatenation, is triggered **per-load, not per-cube** + # This behaves unexpectefly for "iris.load_cubes" : a post-concatenation is + # triggered for all cubes or none, not per-cube (i.e. per constraint). + _MULTIREF_DETECTION.found_multiple_refs = False + cubes = _generate_cubes(uris, callback, constraints) result = _CubeFilterCollection.from_cubes(cubes, constraints) except EOFError as e: @@ -299,6 +314,326 @@ def _load_collection(uris, constraints=None, callback=None): return result +class LoadPolicy(threading.local): + """A container for loading strategy options. + + Controls merge/concatenate usage during loading. + + Also controls the detection and handling of cases where a hybrid coordinate + uses multiple reference fields : for example, a UM file which contains a series of + fields describing time-varying orography. + + Options can be set directly, or via :meth:`~iris.LoadPolicy.set`, or changed for + the scope of a code block with :meth:`~iris.LoadPolicy.context`. + + .. note :: + + The default behaviour will "fix" loading for cases like the one just described. + However this is not strictly backwards-compatible. If this causes problems, + you can force identical loading behaviour to earlier Iris versions with + ``LOAD_POLICY.set("legacy")`` or equivalent. + + .. testsetup:: + + from iris import LOAD_POLICY + + Notes + ----- + The individual configurable options are : + + * ``support_multiple_references`` = True / False + When enabled, the presence of multiple aux-factory reference cubes, which merge + to define a extra dimension, will add that dimension to the loaded cubes. + This is essential for correct support of time-dependent hybrid coordinates (i.e. + aux factories) when loading from fields-based data (e.g. PP or GRIB). + For example (notably) time-dependent orography in UM data on hybrid-heights. + + In addition, when such multiple references are detected, an extra concatenate + step is added to the 'merge_concat_sequence' (see below), if none is already + configured there. + + * ``merge_concat_sequence`` = "m" / "c" / "cm" / "mc" + Specifies whether to merge, or concatenate, or both in either order. + This is the "combine" operation which is applied to loaded data. + + * ``repeat_until_unchanged`` = True / False + When enabled, the configured "combine" operation will be repeated until the + result is stable (no more cubes are combined). + + Several common sets of options are provided in :data:`~iris.LOAD_POLICY.SETTINGS` : + + * ``"legacy"`` + Produces results identical to Iris versions < 3.11, i.e. before the varying + hybrid references were supported. + + * ``"default"`` + As "legacy" except that ``support_multiple_references=True``. This differs + from "legacy" only when multiple mergeable reference fields are encountered, + in which case incoming cubes are extended into the extra dimension, and a + concatenate step is added. + + * ``"recommended"`` + Enables multiple reference handling, and applies a merge step followed by + a concatenate step. + + * ``"comprehensive"`` + Like "recommended", but will also *repeat* the merge+concatenate steps until no + further change is produced. + + .. note :: + + The 'comprehensive' policy makes a maximum effort to reduce the number of + cubes to a minimum. However, it still cannot combine cubes with a mixture + of matching dimension and scalar coordinates. This may be supported at + some later date, but for now is not possible without specific user actions. + + .. Note :: + + See also : :ref:`controlling_merge`. + + Examples + -------- + >>> LOAD_POLICY.set("legacy") + >>> print(LOAD_POLICY) + LoadPolicy(support_multiple_references=False, merge_concat_sequence='m', repeat_until_unchanged=False) + >>> LOAD_POLICY.support_multiple_references = True + >>> print(LOAD_POLICY) + LoadPolicy(support_multiple_references=True, merge_concat_sequence='m', repeat_until_unchanged=False) + >>> LOAD_POLICY.set(merge_concat_sequence="cm") + >>> print(LOAD_POLICY) + LoadPolicy(support_multiple_references=True, merge_concat_sequence='cm', repeat_until_unchanged=False) + >>> with LOAD_POLICY.context("comprehensive"): + ... print(LOAD_POLICY) + LoadPolicy(support_multiple_references=True, merge_concat_sequence='mc', repeat_until_unchanged=True) + >>> print(LOAD_POLICY) + LoadPolicy(support_multiple_references=True, merge_concat_sequence='cm', repeat_until_unchanged=False) + + """ + + # Useful constants + OPTION_KEYS = ( + "support_multiple_references", + "merge_concat_sequence", + "repeat_until_unchanged", + ) + _OPTIONS_ALLOWED_VALUES = { + "support_multiple_references": (False, True), + "merge_concat_sequence": ("", "m", "c", "mc", "cm"), + "repeat_until_unchanged": (False, True), + } + SETTINGS = { + "legacy": dict( + support_multiple_references=False, + merge_concat_sequence="m", + repeat_until_unchanged=False, + ), + "default": dict( + support_multiple_references=True, + merge_concat_sequence="m", + repeat_until_unchanged=False, + ), + "recommended": dict( + support_multiple_references=True, + merge_concat_sequence="mc", + repeat_until_unchanged=False, + ), + "comprehensive": dict( + support_multiple_references=True, + merge_concat_sequence="mc", + repeat_until_unchanged=True, + ), + } + + def __init__(self, options: str | dict | None = None, **kwargs): + """Create loading strategy control object.""" + self.set("default") + self.set(options, **kwargs) + + def __setattr__(self, key, value): + if key not in self.OPTION_KEYS: + raise KeyError(f"LoadPolicy object has no property '{key}'.") + + allowed_values = self._OPTIONS_ALLOWED_VALUES[key] + if value not in allowed_values: + msg = ( + f"{value!r} is not a valid setting for LoadPolicy.{key} : " + f"must be one of '{allowed_values}'." + ) + raise ValueError(msg) + + self.__dict__[key] = value + + def set(self, options: str | dict | None = None, **kwargs): + """Set new options. + + Parameters + ---------- + * options : str or dict, optional + A dictionary of options values, or the name of one of the + :data:`~iris.LoadPolicy.SETTINGS` standard option sets, + e.g. "legacy" or "comprehensive". + * kwargs : dict + Individual option settings, from :data:`~iris.LoadPolicy.OPTION_KEYS`. + + Note + ---- + Keyword arguments are applied after the 'options' arg, and + so will take precedence. + + """ + if options is None: + options = {} + elif isinstance(options, str) and options in self.SETTINGS: + options = self.SETTINGS[options] + elif not isinstance(options, Mapping): + msg = ( + f"Invalid arg options={options!r} : " + f"must be a dict, or one of {tuple(self.SETTINGS.keys())}" + ) + raise TypeError(msg) + + # Override any options with keywords + options.update(**kwargs) + bad_keys = [key for key in options if key not in self.OPTION_KEYS] + if bad_keys: + msg = f"Unknown options {bad_keys} : valid options are {self.OPTION_KEYS}." + raise ValueError(msg) + + # Implement all options by changing own content. + for key, value in options.items(): + setattr(self, key, value) + + def settings(self): + """Return an options dict containing the current settings.""" + return {key: getattr(self, key) for key in self.OPTION_KEYS} + + def __repr__(self): + msg = f"{self.__class__.__name__}(" + msg += ", ".join(f"{key}={getattr(self, key)!r}" for key in self.OPTION_KEYS) + msg += ")" + return msg + + @contextlib.contextmanager + def context(self, settings=None, **kwargs): + """Return a context manager applying given options. + + Parameters + ---------- + settings : str or dict + Options dictionary or name, as for :meth:`~LoadPolicy.set`. + kwargs : dict + Option values, as for :meth:`~LoadPolicy.set`. + + Examples + -------- + .. testsetup:: + + import iris + from iris import LOAD_POLICY, sample_data_path + + >>> path = sample_data_path("time_varying_hybrid_height", "*.pp") + >>> with LOAD_POLICY.context("legacy"): + ... cubes = iris.load(path, "x_wind") + >>> print(cubes) + 0: x_wind / (m s-1) (time: 2; model_level_number: 5; latitude: 144; longitude: 192) + 1: x_wind / (m s-1) (time: 12; model_level_number: 5; latitude: 144; longitude: 192) + 2: x_wind / (m s-1) (model_level_number: 5; latitude: 144; longitude: 192) + >>> + >>> with LOAD_POLICY.context("recommended"): + ... cubes = iris.load(path, "x_wind") + >>> print(cubes) + 0: x_wind / (m s-1) (model_level_number: 5; time: 15; latitude: 144; longitude: 192) + """ + # Save the current state + saved_settings = self.settings() + + # Apply the new options and execute the context + try: + self.set(settings, **kwargs) + yield + finally: + # Re-establish the former state + self.set(saved_settings) + + +#: A control object containing the current file loading options. +LOAD_POLICY = LoadPolicy() + + +def _combine_cubes(cubes, options, merge_require_unique): + """Combine cubes as for load, according to "loading policy" options. + + Applies :meth:`~iris.cube.CubeList.merge`/:meth:`~iris.cube.CubeList.concatenate` + steps to the given cubes, as determined by the 'settings'. + + Parameters + ---------- + cubes : list of :class:`~iris.cube.Cube` + A list of cubes to combine. + options : dict + Settings, as described for :meth:`iris.LOAD_POLICY.set`. + Defaults to current :meth:`iris.LOAD_POLICY.settings`. + merge_require_unique : bool + Value for the 'unique' keyword in any merge operations. + + Returns + ------- + :class:`~iris.cube.CubeList` + + .. Note:: + The ``support_multiple_references`` keyword/property has no effect on the + :func:`_combine_cubes` operation : it only takes effect during a load operation. + + Notes + ----- + TODO: make this public API in future. + At that point, change the API to support (options=None, **kwargs) + add testing of + those modes (notably arg type = None / str / dict). + + """ + from iris.cube import CubeList + + if not isinstance(cubes, CubeList): + cubes = CubeList(cubes) + + while True: + n_original_cubes = len(cubes) + sequence = options["merge_concat_sequence"] + + if sequence[0] == "c": + # concat if it comes first + cubes = cubes.concatenate() + if "m" in sequence: + # merge if requested + cubes = cubes.merge(unique=merge_require_unique) + if sequence[-1] == "c": + # concat if it comes last + cubes = cubes.concatenate() + + # Repeat if requested, *and* this step reduced the number of cubes + if not options["repeat_until_unchanged"] or len(cubes) >= n_original_cubes: + break + + return cubes + + +def _combine_load_cubes(cubes, merge_require_unique=False): + # A special version to call _combine_cubes while also implementing the + # _MULTIREF_DETECTION behaviour + options = LOAD_POLICY.settings() + if ( + options["support_multiple_references"] + and "c" not in options["merge_concat_sequence"] + ): + # Add a concatenate to implement the "multiref triggers concatenate" mechanism + from iris.fileformats.rules import _MULTIREF_DETECTION + + if _MULTIREF_DETECTION.found_multiple_refs: + options["merge_concat_sequence"] += "c" + + return _combine_cubes(cubes, options, merge_require_unique=merge_require_unique) + + def load(uris, constraints=None, callback=None): """Load any number of Cubes for each constraint. @@ -323,7 +658,8 @@ def load(uris, constraints=None, callback=None): were random. """ - return _load_collection(uris, constraints, callback).merged().cubes() + cubes = _load_collection(uris, constraints, callback).combined().cubes() + return cubes def load_cube(uris, constraint=None, callback=None): @@ -351,9 +687,11 @@ def load_cube(uris, constraint=None, callback=None): if len(constraints) != 1: raise ValueError("only a single constraint is allowed") - cubes = _load_collection(uris, constraints, callback).cubes() + cubes = _load_collection(uris, constraints, callback).combined(unique=False).cubes() try: + # NOTE: this call currently retained to preserve the legacy exceptions + # TODO: replace with simple testing to duplicate the relevant error cases cube = cubes.merge_cube() except iris.exceptions.MergeError as e: raise iris.exceptions.ConstraintMismatchError(str(e)) @@ -388,7 +726,7 @@ def load_cubes(uris, constraints=None, callback=None): """ # Merge the incoming cubes - collection = _load_collection(uris, constraints, callback).merged() + collection = _load_collection(uris, constraints, callback).combined() # Make sure we have exactly one merged cube per constraint bad_pairs = [pair for pair in collection.pairs if len(pair) != 1] diff --git a/lib/iris/_concatenate.py b/lib/iris/_concatenate.py index 7011df0924..ac9e699790 100644 --- a/lib/iris/_concatenate.py +++ b/lib/iris/_concatenate.py @@ -4,13 +4,20 @@ # See LICENSE in the root of the repository for full licensing details. """Automatic concatenation of multiple cubes over one or more existing dimensions.""" -from collections import defaultdict, namedtuple +from collections import namedtuple +from collections.abc import Mapping, Sequence +import itertools +from typing import Any import warnings +import dask import dask.array as da import numpy as np +from xxhash import xxh3_64 +from iris._lazy_data import concatenate as concatenate_arrays import iris.coords +from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, DimCoord import iris.cube import iris.exceptions from iris.util import array_equal, guess_coord_axis @@ -160,7 +167,7 @@ class _DerivedCoordAndDims( Parameters ---------- coord : :class:`iris.coord.DimCoord` or :class:`iris.coord.AuxCoord` - dims: tuple + dims : tuple A tuple of the data dimension(s) spanned by the coordinate. aux_factory : :class:`iris.aux_factory.AuxCoordFactory` @@ -196,7 +203,7 @@ def __new__(cls, ancil, dims): Parameters ---------- - ancil : :class:`iris.coord.CellMeasure` or :class:`iris.coord.AncillaryVariable`. + ancil : :class:`iris.coord.CellMeasure` or :class:`iris.coord.AncillaryVariable` dims : The dimension(s) associated with ancil. @@ -271,7 +278,6 @@ class _CoordExtent(namedtuple("CoordExtent", ["points", "bounds"])): ---------- points : :class:`_Extent` The :class:`_Extent` of the coordinate point values. - bounds : A list containing the :class:`_Extent` of the coordinate lower bound and the upper bound. Defaults to None if no associated @@ -282,14 +288,253 @@ class _CoordExtent(namedtuple("CoordExtent", ["points", "bounds"])): __slots__ = () +def _hash_ndarray(a: np.ndarray) -> np.ndarray: + """Compute a hash from a numpy array. + + Calculates a 64-bit non-cryptographic hash of the provided array, using + the fast ``xxhash`` hashing algorithm. + + Parameters + ---------- + a : + The array to hash. + + Returns + ------- + numpy.ndarray : + An array of shape (1,) containing the hash value. + + """ + # Include the array dtype as it is not preserved by `ndarray.tobytes()`. + hash = xxh3_64(f"dtype={a.dtype}".encode("utf-8")) + + # Hash the bytes representing the array data. + hash.update(b"data=") + if np.ma.is_masked(a): + # Hash only the unmasked data + hash.update(a.compressed().tobytes()) + # Hash the mask + hash.update(b"mask=") + hash.update(a.mask.tobytes()) + else: + hash.update(a.tobytes()) + return np.frombuffer(hash.digest(), dtype=np.int64) + + +def _hash_chunk( + x_chunk: np.ndarray, + axis: tuple[int] | None, + keepdims: bool, +) -> np.ndarray: + """Compute a hash from a numpy array. + + This function can be applied to each chunk or intermediate chunk in + :func:`~dask.array.reduction`. It preserves the number of input dimensions + to facilitate combining intermediate results into intermediate chunks. + + Parameters + ---------- + x_chunk : + The array to hash. + axis : + Unused but required by :func:`~dask.array.reduction`. + keepdims : + Unused but required by :func:`~dask.array.reduction`. + + Returns + ------- + numpy.ndarray : + An array containing the hash value. + + """ + return _hash_ndarray(x_chunk).reshape((1,) * x_chunk.ndim) + + +def _hash_aggregate( + x_chunk: np.ndarray, + axis: tuple[int] | None, + keepdims: bool, +) -> np.int64: + """Compute a hash from a numpy array. + + This function can be applied as the final step in :func:`~dask.array.reduction`. + + Parameters + ---------- + x_chunk : + The array to hash. + axis : + Unused but required by :func:`~dask.array.reduction`. + keepdims : + Unused but required by :func:`~dask.array.reduction`. + + Returns + ------- + np.int64 : + The hash value. + + """ + (result,) = _hash_ndarray(x_chunk) + return result + + +def _hash_array(a: da.Array | np.ndarray) -> np.int64: + """Calculate a hash representation of the provided array. + + Calculates a 64-bit non-cryptographic hash of the provided array, using + the fast ``xxhash`` hashing algorithm. + + Note that the computed hash depends on how the array is chunked. + + Parameters + ---------- + a : + The array that requires to have its hexdigest calculated. + + Returns + ------- + np.int64 + The array's hash. + + """ + if isinstance(a, da.Array): + # Use :func:`~dask.array.reduction` to compute a hash from a Dask array. + # + # A hash of each input chunk will be computed by the `chunk` function + # and those hashes will be combined into one or more intermediate chunks. + # If there are multiple intermediate chunks, a hash for each intermediate + # chunk will be computed by the `combine` function and the + # results will be combined into a new layer of intermediate chunks. This + # will be repeated until only a single intermediate chunk remains. + # Finally, a single hash value will be computed from the last + # intermediate chunk by the `aggregate` function. + result = da.reduction( + a, + chunk=_hash_chunk, + combine=_hash_chunk, + aggregate=_hash_aggregate, + keepdims=False, + meta=np.empty(tuple(), dtype=np.int64), + dtype=np.int64, + ) + else: + result = _hash_aggregate(a, None, False) + return result + + +class _ArrayHash(namedtuple("ArrayHash", ["value", "chunks"])): + """Container for a hash value and the chunks used when computing it. + + Parameters + ---------- + value : :class:`np.int64` + The hash value. + chunks : tuple + The chunks the array had when the hash was computed. + """ + + __slots__ = () + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, self.__class__): + raise TypeError(f"Unable to compare {repr(self)} to {repr(other)}") + + def shape(chunks): + return tuple(sum(c) for c in chunks) + + if shape(self.chunks) == shape(other.chunks): + if self.chunks != other.chunks: + raise ValueError( + "Unable to compare arrays with different chunks: " + f"{self.chunks} != {other.chunks}" + ) + result = self.value == other.value + else: + result = False + return result + + +def _array_id( + coord: DimCoord | AuxCoord | AncillaryVariable | CellMeasure, + bound: bool, +) -> str: + """Get a unique key for looking up arrays associated with coordinates.""" + return f"{id(coord)}{bound}" + + +def _compute_hashes( + arrays: Mapping[str, np.ndarray | da.Array], +) -> dict[str, _ArrayHash]: + """Compute hashes for the arrays that will be compared. + + Two arrays are considered equal if each unmasked element compares equal + and the masks are equal. However, hashes depend on chunking and dtype. + Therefore, arrays with the same shape are rechunked so they have the same + chunks and arrays with numerical dtypes are cast up to the same dtype before + computing the hashes. + + Parameters + ---------- + arrays : + A mapping with key-array pairs. + + Returns + ------- + dict[str, _ArrayHash] : + An dictionary of hashes. + + """ + hashes = {} + + def is_numerical(dtype): + return np.issubdtype(dtype, np.bool_) or np.issubdtype(dtype, np.number) + + def group_key(item): + array_id, a = item + if is_numerical(a.dtype): + dtype = "numerical" + else: + dtype = str(a.dtype) + return a.shape, dtype + + sorted_arrays = sorted(arrays.items(), key=group_key) + for _, group_iter in itertools.groupby(sorted_arrays, key=group_key): + array_ids, group = zip(*group_iter) + # Unify dtype for numerical arrays, as the hash depends on it + if is_numerical(group[0].dtype): + dtype = np.result_type(*group) + same_dtype_arrays = tuple(a.astype(dtype) for a in group) + else: + same_dtype_arrays = group + if any(isinstance(a, da.Array) for a in same_dtype_arrays): + # Unify chunks as the hash depends on the chunks. + indices = tuple(range(group[0].ndim)) + # Because all arrays in a group have the same shape, `indices` + # are the same for all of them. Providing `indices` as a tuple + # instead of letters is easier to do programmatically. + argpairs = [(a, indices) for a in same_dtype_arrays] + __, rechunked_arrays = da.core.unify_chunks(*itertools.chain(*argpairs)) + else: + rechunked_arrays = same_dtype_arrays + for array_id, rechunked in zip(array_ids, rechunked_arrays): + if isinstance(rechunked, da.Array): + chunks = rechunked.chunks + else: + chunks = tuple((i,) for i in rechunked.shape) + hashes[array_id] = (_hash_array(rechunked), chunks) + + (hashes,) = dask.compute(hashes) + return {k: _ArrayHash(*v) for k, v in hashes.items()} + + def concatenate( - cubes, - error_on_mismatch=False, - check_aux_coords=True, - check_cell_measures=True, - check_ancils=True, - check_derived_coords=True, -): + cubes: Sequence[iris.cube.Cube], + error_on_mismatch: bool = False, + check_aux_coords: bool = True, + check_cell_measures: bool = True, + check_ancils: bool = True, + check_derived_coords: bool = True, +) -> iris.cube.CubeList: """Concatenate the provided cubes over common existing dimensions. Parameters @@ -297,7 +542,7 @@ def concatenate( cubes : iterable of :class:`iris.cube.Cube` An iterable containing one or more :class:`iris.cube.Cube` instances to be concatenated together. - error_on_mismatch: bool, default=False + error_on_mismatch : bool, default=False If True, raise an informative :class:`~iris.exceptions.ContatenateError` if registration fails. check_aux_coords : bool, default=True @@ -327,21 +572,49 @@ def concatenate( A :class:`iris.cube.CubeList` of concatenated :class:`iris.cube.Cube` instances. """ - proto_cubes_by_name = defaultdict(list) + cube_signatures = [_CubeSignature(cube) for cube in cubes] + + proto_cubes: list[_ProtoCube] = [] # Initialise the nominated axis (dimension) of concatenation # which requires to be negotiated. axis = None + # Compute hashes for parallel array comparison. + arrays = {} + + def add_coords(cube_signature: _CubeSignature, coord_type: str) -> None: + for coord_and_dims in getattr(cube_signature, coord_type): + coord = coord_and_dims.coord + array_id = _array_id(coord, bound=False) + if isinstance(coord, (DimCoord, AuxCoord)): + arrays[array_id] = coord.core_points() + if coord.has_bounds(): + bound_array_id = _array_id(coord, bound=True) + arrays[bound_array_id] = coord.core_bounds() + else: + arrays[array_id] = coord.core_data() + + for cube_signature in cube_signatures: + if check_aux_coords: + add_coords(cube_signature, "aux_coords_and_dims") + if check_derived_coords: + add_coords(cube_signature, "derived_coords_and_dims") + if check_cell_measures: + add_coords(cube_signature, "cell_measures_and_dims") + if check_ancils: + add_coords(cube_signature, "ancillary_variables_and_dims") + + hashes = _compute_hashes(arrays) + # Register each cube with its appropriate proto-cube. - for cube in cubes: - name = cube.standard_name or cube.long_name - proto_cubes = proto_cubes_by_name[name] + for cube_signature in cube_signatures: registered = False # Register cube with an existing proto-cube. for proto_cube in proto_cubes: registered = proto_cube.register( - cube, + cube_signature, + hashes, axis, error_on_mismatch, check_aux_coords, @@ -355,19 +628,17 @@ def concatenate( # Create a new proto-cube for an unregistered cube. if not registered: - proto_cubes.append(_ProtoCube(cube)) + proto_cubes.append(_ProtoCube(cube_signature)) # Construct a concatenated cube from each of the proto-cubes. concatenated_cubes = iris.cube.CubeList() # Emulate Python 2 behaviour. - def _none_sort(item): - return (item is not None, item) + def _none_sort(proto_cube): + return (proto_cube.name is not None, proto_cube.name) - for name in sorted(proto_cubes_by_name, key=_none_sort): - for proto_cube in proto_cubes_by_name[name]: - # Construct the concatenated cube. - concatenated_cubes.append(proto_cube.concatenate()) + for proto_cube in sorted(proto_cubes, key=_none_sort): + concatenated_cubes.append(proto_cube.concatenate()) # Perform concatenation until we've reached an equilibrium. count = len(concatenated_cubes) @@ -385,7 +656,7 @@ class _CubeSignature: """ - def __init__(self, cube): + def __init__(self, cube: iris.cube.Cube) -> None: """Represent the cube metadata and associated coordinate metadata. Parameters @@ -414,14 +685,14 @@ def __init__(self, cube): self.defn = cube.metadata self.data_type = cube.dtype + self.src_cube = cube # # Collate the dimension coordinate metadata. # - for ind, coord in enumerate(self.dim_coords): - dims = cube.coord_dims(coord) - metadata = _CoordMetaData(coord, dims) - self.dim_metadata.append(metadata) + for dim_coord in self.dim_coords: + dims = cube.coord_dims(dim_coord) + self.dim_metadata.append(_CoordMetaData(dim_coord, dims)) self.dim_mapping.append(dims[0]) # @@ -438,43 +709,37 @@ def key_func(coord): cube.coord_dims(coord), ) - for coord in sorted(cube.aux_coords, key=key_func): - dims = cube.coord_dims(coord) + for aux_coord in sorted(cube.aux_coords, key=key_func): + dims = cube.coord_dims(aux_coord) if dims: - metadata = _CoordMetaData(coord, dims) - self.aux_metadata.append(metadata) - coord_and_dims = _CoordAndDims(coord, tuple(dims)) - self.aux_coords_and_dims.append(coord_and_dims) + self.aux_metadata.append(_CoordMetaData(aux_coord, dims)) + self.aux_coords_and_dims.append(_CoordAndDims(aux_coord, tuple(dims))) else: - self.scalar_coords.append(coord) + self.scalar_coords.append(aux_coord) def meta_key_func(dm): return (dm.metadata, dm.cube_dims(cube)) for cm in sorted(cube.cell_measures(), key=meta_key_func): dims = cube.cell_measure_dims(cm) - metadata = _OtherMetaData(cm, dims) - self.cm_metadata.append(metadata) - cm_and_dims = _CoordAndDims(cm, tuple(dims)) - self.cell_measures_and_dims.append(cm_and_dims) + self.cm_metadata.append(_OtherMetaData(cm, dims)) + self.cell_measures_and_dims.append(_CoordAndDims(cm, tuple(dims))) for av in sorted(cube.ancillary_variables(), key=meta_key_func): dims = cube.ancillary_variable_dims(av) - metadata = _OtherMetaData(av, dims) - self.av_metadata.append(metadata) - av_and_dims = _CoordAndDims(av, tuple(dims)) - self.ancillary_variables_and_dims.append(av_and_dims) + self.av_metadata.append(_OtherMetaData(av, dims)) + self.ancillary_variables_and_dims.append(_CoordAndDims(av, tuple(dims))) def name_key_func(factory): return factory.name() for factory in sorted(cube.aux_factories, key=name_key_func): coord = factory.make_coord(cube.coord_dims) - dims = cube.coord_dims(coord) - metadata = _CoordMetaData(coord, dims) - self.derived_metadata.append(metadata) - coord_and_dims = _DerivedCoordAndDims(coord, tuple(dims), factory) - self.derived_coords_and_dims.append(coord_and_dims) + dims = factory.derived_dims(cube.coord_dims) + self.derived_metadata.append(_CoordMetaData(coord, dims)) + self.derived_coords_and_dims.append( + _DerivedCoordAndDims(coord, tuple(dims), factory) + ) def _coordinate_differences(self, other, attr, reason="metadata"): """Determine the names of the coordinates that differ. @@ -491,7 +756,7 @@ def _coordinate_differences(self, other, attr, reason="metadata"): between `self` and `other`. reason : str, default="metadata" The reason to give for mismatch (function is normally, but not - always, testing metadata) + always, testing metadata). Returns ------- @@ -608,7 +873,7 @@ def match(self, other, error_on_mismatch): class _CoordSignature: """Template for identifying a specific type of :class:`iris.cube.Cube` based on its coordinates.""" - def __init__(self, cube_signature): + def __init__(self, cube_signature: _CubeSignature) -> None: """Represent the coordinate metadata. Represent the coordinate metadata required to identify suitable @@ -627,7 +892,7 @@ def __init__(self, cube_signature): self.derived_coords_and_dims = cube_signature.derived_coords_and_dims self.dim_coords = cube_signature.dim_coords self.dim_mapping = cube_signature.dim_mapping - self.dim_extents = [] + self.dim_extents: list[_CoordExtent] = [] self.dim_order = [ metadata.kwargs["order"] for metadata in cube_signature.dim_metadata ] @@ -636,7 +901,10 @@ def __init__(self, cube_signature): self._calculate_extents() @staticmethod - def _cmp(coord, other): + def _cmp( + coord: iris.coords.DimCoord, + other: iris.coords.DimCoord, + ) -> tuple[bool, bool]: """Compare the coordinates for concatenation compatibility. Returns @@ -647,22 +915,17 @@ def _cmp(coord, other): """ # A candidate axis must have non-identical coordinate points. - candidate_axis = not array_equal(coord.core_points(), other.core_points()) + candidate_axis = not array_equal(coord.points, other.points) - if candidate_axis: - # Ensure both have equal availability of bounds. - result = (coord.core_bounds() is None) == (other.core_bounds() is None) - else: - if coord.core_bounds() is not None and other.core_bounds() is not None: - # Ensure equality of bounds. - result = array_equal(coord.core_bounds(), other.core_bounds()) - else: - # Ensure both have equal availability of bounds. - result = coord.core_bounds() is None and other.core_bounds() is None + # Ensure both have equal availability of bounds. + result = coord.has_bounds() == other.has_bounds() + if result and not candidate_axis: + # Ensure equality of bounds. + result = array_equal(coord.bounds, other.bounds) return result, candidate_axis - def candidate_axis(self, other): + def candidate_axis(self, other: "_CoordSignature") -> int | None: """Determine the candidate axis of concatenation with the given coordinate signature. If a candidate axis is found, then the coordinate @@ -694,13 +957,13 @@ def candidate_axis(self, other): # Only permit one degree of dimensional freedom when # determining the candidate axis of concatenation. if result and len(candidate_axes) == 1: - result = candidate_axes[0] + axis = candidate_axes[0] else: - result = None + axis = None - return result + return axis - def _calculate_extents(self): + def _calculate_extents(self) -> None: """Calculate the extent over each dimension coordinates points and bounds.""" self.dim_extents = [] for coord, order in zip(self.dim_coords, self.dim_order): @@ -730,21 +993,21 @@ def _calculate_extents(self): class _ProtoCube: """Framework for concatenating multiple source-cubes over one common dimension.""" - def __init__(self, cube): + def __init__(self, cube_signature): """Create a new _ProtoCube from the given cube and record the cube as a source-cube. Parameters ---------- - cube : - Source :class:`iris.cube.Cube` of the :class:`_ProtoCube`. + cube_signature : + Source :class:`_CubeSignature` of the :class:`_ProtoCube`. """ # Cache the source-cube of this proto-cube. - self._cube = cube + self._cube = cube_signature.src_cube # The cube signature is a combination of cube and coordinate # metadata that defines this proto-cube. - self._cube_signature = _CubeSignature(cube) + self._cube_signature = cube_signature # The coordinate signature allows suitable non-overlapping # source-cubes to be identified. @@ -752,7 +1015,7 @@ def __init__(self, cube): # The list of source-cubes relevant to this proto-cube. self._skeletons = [] - self._add_skeleton(self._coord_signature, cube.lazy_data()) + self._add_skeleton(self._coord_signature, self._cube.lazy_data()) # The nominated axis of concatenation. self._axis = None @@ -762,10 +1025,16 @@ def axis(self): """Return the nominated dimension of concatenation.""" return self._axis + @property + def name(self) -> str | None: + """Return the standard_name or long name.""" + metadata = self._cube_signature.defn + return metadata.standard_name or metadata.long_name + def concatenate(self): - """Concatenates all the source-cubes registered with the :class:`_ProtoCube`. + """Concatenate all the source-cubes registered with the :class:`_ProtoCube`. - Concatenates all the source-cubes registered with the + Concatenate all the source-cubes registered with the :class:`_ProtoCube` over the nominated common dimension. Returns @@ -834,14 +1103,15 @@ def concatenate(self): def register( self, - cube, - axis=None, - error_on_mismatch=False, - check_aux_coords=False, - check_cell_measures=False, - check_ancils=False, - check_derived_coords=False, - ): + cube_signature: _CubeSignature, + hashes: Mapping[str, _ArrayHash], + axis: int | None = None, + error_on_mismatch: bool = False, + check_aux_coords: bool = False, + check_cell_measures: bool = False, + check_ancils: bool = False, + check_derived_coords: bool = False, + ) -> bool: """Determine if the given source-cube is suitable for concatenation. Determine if the given source-cube is suitable for concatenation @@ -849,9 +1119,12 @@ def register( Parameters ---------- - cube : :class:`iris.cube.Cube` - The :class:`iris.cube.Cube` source-cube candidate for + cube_signature : :class:`_CubeSignature` + The :class:`_CubeSignature` of the source-cube candidate for concatenation. + hashes : + A mapping containing hash values for checking coordinate, ancillary + variable, and cell measure equality. axis : optional Seed the dimension of concatenation for the :class:`_ProtoCube` rather than rely on negotiation with source-cubes. @@ -892,8 +1165,8 @@ def register( raise ValueError(msg) # Check for compatible cube signatures. - cube_signature = _CubeSignature(cube) match = self._cube_signature.match(cube_signature, error_on_mismatch) + mismatch_error_msg = None # Check for compatible coordinate signatures. if match: @@ -902,85 +1175,91 @@ def register( match = candidate_axis is not None and ( candidate_axis == axis or axis is None ) + if not match: + mismatch_error_msg = ( + f"Cannot find an axis to concatenate over for phenomenon " + f"`{self._cube.name()}`" + ) # Check for compatible coordinate extents. if match: dim_ind = self._coord_signature.dim_mapping.index(candidate_axis) match = self._sequence(coord_signature.dim_extents[dim_ind], candidate_axis) if error_on_mismatch and not match: - msg = f"Found cubes with overlap on concatenate axis {candidate_axis}, cannot concatenate overlapping cubes" - raise iris.exceptions.ConcatenateError([msg]) + mismatch_error_msg = f"Found cubes with overlap on concatenate axis {candidate_axis}, cannot concatenate overlapping cubes" elif not match: - msg = f"Found cubes with overlap on concatenate axis {candidate_axis}, skipping concatenation for these cubes" - warnings.warn(msg, category=iris.warnings.IrisUserWarning) + mismatch_error_msg = f"Found cubes with overlap on concatenate axis {candidate_axis}, skipping concatenation for these cubes" + + def get_hashes( + coord: DimCoord | AuxCoord | AncillaryVariable | CellMeasure, + ) -> tuple[_ArrayHash, ...]: + array_id = _array_id(coord, bound=False) + result = [hashes[array_id]] + if isinstance(coord, (DimCoord, AuxCoord)) and coord.has_bounds(): + bound_array_id = _array_id(coord, bound=True) + result.append(hashes[bound_array_id]) + return tuple(result) + + # Mapping from `_CubeSignature` attributes to human readable names. + coord_type_names = { + "aux_coords_and_dims": "Auxiliary coordinates", + "cell_measures_and_dims": "Cell measures", + "ancillary_variables_and_dims": "Ancillary variables", + "derived_coords_and_dims": "Derived coordinates", + } + + def check_coord_match(coord_type: str) -> tuple[bool, str]: + result = (True, "") + for coord_a, coord_b in zip( + getattr(self._cube_signature, coord_type), + getattr(cube_signature, coord_type), + ): + # Coordinates that span the candidate axis can differ + if ( + candidate_axis not in coord_a.dims + or candidate_axis not in coord_b.dims + ): + if not get_hashes(coord_a.coord) == get_hashes(coord_b.coord): + mismatch_error_msg = ( + f"{coord_type_names[coord_type]} are unequal for phenomenon" + f" `{self._cube.name()}`:\n" + f"a: {coord_a}\n" + f"b: {coord_b}" + ) + result = (False, mismatch_error_msg) + break + + return result # Check for compatible AuxCoords. - if match: - if check_aux_coords: - for coord_a, coord_b in zip( - self._cube_signature.aux_coords_and_dims, - cube_signature.aux_coords_and_dims, - ): - # AuxCoords that span the candidate axis can differ - if ( - candidate_axis not in coord_a.dims - or candidate_axis not in coord_b.dims - ): - if not coord_a == coord_b: - match = False + if match and check_aux_coords: + match, msg = check_coord_match("aux_coords_and_dims") + if not match: + mismatch_error_msg = msg # Check for compatible CellMeasures. - if match: - if check_cell_measures: - for coord_a, coord_b in zip( - self._cube_signature.cell_measures_and_dims, - cube_signature.cell_measures_and_dims, - ): - # CellMeasures that span the candidate axis can differ - if ( - candidate_axis not in coord_a.dims - or candidate_axis not in coord_b.dims - ): - if not coord_a == coord_b: - match = False + if match and check_cell_measures: + match, msg = check_coord_match("cell_measures_and_dims") + if not match: + mismatch_error_msg = msg # Check for compatible AncillaryVariables. - if match: - if check_ancils: - for coord_a, coord_b in zip( - self._cube_signature.ancillary_variables_and_dims, - cube_signature.ancillary_variables_and_dims, - ): - # AncillaryVariables that span the candidate axis can differ - if ( - candidate_axis not in coord_a.dims - or candidate_axis not in coord_b.dims - ): - if not coord_a == coord_b: - match = False + if match and check_ancils: + match, msg = check_coord_match("ancillary_variables_and_dims") + if not match: + mismatch_error_msg = msg # Check for compatible derived coordinates. - if match: - if check_derived_coords: - for coord_a, coord_b in zip( - self._cube_signature.derived_coords_and_dims, - cube_signature.derived_coords_and_dims, - ): - # Derived coords that span the candidate axis can differ - if ( - candidate_axis not in coord_a.dims - or candidate_axis not in coord_b.dims - ): - if not coord_a == coord_b: - match = False + if match and check_derived_coords: + match, msg = check_coord_match("derived_coords_and_dims") + if not match: + mismatch_error_msg = msg if match: # Register the cube as a source-cube for this proto-cube. - self._add_skeleton(coord_signature, cube.lazy_data()) + self._add_skeleton(coord_signature, cube_signature.src_cube.lazy_data()) # Declare the nominated axis of concatenation. self._axis = candidate_axis - - if match: # If the protocube dimension order is constant (indicating it was # created from a cube with a length 1 dimension coordinate) but # a subsequently registered cube has a non-constant dimension @@ -992,6 +1271,14 @@ def register( if existing_order == _CONSTANT and this_order != _CONSTANT: self._coord_signature.dim_order[dim_ind] = this_order + if mismatch_error_msg and not match: + if error_on_mismatch: + raise iris.exceptions.ConcatenateError([mismatch_error_msg]) + else: + warnings.warn( + mismatch_error_msg, category=iris.warnings.IrisUserWarning + ) + return match def _add_skeleton(self, coord_signature, data): @@ -1110,10 +1397,10 @@ def _build_cell_measures(self): # Concatenate the data together. dim = dims.index(self.axis) data = [ - skton.signature.cell_measures_and_dims[i].coord.data + skton.signature.cell_measures_and_dims[i].coord.core_data() for skton in skeletons ] - data = np.concatenate(tuple(data), axis=dim) + data = concatenate_arrays(tuple(data), axis=dim) # Generate the associated metadata. kwargs = cube_signature.cm_metadata[i].defn._asdict() @@ -1150,10 +1437,10 @@ def _build_ancillary_variables(self): # Concatenate the data together. dim = dims.index(self.axis) data = [ - skton.signature.ancillary_variables_and_dims[i].coord.data + skton.signature.ancillary_variables_and_dims[i].coord.core_data() for skton in skeletons ] - data = np.concatenate(tuple(data), axis=dim) + data = concatenate_arrays(tuple(data), axis=dim) # Generate the associated metadata. kwargs = cube_signature.av_metadata[i].defn._asdict() @@ -1246,7 +1533,7 @@ def _build_data(self): skeletons = self._skeletons data = [skeleton.data for skeleton in skeletons] - data = da.concatenate(data, self.axis) + data = concatenate_arrays(data, self.axis) return data diff --git a/lib/iris/_constraints.py b/lib/iris/_constraints.py index 4c993885a8..765a975651 100644 --- a/lib/iris/_constraints.py +++ b/lib/iris/_constraints.py @@ -282,9 +282,9 @@ def __init__(self, coord_name, coord_thing): Parameters ---------- coord_name : str - The name of the coordinate to constrain + The name of the coordinate to constrain. coord_thing : - The object to compare + The object to compare. """ self.coord_name = coord_name @@ -491,10 +491,10 @@ def list_of_constraints(constraints): return [as_constraint(constraint) for constraint in constraints] -def as_constraint(thing): - """Casts an object into a cube constraint where possible. +def as_constraint(thing: Constraint | str | None) -> Constraint: + """Cast an object into a cube constraint where possible. - Casts an object into a cube constraint where possible, otherwise + Cast an object into a cube constraint where possible, otherwise a TypeError will be raised. If the given object is already a valid constraint then the given object diff --git a/lib/iris/_data_manager.py b/lib/iris/_data_manager.py index 15dfbd0030..dbd122ba04 100644 --- a/lib/iris/_data_manager.py +++ b/lib/iris/_data_manager.py @@ -171,7 +171,7 @@ def _deepcopy(self, memo, data=None): @property def data(self): - """Returns the real data. Any lazy data being managed will be realised. + """Return the real data. Any lazy data being managed will be realised. Returns ------- diff --git a/lib/iris/_lazy_data.py b/lib/iris/_lazy_data.py index 36c0825ad8..a3dfa1edb4 100644 --- a/lib/iris/_lazy_data.py +++ b/lib/iris/_lazy_data.py @@ -9,6 +9,8 @@ """ from functools import lru_cache, wraps +from types import ModuleType +from typing import Sequence import dask import dask.array as da @@ -41,6 +43,11 @@ def is_lazy_data(data): return result +def is_masked_data(data: np.ndarray | da.Array) -> bool: + """Return whether the argument is a masked array.""" + return isinstance(da.utils.meta_from_array(data), np.ma.MaskedArray) + + def is_lazy_masked_data(data): """Determine whether managed data is lazy and masked. @@ -48,7 +55,7 @@ def is_lazy_masked_data(data): underlying array is of masked type. Otherwise return False. """ - return is_lazy_data(data) and ma.isMA(da.utils.meta_from_array(data)) + return is_lazy_data(data) and is_masked_data(data) @lru_cache @@ -220,9 +227,7 @@ def _optimum_chunksize( ) -def as_lazy_data( - data, chunks=None, asarray=False, dims_fixed=None, dask_chunking=False -): +def as_lazy_data(data, chunks=None, asarray=False, meta=None, dims_fixed=None): """Convert the input array `data` to a :class:`dask.array.Array`. Parameters @@ -232,17 +237,18 @@ def as_lazy_data( This will be converted to a :class:`dask.array.Array`. chunks : list of int, optional If present, a source chunk shape, e.g. for a chunked netcdf variable. + If set to "auto", Iris chunking optimisation will be bypassed, and dask's + default chunking will be used instead. asarray : bool, default=False If True, then chunks will be converted to instances of `ndarray`. Set to False (default) to pass passed chunks through unchanged. + meta : numpy.ndarray, optional + Empty ndarray created with same NumPy backend, ndim and dtype as the + Dask Array being created. dims_fixed : list of bool, optional If set, a list of values equal in length to 'chunks' or data.ndim. 'True' values indicate a dimension which can not be changed, i.e. the result for that index must equal the value in 'chunks' or data.shape. - dask_chunking : bool, default=False - If True, Iris chunking optimisation will be bypassed, and dask's default - chunking will be used instead. Including a value for chunks while dask_chunking - is set to True will result in a failure. Returns ------- @@ -258,13 +264,16 @@ def as_lazy_data( but reduced by a factor if that exceeds the dask default chunksize. """ - if dask_chunking: - if chunks is not None: - raise ValueError( - f"Dask chunking chosen, but chunks already assigned value {chunks}" - ) - lazy_params = {"asarray": asarray, "meta": np.ndarray} - else: + if isinstance(data, ma.core.MaskedConstant): + data = ma.masked_array(data.data, mask=data.mask) + + if meta is None and not isinstance(data, (np.ndarray, da.Array)): + raise ValueError( + "For performance reasons, `meta` cannot be `None` if `data` is " + "anything other than a Numpy or Dask array." + ) + + if chunks != "auto": if chunks is None: # No existing chunks : Make a chunk the shape of the entire input array # (but we will subdivide it if too big). @@ -281,15 +290,9 @@ def as_lazy_data( dtype=data.dtype, dims_fixed=dims_fixed, ) - lazy_params = { - "chunks": chunks, - "asarray": asarray, - "meta": np.ndarray, - } - if isinstance(data, ma.core.MaskedConstant): - data = ma.masked_array(data.data, mask=data.mask) + if not is_lazy_data(data): - data = da.from_array(data, **lazy_params) + data = da.from_array(data, chunks=chunks, asarray=asarray, meta=meta) return data @@ -338,7 +341,7 @@ def as_concrete_data(data): Parameters ---------- data : - A dask array, NumPy `ndarray` or masked array + A dask array, NumPy `ndarray` or masked array. Returns ------- @@ -351,7 +354,95 @@ def as_concrete_data(data): return data -def multidim_lazy_stack(stack): +def _combine( + arrays: Sequence[da.Array | np.ndarray], + operation: str, + **kwargs, +) -> da.Array | np.ndarray: + """Combine multiple arrays into a single array. + + Provides enhanced versions of :func:`~dask.array.concatenate` or :func:`~dask.array.stack`, + which ensure that all computed results are masked-array, if the combined .meta is masked. + + Parameters + ---------- + arrays : + The arrays to combine. + operation : + The combination operation to apply. + **kwargs : + Any keyword arguments to pass to the combination operation. + + """ + lazy = any(is_lazy_data(a) for a in arrays) + masked = any(is_masked_data(a) for a in arrays) + + array_module: ModuleType = np + if masked: + if lazy: + # Avoid inconsistent array type when slicing resulting array + arrays = tuple( + a if is_lazy_masked_data(a) else da.ma.masked_array(a) for a in arrays + ) + else: + # Avoid dropping the masks + array_module = np.ma + + func = getattr(array_module, operation) + return func(arrays, **kwargs) + + +def concatenate( + arrays: Sequence[da.Array | np.ndarray], + axis: int = 0, +) -> da.Array | np.ndarray: + """Concatenate a sequence of arrays along a new axis. + + Improves on the regular :func:`dask.array.concatenate` by always respecting a masked + ``.meta``, as described for :func:`_combine`. + + Parameters + ---------- + arrays : + The arrays must have the same shape, except in the dimension + corresponding to `axis` (the first, by default). + axis : + Dimension along which to align all of the arrays. If axis is None, + arrays are flattened before use. + + Returns + ------- + The concatenated array. + + """ + return _combine(arrays, operation="concatenate", axis=axis) + + +def stack( + arrays: Sequence[da.Array | np.ndarray], + axis: int = 0, +) -> da.Array | np.ndarray: + """Stack a sequence of arrays along a new axis. + + Improves on the regular :func:`dask.array.stack` by always respecting a masked + ``.meta``, as described for :func:`_combine`. + + Parameters + ---------- + arrays : + The arrays must have the same shape. + axis : + Dimension along which to align all of the arrays. + + Returns + ------- + The stacked array. + + """ + return _combine(arrays, operation="stack", axis=axis) + + +def multidim_lazy_stack(arr): """Recursively build a multidimensional stacked dask array. This is needed because :meth:`dask.array.Array.stack` only accepts a @@ -359,7 +450,7 @@ def multidim_lazy_stack(stack): Parameters ---------- - stack : + arr : An ndarray of :class:`dask.array.Array`. Returns @@ -367,15 +458,15 @@ def multidim_lazy_stack(stack): The input array converted to a lazy :class:`dask.array.Array`. """ - if stack.ndim == 0: + if arr.ndim == 0: # A 0-d array cannot be stacked. - result = stack.item() - elif stack.ndim == 1: + result = arr.item() + elif arr.ndim == 1: # Another base case : simple 1-d goes direct in dask. - result = da.stack(list(stack)) + result = stack(list(arr)) else: # Recurse because dask.stack does not do multi-dimensional. - result = da.stack([multidim_lazy_stack(subarray) for subarray in stack]) + result = stack([multidim_lazy_stack(subarray) for subarray in arr]) return result @@ -446,14 +537,16 @@ def lazy_elementwise(lazy_array, elementwise_op): # call may cast to float, or not, depending on unit equality : Thus, it's # much safer to get udunits to decide that for us. dtype = elementwise_op(np.zeros(1, lazy_array.dtype)).dtype + meta = da.utils.meta_from_array(lazy_array).astype(dtype) - return da.map_blocks(elementwise_op, lazy_array, dtype=dtype) + return da.map_blocks(elementwise_op, lazy_array, dtype=dtype, meta=meta) -def map_complete_blocks(src, func, dims, out_sizes): +def map_complete_blocks(src, func, dims, out_sizes, dtype, *args, **kwargs): """Apply a function to complete blocks. Complete means that the data is not chunked along the chosen dimensions. + Uses :func:`dask.array.map_blocks` to implement the mapping. Parameters ---------- @@ -465,27 +558,52 @@ def map_complete_blocks(src, func, dims, out_sizes): Dimensions that cannot be chunked. out_sizes : tuple of int Output size of dimensions that cannot be chunked. + dtype : + Output dtype. + *args : tuple + Additional arguments to pass to `func`. + **kwargs : dict + Additional keyword arguments to pass to `func`. + + Returns + ------- + Array-like + + See Also + -------- + :func:`dask.array.map_blocks` : The function used for the mapping. """ + data = None + result = None + if is_lazy_data(src): data = src elif not hasattr(src, "has_lazy_data"): # Not a lazy array and not a cube. So treat as ordinary numpy array. - return func(src) + result = func(src, *args, **kwargs) elif not src.has_lazy_data(): - return func(src.data) + result = func(src.data, *args, **kwargs) else: data = src.lazy_data() - # Ensure dims are not chunked - in_chunks = list(data.chunks) - for dim in dims: - in_chunks[dim] = src.shape[dim] - data = data.rechunk(in_chunks) + if result is None and data is not None: + # Ensure dims are not chunked + in_chunks = list(data.chunks) + for dim in dims: + in_chunks[dim] = src.shape[dim] + data = data.rechunk(in_chunks) - # Determine output chunks - out_chunks = list(data.chunks) - for dim, size in zip(dims, out_sizes): - out_chunks[dim] = size + # Determine output chunks + out_chunks = list(data.chunks) + for dim, size in zip(dims, out_sizes): + out_chunks[dim] = size - return data.map_blocks(func, chunks=out_chunks, dtype=src.dtype) + # Assume operation preserves mask. + meta = da.utils.meta_from_array(data).astype(dtype) + + result = data.map_blocks( + func, *args, chunks=out_chunks, meta=meta, dtype=dtype, **kwargs + ) + + return result diff --git a/lib/iris/_merge.py b/lib/iris/_merge.py index 85012c0ef8..5e00d9b2f0 100644 --- a/lib/iris/_merge.py +++ b/lib/iris/_merge.py @@ -388,7 +388,9 @@ def _defn_msgs(self, other_defn): diff_attrs = [ repr(key[1]) for key in attrs_1 - if np.all(attrs_1[key] != attrs_2[key]) + if not np.array_equal( + np.array(attrs_1[key], ndmin=1), np.array(attrs_2[key], ndmin=1) + ) ] diff_attrs = ", ".join(sorted(diff_attrs)) msgs.append( @@ -877,7 +879,7 @@ def _build_separable_group( dependency on any other candidate dimensions within the space. group : A set of related (chained) inseparable candidate dimensions. - separable_consistent_groups: + separable_consistent_groups : A list of candidate dimension groups that are consistently separable. positions : A list containing a dictionary of candidate dimension key to @@ -1047,7 +1049,7 @@ def derive_space(groups, relation_matrix, positions, function_matrix=None): ---------- groups : A list of all related (chained) inseparable candidate dimensions. - relation_matrix: + relation_matrix : The relation dictionary for each candidate dimension. positions : A list containing a dictionary of candidate dimension key to @@ -1230,14 +1232,6 @@ def merge(self, unique=True): # Generate group-depth merged cubes from the source-cubes. for level in range(group_depth): - # Track the largest dtype of the data to be merged. - # Unfortunately, da.stack() is not symmetric with regards - # to dtypes. So stacking float + int yields a float, but - # stacking an int + float yields an int! We need to ensure - # that the largest dtype prevails i.e. float, in order to - # support the masked case for dask. - # Reference https://github.com/dask/dask/issues/2273. - dtype = None # Stack up all the data from all of the relevant source # cubes in a single dask "stacked" array. # If it turns out that all the source cubes already had @@ -1258,21 +1252,11 @@ def merge(self, unique=True): else: data = as_lazy_data(data) stack[nd_index] = data - # Determine the largest dtype. - if dtype is None: - dtype = data.dtype - else: - dtype = np.promote_types(data.dtype, dtype) - - # Coerce to the largest dtype. - for nd_index in nd_indexes: - stack[nd_index] = stack[nd_index].astype(dtype) merged_data = multidim_lazy_stack(stack) if all_have_data: # All inputs were concrete, so turn the result back into a # normal array. - dtype = self._cube_signature.data_type merged_data = as_concrete_data(merged_data) merged_cube = self._get_cube(merged_data) merged_cubes.append(merged_cube) @@ -1294,7 +1278,7 @@ def register(self, cube, error_on_mismatch=False): cube : Candidate :class:`iris.cube.Cube` to be associated with this :class:`ProtoCube`. - error_on_mismatch :bool, default=False + error_on_mismatch : bool, default=False If True, raise an informative :class:`~iris.exceptions.MergeError` if registration fails. @@ -1335,7 +1319,8 @@ def _guess_axis(self, name): Returns ------- - axis : {'T', 'Z', 'Y', 'X'} or None. + str or None + {'T', 'Z', 'Y', 'X'} or None. """ axis = None diff --git a/lib/iris/_representation/cube_printout.py b/lib/iris/_representation/cube_printout.py index 3c418bde64..1e648b25f6 100644 --- a/lib/iris/_representation/cube_printout.py +++ b/lib/iris/_representation/cube_printout.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Provides text printouts of Iris cubes.""" + from copy import deepcopy from iris._representation.cube_summary import CubeSummary diff --git a/lib/iris/_representation/cube_summary.py b/lib/iris/_representation/cube_summary.py index 64a6aadbf3..20d93f1acf 100644 --- a/lib/iris/_representation/cube_summary.py +++ b/lib/iris/_representation/cube_summary.py @@ -3,8 +3,12 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Provides objects describing cube summaries.""" + import re +import numpy as np + +import iris._lazy_data as _lazy from iris.common.metadata import hexdigest import iris.util @@ -43,6 +47,8 @@ def __init__(self, cube, name_padding=35): def string_repr(text, quote_strings=False, clip_strings=False): """Produce a one-line printable form of a text string.""" + # Convert any np.str_ instances to plain strings. + text = str(text) force_quoted = re.findall("[\n\t]", text) or quote_strings if force_quoted: # Replace the string with its repr (including quotes). @@ -148,25 +154,61 @@ def __init__(self, cube, coord): self.unit = "" else: self.unit = " {!s}".format(coord.units) - coord_cell = coord.cell(0) - if isinstance(coord_cell.point, str): + + # Don't print values of lazy coords, as computing them could cost a lot. + safe_to_print = not _lazy.is_lazy_data(coord.core_points()) + if not safe_to_print: + # However there is a special case: If it is a *factory* coord, then those + # are generally lazy. If all the dependencies are real, then it is useful + # (and safe) to compute + print the value. + for factory in cube._aux_factories: + # Note : a factory doesn't have a ".metadata" which can be matched + # against a coord. For now, just assume that it has a 'standard_name' + # property (also not actually guaranteed), and require them to match. + if coord.standard_name == factory.standard_name: + all_deps_real = True + for dependency_coord in factory.dependencies.values(): + if ( + dependency_coord.has_lazy_points() + or dependency_coord.has_lazy_bounds() + ): + all_deps_real = False + + if all_deps_real: + safe_to_print = True + + if safe_to_print: + coord_cell = coord.cell(0) + else: + coord_cell = None + + if coord.dtype.type is np.str_: self.string_type = True - # 'lines' is value split on '\n', and _each one_ length-clipped. - self.lines = [ - iris.util.clip_string(str(item)) - for item in coord_cell.point.split("\n") - ] + if coord_cell is not None: + # 'lines' is value split on '\n', and _each one_ length-clipped. + self.lines = [ + iris.util.clip_string(str(item)) + for item in coord_cell.point.split("\n") + ] + # 'content' contains a one-line printable version of the string, + content = string_repr(coord_cell.point) + content = iris.util.clip_string(content) + else: + content = "" + self.lines = [content] self.point = None self.bound = None - # 'content' contains a one-line printable version of the string, - content = string_repr(coord_cell.point) - content = iris.util.clip_string(content) self.content = content else: self.string_type = False self.lines = None - self.point = "{!s}".format(coord_cell.point) - coord_cell_cbound = coord_cell.bound + coord_cell_cbound = None + if coord_cell is not None: + self.point = "{!s}".format(coord_cell.point) + coord_cell_cbound = coord_cell.bound + else: + self.point = "" + if coord_cell_cbound is not None: self.bound = "({})".format( ", ".join(str(val) for val in coord_cell_cbound) @@ -174,6 +216,9 @@ def __init__(self, cube, coord): self.content = "{}{}, bound={}{}".format( self.point, self.unit, self.bound, self.unit ) + elif coord.has_bounds(): + self.bound = "+bound" + self.content = "{}{}".format(self.point, self.bound) else: self.bound = None self.content = "{}{}".format(self.point, self.unit) diff --git a/lib/iris/_shapefiles.py b/lib/iris/_shapefiles.py index 351e798ae5..74b24b6627 100644 --- a/lib/iris/_shapefiles.py +++ b/lib/iris/_shapefiles.py @@ -35,20 +35,20 @@ def create_shapefile_mask( ---------- geometry : :class:`shapely.Geometry` cube : :class:`iris.cube.Cube` - A :class:`~iris.cube.Cube` which has 1d x and y coordinates + A :class:`~iris.cube.Cube` which has 1d x and y coordinates. minimum_weight : float, default 0.0 A float between 0 and 1 determining what % of a cell a shape must cover for the cell to remain unmasked. eg: 0.1 means that at least 10% of the shape overlaps the cell to be unmasked. Requires geometry to be a Polygon or MultiPolygon - Defaults to 0.0 (eg only test intersection) + Defaults to 0.0 (eg only test intersection). Returns ------- :class:`np.array` An array of the shape of the x & y coordinates of the cube, with points - to mask equal to True + to mask equal to True. """ from iris.cube import Cube, CubeList @@ -121,19 +121,19 @@ def _transform_coord_system(geometry, cube, geometry_system=None): Parameters ---------- - geometry: :class:`shapely.Geometry` - cube: :class:`iris.cube.Cube` + geometry : :class:`shapely.Geometry` + cube : :class:`iris.cube.Cube` :class:`~iris.cube.Cube` with the coord_system to be projected to and - a x coordinate - geometry_system: :class:`iris.coord_systems`, optional + a x coordinate. + geometry_system : :class:`iris.coord_systems`, optional A :class:`~iris.coord_systems` object describing the coord_system of the shapefile. Defaults to None, - which is treated as GeogCS + which is treated as GeogCS. Returns ------- :class:`shapely.Geometry` - A transformed copy of the provided :class:`shapely.Geometry` + A transformed copy of the provided :class:`shapely.Geometry`. """ y_name, x_name = _cube_primary_xy_coord_names(cube) @@ -196,7 +196,7 @@ def _cube_primary_xy_coord_names(cube): Returns ------- tuple of str - The names of the primary latitude and longitude coordinates + The names of the primary latitude and longitude coordinates. """ latc = ( @@ -225,12 +225,12 @@ def _get_mod_rebased_coord_bounds(coord): Parameters ---------- coord : :class:`iris.coords.Coord` - An Iris coordinate with a modulus + An Iris coordinate with a modulus. Returns ------- :class:`np.array` - A 1d Numpy array of [start,end] pairs for bounds of the coord + A 1d Numpy array of [start,end] pairs for bounds of the coord. """ modulus = coord.units.modulus diff --git a/lib/iris/analysis/__init__.py b/lib/iris/analysis/__init__.py index 773e804a14..2c890ef8cc 100644 --- a/lib/iris/analysis/__init__.py +++ b/lib/iris/analysis/__init__.py @@ -35,13 +35,13 @@ from __future__ import annotations -from collections.abc import Iterable +from collections.abc import Iterable, Sequence import functools from functools import wraps from inspect import getfullargspec import itertools from numbers import Number -from typing import Optional, Union +from typing import Optional, Protocol, Union import warnings from cf_units import Unit @@ -56,7 +56,7 @@ from iris.analysis._interpolation import EXTRAPOLATION_MODES, RectilinearInterpolator from iris.analysis._regrid import CurvilinearRegridder, RectilinearRegridder import iris.coords -from iris.coords import _DimensionalMetadata +from iris.coords import AuxCoord, DimCoord, _DimensionalMetadata from iris.exceptions import LazyAggregatorError import iris.util @@ -203,7 +203,7 @@ def _dimensional_metadata_comparison(*cubes, object_get=None): Convenience function to help compare coordinates, cell-measures or ancillary-variables, on one or more cubes, by their metadata. - .. Note:: + .. note:: Up to Iris 2.x, this _used_ to be the public API method "iris.analysis.coord_comparison". @@ -217,70 +217,72 @@ def _dimensional_metadata_comparison(*cubes, object_get=None): Parameters ---------- cubes : iterable of `iris.cube.Cube` - a set of cubes whose coordinates, cell-measures or ancillary-variables are to + A set of cubes whose coordinates, cell-measures or ancillary-variables are to be compared. object_get : callable(cube) or None, optional If not None, this must be a cube method returning a list of all cube elements of the required type, i.e. one of `iris.cube.Cube.coords`, `iris.cube.Cube.cell_measures`, or `iris.cube.Cube.ancillary_variables`. - If not specified, defaults to `iris.cube.Cube.coords` + If not specified, defaults to `iris.cube.Cube.coords`. Returns ------- - result : dict mapping str, list of _CoordGroup + (dict mapping str, list of _CoordGroup) A dictionary whose keys are match categories and values are groups of coordinates, cell-measures or ancillary-variables. - The values of the returned dictionary are lists of _CoordGroup representing - grouped coordinates. Each _CoordGroup contains all the input 'cubes', and a - matching list of the coord within each cube that matches some specific CoordDefn - (or maybe None). - - The keys of the returned dictionary are strings naming 'categories' : Each - represents a statement, - "Given these cubes list the coordinates which, - when grouped by metadata, are/have..." - - Returned Keys: - - * **grouped_coords**. - A list of coordinate groups of all the coordinates grouped together - by their coordinate definition - * **ungroupable**. - A list of coordinate groups which contain at least one None, - meaning not all Cubes provide an equivalent coordinate - * **not_equal**. - A list of coordinate groups of which not all are equal - (superset of ungroupable) - * **no_data_dimension**> - A list of coordinate groups of which all have no data dimensions on - their respective cubes - * **scalar**> - A list of coordinate groups of which all have shape (1, ) - * **non_equal_data_dimension**. - A list of coordinate groups of which not all have the same - data dimension on their respective cubes - * **non_equal_shape**. - A list of coordinate groups of which not all have the same shape - * **equal_data_dimension**. - A list of coordinate groups of which all have the same data dimension - on their respective cubes - * **equal**. - A list of coordinate groups of which all are equal - * **ungroupable_and_dimensioned**. - A list of coordinate groups of which not all cubes had an equivalent - (in metadata) coordinate which also describe a data dimension - * **dimensioned**. - A list of coordinate groups of which all describe a data dimension on - their respective cubes - * **ignorable**. - A list of scalar, ungroupable non_equal coordinate groups - * **resamplable**. - A list of equal, different data dimensioned coordinate groups - * **transposable**. - A list of non equal, same data dimensioned, non scalar coordinate groups - - Example usage:: + The values of the returned dictionary are lists of _CoordGroup representing + grouped coordinates. Each _CoordGroup contains all the input 'cubes', and a + matching list of the coord within each cube that matches some specific CoordDefn + (or maybe None). + + The keys of the returned dictionary are strings naming 'categories' : Each + represents a statement, + "Given these cubes list the coordinates which, + when grouped by metadata, are/have..." + + Returned Keys: + + * **grouped_coords**. + A list of coordinate groups of all the coordinates grouped together + by their coordinate definition + * **ungroupable**. + A list of coordinate groups which contain at least one None, + meaning not all Cubes provide an equivalent coordinate + * **not_equal**. + A list of coordinate groups of which not all are equal + (superset of ungroupable) + * **no_data_dimension**> + A list of coordinate groups of which all have no data dimensions on + their respective cubes + * **scalar**> + A list of coordinate groups of which all have shape (1, ) + * **non_equal_data_dimension**. + A list of coordinate groups of which not all have the same + data dimension on their respective cubes + * **non_equal_shape**. + A list of coordinate groups of which not all have the same shape + * **equal_data_dimension**. + A list of coordinate groups of which all have the same data dimension + on their respective cubes + * **equal**. + A list of coordinate groups of which all are equal + * **ungroupable_and_dimensioned**. + A list of coordinate groups of which not all cubes had an equivalent + (in metadata) coordinate which also describe a data dimension + * **dimensioned**. + A list of coordinate groups of which all describe a data dimension on + their respective cubes + * **ignorable**. + A list of scalar, ungroupable non_equal coordinate groups + * **resamplable**. + A list of equal, different data dimensioned coordinate groups + * **transposable**. + A list of non equal, same data dimensioned, non scalar coordinate groups + + Examples + -------- + :: result = _dimensional_metadata_comparison(cube1, cube2) print('All equal coordinates: ', result['equal']) @@ -607,14 +609,16 @@ def update_metadata(self, cube, coords, **kwargs): else: # new style (preferred) cube.units = self.units_func(cube.units, **kwargs) - def post_process(self, collapsed_cube, data_result, coords, **kwargs): + def post_process( + self, collapsed_cube, data_result, coords, **kwargs + ): # numpydoc ignore=SS05 """Process the result from :func:`iris.analysis.Aggregator.aggregate`. Parameters ---------- - collapsed_cube: :class:`iris.cube.Cube`. + collapsed_cube : :class:`iris.cube.Cube` data_result : - Result from :func:`iris.analysis.Aggregator.aggregate` + Result from :func:`iris.analysis.Aggregator.aggregate`. coords : The one or more coordinates that were aggregated over. **kwargs : dict, optional @@ -779,14 +783,16 @@ def lazy_aggregate(self, data, axis, **kwargs): """ return self._base_aggregate(data, axis, lazy=True, **kwargs) - def post_process(self, collapsed_cube, data_result, coords, **kwargs): + def post_process( + self, collapsed_cube, data_result, coords, **kwargs + ): # numpydoc ignore=SS05 """Process the result from :func:`iris.analysis.Aggregator.aggregate`. Parameters ---------- collapsed_cube : :class:`iris.cube.Cube` data_result : - Result from :func:`iris.analysis.Aggregator.aggregate` + Result from :func:`iris.analysis.Aggregator.aggregate`. coords : The one or more coordinates that were aggregated over. **kwargs : dict, optional @@ -945,7 +951,9 @@ def __init__(self, units_func=None, lazy_func=None, **kwargs): #: A list of keywords associated with weighted behaviour. self._weighting_keywords = ["returned", "weights"] - def post_process(self, collapsed_cube, data_result, coords, **kwargs): + def post_process( + self, collapsed_cube, data_result, coords, **kwargs + ): # numpydoc ignore=SS05 """Process the result from :func:`iris.analysis.Aggregator.aggregate`. Returns a tuple(cube, weights) if a tuple(data, weights) was returned @@ -955,7 +963,7 @@ def post_process(self, collapsed_cube, data_result, coords, **kwargs): ---------- collapsed_cube : :class:`iris.cube.Cube` data_result : - Result from :func:`iris.analysis.Aggregator.aggregate` + Result from :func:`iris.analysis.Aggregator.aggregate`. coords : The one or more coordinates that were aggregated over. **kwargs : dict, optional @@ -1101,7 +1109,9 @@ def uses_weighting(self, **kwargs): break return result - def post_process(self, collapsed_cube, data_result, coords, **kwargs): + def post_process( + self, collapsed_cube, data_result, coords, **kwargs + ): # numpydoc ignore=SS05 """Process the result from :func:`iris.analysis.Aggregator.aggregate`. Returns a tuple(cube, weights) if a tuple(data, weights) was returned @@ -1111,7 +1121,7 @@ def post_process(self, collapsed_cube, data_result, coords, **kwargs): ---------- collapsed_cube : :class:`iris.cube.Cube` data_result : - Result from :func:`iris.analysis.Aggregator.aggregate` + Result from :func:`iris.analysis.Aggregator.aggregate`. coords : The one or more coordinates that were aggregated over. **kwargs : dict, optional @@ -1363,14 +1373,14 @@ def _percentile(data, percent, fast_percentile_method=False, **kwargs): Parameters ---------- - dataM : array-like - array from which percentiles are to be calculated - fast_percentile_method: bool, optional + data : array-like + Array from which percentiles are to be calculated. + fast_percentile_method : bool, optional When set to True, uses the numpy.percentiles method as a faster alternative to the scipy.mstats.mquantiles method. Does not handle masked arrays. **kwargs : dict, optional - passed to scipy.stats.mstats.mquantiles if fast_percentile_method is + Passed to scipy.stats.mstats.mquantiles if fast_percentile_method is False. Otherwise passed to numpy.percentile. """ @@ -1378,18 +1388,17 @@ def _percentile(data, percent, fast_percentile_method=False, **kwargs): percent = [percent] percent = np.array(percent) - # Perform the percentile calculation. - _partial_percentile = functools.partial( - _calc_percentile, + result = iris._lazy_data.map_complete_blocks( + data, + func=_calc_percentile, + dims=(-1,), + out_sizes=percent.shape, + dtype=np.float64, percent=percent, fast_percentile_method=fast_percentile_method, **kwargs, ) - result = iris._lazy_data.map_complete_blocks( - data, _partial_percentile, (-1,), percent.shape - ) - # Check whether to reduce to a scalar result, as per the behaviour # of other aggregators. if result.shape == (1,): @@ -1406,20 +1415,20 @@ def _weighted_quantile_1D(data, weights, quantiles, **kwargs): Parameters ---------- data : array - One dimensional data array - weights: array + One dimensional data array. + weights : array Array of the same size of `data`. If data is masked, weights must have matching mask. quantiles : float or sequence of floats Quantile(s) to compute. Must have a value between 0 and 1. **kwargs : dict, optional - passed to `scipy.interpolate.interp1d` + Passed to `scipy.interpolate.interp1d`. Returns ------- array or float. Calculated quantile values (set to np.nan wherever sum - of weights is zero or masked) + of weights is zero or masked). """ # Return np.nan if no usable points found if np.isclose(weights.sum(), 0.0) or ma.is_masked(weights.sum()): @@ -1457,9 +1466,10 @@ def _weighted_percentile(data, axis, weights, percent, returned=False, **kwargs) ---------- data : ndarray or masked array axis : int - axis to calculate percentiles over + Axis to calculate percentiles over. weights : ndarray - array with the weights. Must have same shape as data + Array with the weights. Must have same shape as data or the shape of + data along axis. percent : float or sequence of floats Percentile rank/s at which to extract value/s. returned : bool, default=False @@ -1467,12 +1477,18 @@ def _weighted_percentile(data, axis, weights, percent, returned=False, **kwargs) first element and the sum of the weights as the second element. """ - # Ensure that data and weights arrays are same shape. - if data.shape != weights.shape: - raise ValueError("_weighted_percentile: weights wrong shape.") + # Ensure that weights array is the same shape as data, or the shape of data along + # axis. + if data.shape != weights.shape and data.shape[axis : axis + 1] != weights.shape: + raise ValueError( + f"For data array of shape {data.shape}, weights should be {data.shape} or {data.shape[axis : axis + 1]}" + ) # Ensure that the target axis is the last dimension. data = np.rollaxis(data, axis, start=data.ndim) - weights = np.rollaxis(weights, axis, start=data.ndim) + if weights.ndim > 1: + weights = np.rollaxis(weights, axis, start=data.ndim) + elif data.ndim > 1: + weights = np.broadcast_to(weights, data.shape) quantiles = np.array(percent) / 100.0 # Add data mask to weights if necessary. if ma.isMaskedArray(data): @@ -1833,7 +1849,7 @@ def interp_order(length): and lazy data. """ -MAX_RUN.name = lambda: "max_run" +MAX_RUN.name = lambda: "max_run" # type: ignore[method-assign] GMEAN = Aggregator("geometric_mean", scipy.stats.mstats.gmean) @@ -2273,8 +2289,8 @@ class _Groupby: def __init__( self, - groupby_coords: list[iris.coords.Coord], - shared_coords: Optional[list[tuple[iris.coords.Coord, int]]] = None, + groupby_coords: Iterable[AuxCoord | DimCoord], + shared_coords: Optional[Iterable[tuple[AuxCoord | DimCoord, int]]] = None, climatological: bool = False, ) -> None: """Determine the group slices over the group-by coordinates. @@ -2295,9 +2311,9 @@ def __init__( """ #: Group-by and shared coordinates that have been grouped. - self.coords: list[iris.coords.Coord] = [] - self._groupby_coords: list[iris.coords.Coord] = [] - self._shared_coords: list[tuple[iris.coords.Coord, int]] = [] + self.coords: list[AuxCoord | DimCoord] = [] + self._groupby_coords: list[AuxCoord | DimCoord] = [] + self._shared_coords: list[tuple[AuxCoord | DimCoord, int]] = [] self._groupby_indices: list[tuple[int, ...]] = [] self._stop = None # Ensure group-by coordinates are iterable. @@ -2323,10 +2339,10 @@ def __init__( # Stores mapping from original cube coords to new ones, as metadata may # not match self.coord_replacement_mapping: list[ - tuple[iris.coords.Coord, iris.coords.Coord] + tuple[AuxCoord | DimCoord, AuxCoord | DimCoord] ] = [] - def _add_groupby_coord(self, coord: iris.coords.Coord) -> None: + def _add_groupby_coord(self, coord: AuxCoord | DimCoord) -> None: if coord.ndim != 1: raise iris.exceptions.CoordinateMultiDimError(coord) if self._stop is None: @@ -2335,7 +2351,7 @@ def _add_groupby_coord(self, coord: iris.coords.Coord) -> None: raise ValueError("Group-by coordinates have different lengths.") self._groupby_coords.append(coord) - def _add_shared_coord(self, coord: iris.coords.Coord, dim: int) -> None: + def _add_shared_coord(self, coord: AuxCoord | DimCoord, dim: int) -> None: if coord.shape[dim] != self._stop and self._stop is not None: raise ValueError("Shared coordinates have different lengths.") self._shared_coords.append((coord, dim)) @@ -2568,6 +2584,37 @@ def clear_phenomenon_identity(cube): ############################################################################### +class Interpolator(Protocol): + def __call__( # noqa: E704 # ruff formatting conflicts with flake8 + self, + sample_points: Sequence[np.typing.ArrayLike], + collapse_scalar: bool, + ) -> iris.cube.Cube: ... + + +class InterpolationScheme(Protocol): + def interpolator( # noqa: E704 # ruff formatting conflicts with flake8 + self, + cube: iris.cube.Cube, + coords: AuxCoord | DimCoord | str, + ) -> Interpolator: ... + + +class Regridder(Protocol): + def __call__( # noqa: E704 # ruff formatting conflicts with flake8 + self, + src: iris.cube.Cube, + ) -> iris.cube.Cube: ... + + +class RegriddingScheme(Protocol): + def regridder( # noqa: E704 # ruff formatting conflicts with flake8 + self, + src_grid: iris.cube.Cube, + target_grid: iris.cube.Cube, + ) -> Regridder: ... + + class Linear: """Describes the linear interpolation and regridding scheme. @@ -2641,7 +2688,7 @@ def interpolator(self, cube, coords): Returns ------- A callable with the interface: ``callable(sample_points, collapse_scalar=True)`` - where `sample_points` is a sequence containing an array of values + Where `sample_points` is a sequence containing an array of values for each of the coordinates passed to this method, and ``collapse_scalar`` determines whether to remove length one dimensions in the result cube caused by scalar values in @@ -2690,7 +2737,7 @@ def regridder(self, src_grid, target_grid): Returns ------- A callable with the interface ``callable(cube)`` - where `cube` is a cube with the same grid as ``src_grid`` + Where `cube` is a cube with the same grid as ``src_grid`` that is to be regridded to the ``target_grid``. """ @@ -2770,7 +2817,7 @@ def regridder(self, src_grid_cube, target_grid_cube): Returns ------- A callable with the interface `callable(cube)` - where `cube` is a cube with the same grid as `src_grid_cube` + Where `cube` is a cube with the same grid as `src_grid_cube` that is to be regridded to the grid of `target_grid_cube`. """ @@ -2917,7 +2964,7 @@ class UnstructuredNearest: must be. Otherwise, the corresponding X and Y coordinates must have the same units in the source and grid cubes. - .. Note:: + .. note:: Currently only supports regridding, not interpolation. """ @@ -2972,7 +3019,7 @@ def regridder(self, src_cube, target_grid): Returns ------- A callable with the interface `callable(cube)` - where `cube` is a cube with the same grid as `src_cube` + Where `cube` is a cube with the same grid as `src_cube` that is to be regridded to the `target_grid`. """ diff --git a/lib/iris/analysis/_area_weighted.py b/lib/iris/analysis/_area_weighted.py index 263f83838c..3ed4f8aa33 100644 --- a/lib/iris/analysis/_area_weighted.py +++ b/lib/iris/analysis/_area_weighted.py @@ -39,7 +39,7 @@ def __init__(self, src_grid_cube, target_grid_cube, mdtol=1): Notes ----- - .. Note:: + .. note:: Both source and target cubes must have an XY grid defined by separate X and Y dimensions with dimension coordinates. @@ -392,9 +392,18 @@ def _regrid_area_weighted_rectilinear_src_and_grid__perform( tgt_shape = (len(grid_y.points), len(grid_x.points)) - # Calculate new data array for regridded cube. - regrid = functools.partial( - _regrid_along_dims, + # Specify the output dtype + if np.issubdtype(src_cube.dtype, np.integer): + out_dtype = np.float64 + else: + out_dtype = src_cube.dtype + + new_data = map_complete_blocks( + src_cube, + func=_regrid_along_dims, + dims=(src_y_dim, src_x_dim), + out_sizes=meshgrid_x.shape, + dtype=out_dtype, x_dim=src_x_dim, y_dim=src_y_dim, weights=weights, @@ -402,10 +411,6 @@ def _regrid_area_weighted_rectilinear_src_and_grid__perform( mdtol=mdtol, ) - new_data = map_complete_blocks( - src_cube, regrid, (src_y_dim, src_x_dim), meshgrid_x.shape - ) - # Wrap up the data as a Cube. _regrid_callback = functools.partial( diff --git a/lib/iris/analysis/_grid_angles.py b/lib/iris/analysis/_grid_angles.py index 8712dd9ad1..80b73d81d7 100644 --- a/lib/iris/analysis/_grid_angles.py +++ b/lib/iris/analysis/_grid_angles.py @@ -21,13 +21,13 @@ def _3d_xyz_from_latlon(lon, lat): Parameters ---------- - lon, lat: float array + lon, lat : float array Arrays of longitudes and latitudes, in degrees. Both the same shape. Returns ------- - xyz : array, dtype=float64 + array of dtype=float64 Cartesian coordinates on a unit sphere. Shape is (3, ). The x / y / z coordinates are in xyz[0 / 1 / 2]. @@ -53,12 +53,12 @@ def _latlon_from_xyz(xyz): xyz : array Array of 3-D cartesian coordinates. Shape (3, ). - x / y / z values are in xyz[0 / 1 / 2], + x / y / z values are in xyz[0 / 1 / 2]. Returns ------- - lonlat : array - longitude and latitude position angles, in degrees. + np.array + Longitude and latitude position angles, in degrees. Shape (2, ). The longitudes / latitudes are in lonlat[0 / 1]. @@ -114,7 +114,7 @@ def _angle(p, q, r): Returns ------- - angle : float array + float array Grid angles relative to true-East, in degrees. Positive when grid-East is anticlockwise from true-East. Shape is same as . @@ -156,7 +156,7 @@ def gridcell_angles(x, y=None, cell_angle_boundpoints="mid-lhs, mid-rhs"): Parameters ---------- x : :class:`~iris.cube.Cube` - a grid cube with 2D X and Y coordinates, identified by 'axis'. + A grid cube with 2D X and Y coordinates, identified by 'axis'. The coordinates must be 2-dimensional with the same shape. The two dimensions represent grid dimensions in the order Y, then X. x, y : :class:`~iris.coords.Coord` @@ -166,10 +166,10 @@ def gridcell_angles(x, y=None, cell_angle_boundpoints="mid-lhs, mid-rhs"): If there is no coordinate system, they are assumed to be true longitudes and latitudes. Units must convertible to 'degrees'. x, y : 2-dimensional arrays of same shape (ny, nx) - longitude and latitude cell center locations, in degrees. + Longitude and latitude cell center locations, in degrees. The two dimensions represent grid dimensions in the order Y, then X. x, y : 3-dimensional arrays of same shape (ny, nx, 4) - longitude and latitude cell bounds, in degrees. + Longitude and latitude cell bounds, in degrees. The first two dimensions are grid dimensions in the order Y, then X. The last index maps cell corners anticlockwise from bottom-left. cell_angle_boundpoints : str, default="mid-lhs, mid-rhs" @@ -182,7 +182,7 @@ def gridcell_angles(x, y=None, cell_angle_boundpoints="mid-lhs, mid-rhs"): Returns ------- - angles : 2-dimensional cube + 2-dimensional cube Cube of angles of grid-x vector from true Eastward direction for each gridcell, in degrees. It also has "true" longitude and latitude coordinates, with no @@ -412,7 +412,7 @@ def rotate_grid_vectors(u_cube, v_cube, grid_angles_cube=None, grid_angles_kwarg Cubes of grid-u and grid-v vector components. Units should be differentials of true-distance, e.g. 'm/s'. grid_angles_cube : cube, optional - gridcell orientation angles. + Gridcell orientation angles. Units must be angular, i.e. can be converted to 'radians'. If not provided, grid angles are estimated from 'u_cube' using the :func:`gridcell_angles` method. @@ -422,20 +422,16 @@ def rotate_grid_vectors(u_cube, v_cube, grid_angles_cube=None, grid_angles_kwarg Returns ------- - true_u, true_v : cube - Cubes of true-north oriented vector components. + (cube, cube) + Tuple of cubes of true-north oriented vector components. Units are same as inputs. Notes ----- - .. note:: - - Vector magnitudes will always be the same as the inputs. - - .. note:: + Vector magnitudes will always be the same as the inputs. - This function does not maintain laziness when called; it realises data. - See more at :doc:`/userguide/real_and_lazy_data`. + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ u_out, v_out = (cube.copy() for cube in (u_cube, v_cube)) diff --git a/lib/iris/analysis/_interpolation.py b/lib/iris/analysis/_interpolation.py index babc414ee4..6904c5ae4f 100644 --- a/lib/iris/analysis/_interpolation.py +++ b/lib/iris/analysis/_interpolation.py @@ -180,7 +180,7 @@ def __init__(self, src_cube, coords, method, extrapolation_mode): The :class:`iris.cube.Cube` which is to be interpolated. coords : The names or coordinate instances which are to be - interpolated over + interpolated over. method : Either 'linear' or 'nearest'. extrapolation_mode : str @@ -477,7 +477,7 @@ def _points(self, sample_points, data, data_dims=None): sample_points : A list of N iterables, where N is the number of coordinates passed to the constructor. - [sample_values_for_coord_0, sample_values_for_coord_1, ...] + [sample_values_for_coord_0, sample_values_for_coord_1, ...]. data : The data to interpolate - not necessarily the data from the cube that was used to construct this interpolator. If the data has @@ -573,7 +573,7 @@ def __call__(self, sample_points, collapse_scalar=True): sample_points : A list of N iterables, where N is the number of coordinates passed to the constructor. - [sample_values_for_coord_0, sample_values_for_coord_1, ...] + [sample_values_for_coord_0, sample_values_for_coord_1, ...]. collapse_scalar : bool, default=True Whether to collapse the dimension of the scalar sample points in the resulting cube. Default is True. diff --git a/lib/iris/analysis/_regrid.py b/lib/iris/analysis/_regrid.py index b85265e5d9..fd56eb04a1 100644 --- a/lib/iris/analysis/_regrid.py +++ b/lib/iris/analysis/_regrid.py @@ -30,14 +30,17 @@ def _transform_xy_arrays(crs_from, x, y, crs_to): Parameters ---------- - crs_from, crs_to : :class:`cartopy.crs.Projection` + crs_from : :class:`cartopy.crs.Projection` The coordinate reference systems. x, y : arrays - point locations defined in 'crs_from'. + Point locations defined in 'crs_from'. + crs_to : :class:`cartopy.crs.Projection` + The coordinate reference systems. Returns ------- - x, y : Arrays of locations defined in 'crs_to'. + (array, array) + Arrays of locations defined in 'crs_to' of (x, y). """ pts = crs_to.transform_points(crs_from, x, y) @@ -153,22 +156,30 @@ def _src_align_and_flatten(coord): # # Wrap modular values (e.g. longitudes) if required. - modulus = sx.units.modulus + _modulus = sx.units.modulus + # Convert to NumPy scalar to enable cast checking. + modulus = np.min_scalar_type(_modulus).type(_modulus) + + def _cast_sx_points(sx_points_: np.ndarray): + """Ensure modulus arithmetic will not raise a TypeError.""" + if not np.can_cast(modulus, sx_points_.dtype): + new_type = np.promote_types(sx_points_.dtype, modulus.dtype) + result = sx_points_.astype(new_type, casting="safe") + else: + result = sx_points_ + return result + if modulus is not None: # Match the source cube x coordinate range to the target grid # cube x coordinate range. min_sx, min_tx = np.min(sx.points), np.min(tx.points) if min_sx < 0 and min_tx >= 0: indices = np.where(sx_points < 0) - # Ensure += doesn't raise a TypeError - if not np.can_cast(modulus, sx_points.dtype): - sx_points = sx_points.astype(type(modulus), casting="safe") + sx_points = _cast_sx_points(sx_points) sx_points[indices] += modulus elif min_sx >= 0 and min_tx < 0: indices = np.where(sx_points > (modulus / 2)) - # Ensure -= doesn't raise a TypeError - if not np.can_cast(modulus, sx_points.dtype): - sx_points = sx_points.astype(type(modulus), casting="safe") + sx_points = _cast_sx_points(sx_points) sx_points[indices] -= modulus # Create target grid cube x and y cell boundaries. @@ -636,7 +647,7 @@ def _regrid( A 2-dimensional array of sample X values. sample_grid_y : A 2-dimensional array of sample Y values. - method: str, default="linear" + method : str, default="linear" Either 'linear' or 'nearest'. The default method is 'linear'. extrapolation_mode : str, default="nanmask" Must be one of the following strings: @@ -932,9 +943,18 @@ def __call__(self, src): x_dim = src.coord_dims(src_x_coord)[0] y_dim = src.coord_dims(src_y_coord)[0] - # Define regrid function - regrid = functools.partial( - self._regrid, + # Specify the output dtype + if self._method == "linear" and np.issubdtype(src.dtype, np.integer): + out_dtype = np.float64 + else: + out_dtype = src.dtype + + data = map_complete_blocks( + src, + func=self._regrid, + dims=(y_dim, x_dim), + out_sizes=sample_grid_x.shape, + dtype=out_dtype, x_dim=x_dim, y_dim=y_dim, src_x_coord=src_x_coord, @@ -945,8 +965,6 @@ def __call__(self, src): extrapolation_mode=self._extrapolation_mode, ) - data = map_complete_blocks(src, regrid, (y_dim, x_dim), sample_grid_x.shape) - # Wrap up the data as a Cube. _regrid_callback = functools.partial( self._regrid, @@ -994,8 +1012,7 @@ def _create_cube(data, src, src_dims, tgt_coords, num_tgt_dims, regrid_callback) src_dims : tuple of int The dimensions of the X and Y coordinate within the source Cube. tgt_coords : tuple of :class:`iris.coords.Coord - Either two 1D :class:`iris.coords.DimCoord`, two 1D - :class:`iris.experimental.ugrid.DimCoord` or two n-D + Either two 1D :class:`iris.coords.DimCoord`, or two n-D :class:`iris.coords.AuxCoord` representing the new grid's X and Y coordinates. num_tgt_dims : int diff --git a/lib/iris/analysis/calculus.py b/lib/iris/analysis/calculus.py index 6955e847dc..4cb634efbe 100644 --- a/lib/iris/analysis/calculus.py +++ b/lib/iris/analysis/calculus.py @@ -134,7 +134,7 @@ def cube_delta(cube, coord): Parameters ---------- coord : - either a Coord instance or the unique name of a coordinate in the cube. + Either a Coord instance or the unique name of a coordinate in the cube. If a Coord instance is provided, it does not necessarily have to exist in the cube. @@ -423,7 +423,7 @@ def _coord_sin(coord): Parameters ---------- coord : - Coord instance with values in either degrees or radians + Coord instance with values in either degrees or radians. """ return _trig_method(coord, np.sin) @@ -435,7 +435,7 @@ def _coord_cos(coord): Parameters ---------- coord : - Coord instance with values in either degrees or radians + Coord instance with values in either degrees or radians. """ return _trig_method(coord, np.cos) @@ -447,9 +447,9 @@ def _trig_method(coord, trig_function): Parameters ---------- coord : - Coord instance with points values in either degrees or radians + Coord instance with points values in either degrees or radians. trig_function : - Reference to a trigonometric function e.g. numpy.sin + Reference to a trigonometric function e.g. numpy.sin. """ # If we are in degrees create a copy that is in radians. @@ -483,11 +483,11 @@ def curl(i_cube, j_cube, k_cube=None): Parameters ---------- i_cube : - The i cube of the vector to operate on + The i cube of the vector to operate on. j_cube : - The j cube of the vector to operate on + The j cube of the vector to operate on. k_cube : optional - The k cube of the vector to operate on + The k cube of the vector to operate on. Returns ------- @@ -760,7 +760,7 @@ def spatial_vectors_with_phenom_name(i_cube, j_cube, k_cube=None): The cube standard names must match one of the combinations in :data:`DIRECTIONAL_NAMES`. - This routine is designed to identify the vector quantites which each + This routine is designed to identify the vector quantities which each of the cubes provided represent and return a list of their 3d spatial dimension names and associated phenomenon. For example, given a cube of "u wind" and "v wind" the return value diff --git a/lib/iris/analysis/cartography.py b/lib/iris/analysis/cartography.py index bd1958581f..d3967dfef3 100644 --- a/lib/iris/analysis/cartography.py +++ b/lib/iris/analysis/cartography.py @@ -347,11 +347,11 @@ def _quadrant_area(radian_lat_bounds, radian_lon_bounds, radius_of_earth): Parameters ---------- radian_lat_bounds : - [n,2] array of latitude bounds (radians) + [n,2] array of latitude bounds (radians). radian_lon_bounds : - [n,2] array of longitude bounds (radians) + [n,2] array of longitude bounds (radians). radius_of_earth : - radius of the earth (currently assumed spherical) + Radius of the earth (currently assumed spherical). """ # ensure pairs of bounds @@ -376,7 +376,7 @@ def _quadrant_area(radian_lat_bounds, radian_lon_bounds, radius_of_earth): return np.abs(areas) -def area_weights(cube, normalize=False): +def area_weights(cube, normalize=False, compute=True, chunks=None): r"""Return an array of area weights, with the same dimensions as the cube. This is a 2D lat/lon area weights array, repeated over the non lat/lon @@ -401,6 +401,13 @@ def area_weights(cube, normalize=False): normalize : bool, default=False If False, weights are grid cell areas. If True, weights are grid cell areas divided by the total grid area. + compute : bool, default=True + If False, return a lazy dask array. If True, return a numpy array. + chunks : tuple, optional + If compute is False and a value is provided, then the result will use + these chunks instead of the same chunks as the cube data. The values + provided here will only be used along dimensions that are not latitude + or longitude. Returns ------- @@ -476,7 +483,13 @@ def area_weights(cube, normalize=False): # Create 2D weights from bounds. # Use the geographical area as the weight for each cell - ll_weights = _quadrant_area(lat.bounds, lon.bounds, radius_of_earth) + if compute: + lat_bounds = lat.bounds + lon_bounds = lon.bounds + else: + lat_bounds = lat.lazy_bounds() + lon_bounds = lon.lazy_bounds() + ll_weights = _quadrant_area(lat_bounds, lon_bounds, radius_of_earth) # Normalize the weights if necessary. if normalize: @@ -491,7 +504,9 @@ def area_weights(cube, normalize=False): if dim is not None: wshape.append(ll_weights.shape[idim]) ll_weights = ll_weights.reshape(wshape) - broad_weights = iris.util.broadcast_to_shape(ll_weights, cube.shape, broadcast_dims) + broad_weights = iris.util.broadcast_to_shape( + ll_weights, cube.shape, broadcast_dims, chunks=chunks + ) return broad_weights @@ -894,10 +909,12 @@ def _transform_xy(crs_from, x, y, crs_to): Parameters ---------- - crs_from, crs_to : :class:`cartopy.crs.Projection` + crs_from : :class:`cartopy.crs.Projection` The coordinate reference systems. x, y : array - point locations defined in 'crs_from'. + Point locations defined in 'crs_from'. + crs_to : :class:`cartopy.crs.Projection` + The coordinate reference systems. Returns ------- @@ -916,10 +933,13 @@ def _inter_crs_differentials(crs1, x, y, crs2): Parameters ---------- - crs1, crs2 : :class:`cartopy.crs.Projection` - The coordinate systems, "from" and "to". + crs1 : :class:`cartopy.crs.Projection` + The coordinate systems for "from". x, y : array Point locations defined in 'crs1'. + crs2 : :class:`cartopy.crs.Projection` + The coordinate systems for "to". + Returns ------- @@ -1047,7 +1067,7 @@ def _transform_distance_vectors_tolerance_mask(src_crs, x, y, tgt_crs, ds, dx2, tgt_crs : `cartopy.crs.Projection` The target coordinate reference systems. ds : `DistanceDifferential` - Distance differentials for src_crs and tgt_crs at specified locations + Distance differentials for src_crs and tgt_crs at specified locations. dx2, dy2 : `PartialDifferential` Partial differentials from src_crs to tgt_crs. @@ -1108,7 +1128,7 @@ def rotate_winds(u_cube, v_cube, target_cs): Returns ------- - (u', v') tuple of :class:`iris.cube.Cube` + tuple of :class:`iris.cube.Cube` A (u', v') tuple of :class:`iris.cube.Cube` instances that are the u and v components in the requested target coordinate system. The units are the same as the inputs. diff --git a/lib/iris/analysis/maths.py b/lib/iris/analysis/maths.py index caf4aea0a8..62adf7b638 100644 --- a/lib/iris/analysis/maths.py +++ b/lib/iris/analysis/maths.py @@ -222,7 +222,7 @@ def add(cube, other, dim=None, in_place=False): ---------- cube : iris.cube.Cube First operand to add. - other: iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array + other : iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array Second operand to add. dim : int, optional If `other` is a coord which does not exist on the cube, specify the @@ -274,7 +274,7 @@ def subtract(cube, other, dim=None, in_place=False): ---------- cube : iris.cube.Cube Cube from which to subtract. - other: iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array + other : iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array Object to subtract from the cube. dim : int, optional If `other` is a coord which does not exist on the cube, specify the @@ -323,22 +323,22 @@ def _add_subtract_common( Parameters ---------- operation_function : - function which does the operation (e.g. numpy.subtract) + Function which does the operation (e.g. numpy.subtract). operation_name : - The public name of the operation (e.g. 'divide') + The public name of the operation (e.g. 'divide'). cube : - The cube whose data is used as the first argument to `operation_function` + The cube whose data is used as the first argument to `operation_function`. other : The cube, coord, ndarray, dask array or number whose - data is used as the second argument + data is used as the second argument. new_dtype : The expected dtype of the output. Used in the case of scalar - masked arrays + masked arrays. dim : optional Dimension along which to apply `other` if it's a coordinate that is not - found in `cube` + found in `cube`. in_place : bool, default=False - Whether or not to apply the operation in place to `cube` and `cube.data` + Whether or not to apply the operation in place to `cube` and `cube.data`. """ _assert_is_cube(cube) @@ -381,7 +381,7 @@ def multiply(cube, other, dim=None, in_place=False): ---------- cube : iris.cube.Cube First operand to multiply. - other: iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array + other : iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array Second operand to multiply. dim : int, optional If `other` is a coord which does not exist on the cube, specify the @@ -466,7 +466,7 @@ def divide(cube, other, dim=None, in_place=False): ---------- cube : iris.cube.Cube Numerator. - other: iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array + other : iris.cube.Cube, iris.coords.Coord, number, numpy.ndarray or dask.array.Array Denominator. dim : int, optional If `other` is a coord which does not exist on the cube, specify the @@ -482,6 +482,7 @@ def divide(cube, other, dim=None, in_place=False): ----- This function maintains laziness when called; it does not realise data. See more at :doc:`/userguide/real_and_lazy_data`. + """ _assert_is_cube(cube) @@ -557,7 +558,7 @@ def exponentiate(cube, exponent, in_place=False): ) if cube.has_lazy_data(): - def power(data): + def power(data, out=None): return operator.pow(data, exponent) else: @@ -712,7 +713,7 @@ def apply_ufunc(ufunc, cube, other=None, new_unit=None, new_name=None, in_place= :func:`numpy.mod`. cube : An instance of :class:`iris.cube.Cube`. - other ::class:`iris.cube.Cube`, optional + other : :class:`iris.cube.Cube`, optional An instance of :class:`iris.cube.Cube` to be given as the second argument to :func:`numpy.ufunc`. new_unit : optional @@ -813,25 +814,25 @@ def _binary_op_common( Parameters ---------- operation_function : - Function which does the operation (e.g. numpy.divide) + Function which does the operation (e.g. numpy.divide). operation_name : - The public name of the operation (e.g. 'divide') + The public name of the operation (e.g. 'divide'). cube : - The cube whose data is used as the first argument to `operation_function` + The cube whose data is used as the first argument to `operation_function`. other : The cube, coord, ndarray, dask array or number whose data is used - as the second argument - new_dtype : - The expected dtype of the output. Used in the case of scalar masked arrays + as the second argument. new_unit : optional - Unit for the resulting quantity + Unit for the resulting quantity. + new_dtype : + The expected dtype of the output. Used in the case of scalar masked arrays. dim : optional Dimension along which to apply `other` if it's a coordinate that is - not found in `cube` + not found in `cube`. in_place : bool, default=False - whether or not to apply the operation in place to `cube` and `cube.data` + Whether or not to apply the operation in place to `cube` and `cube.data`. sanitise_metadata : bool, default=True - Whether or not to remove metadata using _sanitise_metadata function + Whether or not to remove metadata using _sanitise_metadata function. """ from iris.cube import Cube @@ -866,7 +867,7 @@ def _binary_op_common( if iris._lazy_data.is_lazy_data(other): rhs = other else: - rhs = np.asanyarray(other) + rhs = np.asanyarray(other, dtype=new_dtype) def unary_func(lhs): data = operation_function(lhs, rhs) @@ -1169,13 +1170,13 @@ def __call__( other : optional A cube, coord, ndarray, dask array or number whose data is used as the second argument to the data function. - new_name : optional - Name for the resulting Cube. - in_place : bool, default=False - Whether to create a new Cube, or alter the given "cube". dim : optional Dimension along which to apply `other` if it's a coordinate that is - not found in `cube` + not found in `cube`. + in_place : bool, default=False + Whether to create a new Cube, or alter the given "cube". + new_name : optional + Name for the resulting Cube. **kwargs_data_func : Keyword arguments that get passed on to the data_func. diff --git a/lib/iris/analysis/trajectory.py b/lib/iris/analysis/trajectory.py index 1dd19cd724..2111dd2504 100644 --- a/lib/iris/analysis/trajectory.py +++ b/lib/iris/analysis/trajectory.py @@ -490,7 +490,7 @@ def _cartesian_sample_points(sample_points, sample_point_coord_names): [coord][datum] list of sample_positions for each datum, formatted for fast use of :func:`_ll_to_cart()`. sample_point_coord_names : - [coord] list of n coord names + [coord] list of n coord names. Returns ------- @@ -544,7 +544,7 @@ def _nearest_neighbour_indices_ndcoords(cube, sample_points, cache=None): Because this function can be slow for multidimensional coordinates, a 'cache' dictionary can be provided by the calling code. - .. Note:: + .. note:: If the points are longitudes/latitudes, these are handled correctly as points on the sphere, but the values must be in 'degrees'. @@ -745,7 +745,7 @@ def __init__(self, src_cube, target_grid_cube): Notes ----- - .. Note:: + .. note:: For latitude-longitude coordinates, the nearest-neighbour distances are computed on the sphere, otherwise flat Euclidean distances are diff --git a/lib/iris/aux_factory.py b/lib/iris/aux_factory.py index d63ab157fa..41e1e9f573 100644 --- a/lib/iris/aux_factory.py +++ b/lib/iris/aux_factory.py @@ -11,6 +11,7 @@ import dask.array as da import numpy as np +from iris._lazy_data import concatenate from iris.common import CFVariableMixin, CoordMetadata, metadata_manager_factory import iris.coords from iris.warnings import IrisIgnoringBoundsWarning @@ -57,7 +58,7 @@ def coord_system(self, value): @property def climatological(self): - """Always returns False, as a factory itself can never have points/bounds. + """Return False, as a factory itself can never have points/bounds. Always returns False, as a factory itself can never have points/bounds and therefore can never be climatological by definition. @@ -1076,7 +1077,7 @@ def _derive(self, sigma, eta, depth, depth_c, zlev, nsigma, coord_dims_func): result_rest_levs = zlev[z_slices_rest] * ones_full_result[z_slices_rest] # Combine nsigma and 'rest' levels for the final result. - result = da.concatenate([result_nsigma_levs, result_rest_levs], axis=z_dim) + result = concatenate([result_nsigma_levs, result_rest_levs], axis=z_dim) return result def make_coord(self, coord_dims_func): @@ -1787,9 +1788,9 @@ def _check_dependencies(s, c, eta, depth, depth_c): @property def dependencies(self): - """Returns a dicti mapping from constructor arg names to coordinates. + """Return a dicti mapping from constructor arg names to coordinates. - Returns a dictionary mapping from constructor argument names to + Return a dictionary mapping from constructor argument names to the corresponding coordinates. """ diff --git a/lib/iris/common/_split_attribute_dicts.py b/lib/iris/common/_split_attribute_dicts.py index 17b3014fb1..3e9c74cea9 100644 --- a/lib/iris/common/_split_attribute_dicts.py +++ b/lib/iris/common/_split_attribute_dicts.py @@ -15,6 +15,7 @@ So, we simply treat "global" and "local" attributes of the same name as entirely independent. Which happily is also the easiest to code, and to explain. """ + from collections.abc import Mapping, Sequence from functools import wraps diff --git a/lib/iris/common/metadata.py b/lib/iris/common/metadata.py index 403436496f..bfbc75507e 100644 --- a/lib/iris/common/metadata.py +++ b/lib/iris/common/metadata.py @@ -4,6 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """Provides the infrastructure to support the common metadata API.""" +from __future__ import annotations from abc import ABCMeta from collections import namedtuple @@ -11,11 +12,15 @@ from copy import deepcopy from functools import lru_cache, wraps import re +from typing import TYPE_CHECKING, Any +import cf_units import numpy as np import numpy.ma as ma from xxhash import xxh64_hexdigest +if TYPE_CHECKING: + from iris.coords import CellMethod from ..config import get_logger from ._split_attribute_dicts import adjust_for_split_attribute_dictionaries from .lenient import _LENIENT @@ -29,6 +34,8 @@ "CoordMetadata", "CubeMetadata", "DimCoordMetadata", + "MeshCoordMetadata", + "MeshMetadata", "SERVICES", "SERVICES_COMBINE", "SERVICES_DIFFERENCE", @@ -142,7 +149,7 @@ class BaseMetadata(metaclass=_NamedTupleMeta): DEFAULT_NAME = "unknown" # the fall-back name for metadata identity - _members = ( + _members: str | Iterable[str] = ( "standard_name", "long_name", "var_name", @@ -152,6 +159,12 @@ class BaseMetadata(metaclass=_NamedTupleMeta): __slots__ = () + standard_name: str | None + long_name: str | None + var_name: str | None + units: cf_units.Unit + attributes: Any + @lenient_service def __eq__(self, other): """Determine whether the associated metadata members are equivalent. @@ -682,7 +695,7 @@ def from_metadata(cls, other): result = cls(**kwargs) return result - def name(self, default=None, token=False): + def name(self, default: str | None = None, token: bool = False) -> str: """Return a string name representing the identity of the metadata. First it tries standard name, then it tries the long name, then @@ -691,10 +704,10 @@ def name(self, default=None, token=False): Parameters ---------- - default : optional + default : The fall-back string representing the default name. Defaults to the string 'unknown'. - token : bool, default=False + token : If True, ensures that the name returned satisfies the criteria for the characters required by a valid NetCDF name. If it is not possible to return a valid name, then a ValueError exception is @@ -734,7 +747,7 @@ def token(cls, name): Parameters ---------- name : str - The string name to verify + The string name to verify. Returns ------- @@ -871,7 +884,7 @@ def equal(self, other, lenient=None): class CoordMetadata(BaseMetadata): """Metadata container for a :class:`~iris.coords.Coord`.""" - _members = ("coord_system", "climatological") + _members: str | Iterable[str] = ("coord_system", "climatological") __slots__ = () @@ -1038,6 +1051,8 @@ class CubeMetadata(BaseMetadata): _members = "cell_methods" + cell_methods: tuple[CellMethod, ...] + __slots__ = () @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) @@ -1335,6 +1350,357 @@ def equal(self, other, lenient=None): return super().equal(other, lenient=lenient) +class ConnectivityMetadata(BaseMetadata): + """Metadata container for a :class:`~iris.mesh.Connectivity`.""" + + # The "location_axis" member is stateful only, and does not participate in + # lenient/strict equivalence. + _members = ("cf_role", "start_index", "location_axis") + + __slots__ = () + + @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) + @lenient_service + def __eq__(self, other): + return super().__eq__(other) + + def _combine_lenient(self, other): + """Perform lenient combination of metadata members for connectivities. + + Parameters + ---------- + other : ConnectivityMetadata + The other connectivity metadata participating in the lenient + combination. + + Returns + ------- + A list of combined metadata member values. + + """ + + # Perform "strict" combination for "cf_role", "start_index", "location_axis". + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return left if left == right else None + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in ConnectivityMetadata._members] + # Perform lenient combination of the other parent members. + result = super()._combine_lenient(other) + result.extend(values) + + return result + + def _compare_lenient(self, other): + """Perform lenient equality of metadata members for connectivities. + + Parameters + ---------- + other : ConnectivityMetadata + The other connectivity metadata participating in the lenient + comparison. + + Returns + ------- + bool + + """ + # Perform "strict" comparison for "cf_role", "start_index". + # The "location_axis" member is not part of lenient equivalence. + members = filter( + lambda member: member != "location_axis", + ConnectivityMetadata._members, + ) + result = all( + [getattr(self, field) == getattr(other, field) for field in members] + ) + if result: + # Perform lenient comparison of the other parent members. + result = super()._compare_lenient(other) + + return result + + def _difference_lenient(self, other): + """Perform lenient difference of metadata members for connectivities. + + Parameters + ---------- + other : ConnectivityMetadata + The other connectivity metadata participating in the lenient + difference. + + Returns + ------- + A list of difference metadata member values. + + """ + + # Perform "strict" difference for "cf_role", "start_index", "location_axis". + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return None if left == right else (left, right) + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in ConnectivityMetadata._members] + # Perform lenient difference of the other parent members. + result = super()._difference_lenient(other) + result.extend(values) + + return result + + @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) + @lenient_service + def combine(self, other, lenient=None): + return super().combine(other, lenient=lenient) + + @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) + @lenient_service + def difference(self, other, lenient=None): + return super().difference(other, lenient=lenient) + + @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) + @lenient_service + def equal(self, other, lenient=None): + return super().equal(other, lenient=lenient) + + +class MeshMetadata(BaseMetadata): + """Metadata container for a :class:`~iris.mesh.MeshXY`.""" + + # The node_dimension", "edge_dimension" and "face_dimension" members are + # stateful only; they not participate in lenient/strict equivalence. + _members = ( + "topology_dimension", + "node_dimension", + "edge_dimension", + "face_dimension", + ) + + __slots__ = () + + @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) + @lenient_service + def __eq__(self, other): + return super().__eq__(other) + + def _combine_lenient(self, other): + """Perform lenient combination of metadata members for meshes. + + Parameters + ---------- + other : MeshMetadata + The other mesh metadata participating in the lenient + combination. + + Returns + ------- + A list of combined metadata member values. + + """ + + # Perform "strict" combination for "topology_dimension", + # "node_dimension", "edge_dimension" and "face_dimension". + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return left if left == right else None + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in MeshMetadata._members] + # Perform lenient combination of the other parent members. + result = super()._combine_lenient(other) + result.extend(values) + + return result + + def _compare_lenient(self, other): + """Perform lenient equality of metadata members for meshes. + + Parameters + ---------- + other : MeshMetadata + The other mesh metadata participating in the lenient + comparison. + + Returns + ------- + bool + + """ + # Perform "strict" comparison for "topology_dimension". + # "node_dimension", "edge_dimension" and "face_dimension" are not part + # of lenient equivalence at all. + result = self.topology_dimension == other.topology_dimension + if result: + # Perform lenient comparison of the other parent members. + result = super()._compare_lenient(other) + + return result + + def _difference_lenient(self, other): + """Perform lenient difference of metadata members for meshes. + + Parameters + ---------- + other : MeshMetadata + The other mesh metadata participating in the lenient + difference. + + Returns + ------- + A list of difference metadata member values. + + """ + + # Perform "strict" difference for "topology_dimension", + # "node_dimension", "edge_dimension" and "face_dimension". + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return None if left == right else (left, right) + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in MeshMetadata._members] + # Perform lenient difference of the other parent members. + result = super()._difference_lenient(other) + result.extend(values) + + return result + + @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) + @lenient_service + def combine(self, other, lenient=None): + return super().combine(other, lenient=lenient) + + @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) + @lenient_service + def difference(self, other, lenient=None): + return super().difference(other, lenient=lenient) + + @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) + @lenient_service + def equal(self, other, lenient=None): + return super().equal(other, lenient=lenient) + + +class MeshCoordMetadata(BaseMetadata): + """Metadata container for a :class:`~iris.coords.MeshCoord`.""" + + _members = ("location", "axis") + # NOTE: in future, we may add 'mesh' as part of this metadata, + # as the MeshXY seems part of the 'identity' of a MeshCoord. + # For now we omit it, particularly as we don't yet implement MeshXY.__eq__. + # + # Thus, for now, the MeshCoord class will need to handle 'mesh' explicitly + # in identity / comparison, but in future that may be simplified. + + __slots__ = () + + @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) + @lenient_service + def __eq__(self, other): + return super().__eq__(other) + + def _combine_lenient(self, other): + """Perform lenient combination of metadata members for MeshCoord. + + Parameters + ---------- + other : MeshCoordMetadata + The other metadata participating in the lenient combination. + + Returns + ------- + A list of combined metadata member values. + + """ + + # It is actually "strict" : return None except where members are equal. + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return left if left == right else None + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in self._members] + # Perform lenient combination of the other parent members. + result = super()._combine_lenient(other) + result.extend(values) + + return result + + def _compare_lenient(self, other): + """Perform lenient equality of metadata members for MeshCoord. + + Parameters + ---------- + other : MeshCoordMetadata + The other metadata participating in the lenient comparison. + + Returns + ------- + bool + + """ + # Perform "strict" comparison for the MeshCoord specific members + # 'location', 'axis' : for equality, they must all match. + result = all( + [getattr(self, field) == getattr(other, field) for field in self._members] + ) + if result: + # Perform lenient comparison of the other parent members. + result = super()._compare_lenient(other) + + return result + + def _difference_lenient(self, other): + """Perform lenient difference of metadata members for MeshCoord. + + Parameters + ---------- + other : MeshCoordMetadata + The other MeshCoord metadata participating in the lenient + difference. + + Returns + ------- + A list of different metadata member values. + + """ + + # Perform "strict" difference for location / axis. + def func(field): + left = getattr(self, field) + right = getattr(other, field) + return None if left == right else (left, right) + + # Note that, we use "_members" not "_fields". + values = [func(field) for field in self._members] + # Perform lenient difference of the other parent members. + result = super()._difference_lenient(other) + result.extend(values) + + return result + + @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) + @lenient_service + def combine(self, other, lenient=None): + return super().combine(other, lenient=lenient) + + @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) + @lenient_service + def difference(self, other, lenient=None): + return super().difference(other, lenient=lenient) + + @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) + @lenient_service + def equal(self, other, lenient=None): + return super().equal(other, lenient=lenient) + + def metadata_filter( instances, item=None, @@ -1602,45 +1968,54 @@ def metadata_manager_factory(cls, **kwargs): #: Convenience collection of lenient metadata combine services. -# TODO: change lists back to tuples once CellMeasureMetadata is re-integrated -# here (currently in experimental.ugrid). -SERVICES_COMBINE = [ +SERVICES_COMBINE = ( AncillaryVariableMetadata.combine, BaseMetadata.combine, CellMeasureMetadata.combine, + ConnectivityMetadata.combine, CoordMetadata.combine, CubeMetadata.combine, DimCoordMetadata.combine, -] + MeshCoordMetadata.combine, + MeshMetadata.combine, +) #: Convenience collection of lenient metadata difference services. -SERVICES_DIFFERENCE = [ +SERVICES_DIFFERENCE = ( AncillaryVariableMetadata.difference, BaseMetadata.difference, CellMeasureMetadata.difference, + ConnectivityMetadata.difference, CoordMetadata.difference, CubeMetadata.difference, DimCoordMetadata.difference, -] + MeshCoordMetadata.difference, + MeshMetadata.difference, +) #: Convenience collection of lenient metadata equality services. -SERVICES_EQUAL = [ +SERVICES_EQUAL = ( AncillaryVariableMetadata.__eq__, AncillaryVariableMetadata.equal, BaseMetadata.__eq__, BaseMetadata.equal, CellMeasureMetadata.__eq__, CellMeasureMetadata.equal, + ConnectivityMetadata.__eq__, + ConnectivityMetadata.equal, CoordMetadata.__eq__, CoordMetadata.equal, CubeMetadata.__eq__, CubeMetadata.equal, DimCoordMetadata.__eq__, DimCoordMetadata.equal, -] - + MeshCoordMetadata.__eq__, + MeshCoordMetadata.equal, + MeshMetadata.__eq__, + MeshMetadata.equal, +) #: Convenience collection of lenient metadata services. SERVICES = SERVICES_COMBINE + SERVICES_DIFFERENCE + SERVICES_EQUAL diff --git a/lib/iris/common/mixin.py b/lib/iris/common/mixin.py index 2d9605de83..87d58944c7 100644 --- a/lib/iris/common/mixin.py +++ b/lib/iris/common/mixin.py @@ -4,10 +4,14 @@ # See LICENSE in the root of the repository for full licensing details. """Provides common metadata mixin behaviour.""" +from __future__ import annotations + from collections.abc import Mapping from functools import wraps +from typing import Any import cf_units +import numpy as np import iris.std_names @@ -101,11 +105,9 @@ def __eq__(self, other): match = set(self.keys()) == set(other.keys()) if match: for key, value in self.items(): - match = value == other[key] - try: - match = bool(match) - except ValueError: - match = match.all() + match = np.array_equal( + np.array(value, ndmin=1), np.array(other[key], ndmin=1) + ) if not match: break return match @@ -138,11 +140,17 @@ def update(self, other, **kwargs): class CFVariableMixin: + _metadata_manager: Any + @wraps(BaseMetadata.name) - def name(self, default=None, token=None): + def name( + self, + default: str | None = None, + token: bool | None = None, + ) -> str: return self._metadata_manager.name(default=default, token=token) - def rename(self, name): + def rename(self, name: str | None) -> None: """Change the human-readable name. If 'name' is a valid standard name it will assign it to @@ -161,30 +169,30 @@ def rename(self, name): self.var_name = None @property - def standard_name(self): + def standard_name(self) -> str | None: """The CF Metadata standard name for the object.""" return self._metadata_manager.standard_name @standard_name.setter - def standard_name(self, name): + def standard_name(self, name: str | None) -> None: self._metadata_manager.standard_name = _get_valid_standard_name(name) @property - def long_name(self): + def long_name(self) -> str | None: """The CF Metadata long name for the object.""" return self._metadata_manager.long_name @long_name.setter - def long_name(self, name): + def long_name(self, name: str | None) -> None: self._metadata_manager.long_name = name @property - def var_name(self): + def var_name(self) -> str | None: """The NetCDF variable name for the object.""" return self._metadata_manager.var_name @var_name.setter - def var_name(self, name): + def var_name(self, name: str | None) -> None: if name is not None: result = self._metadata_manager.token(name) if result is None or not name: @@ -193,20 +201,20 @@ def var_name(self, name): self._metadata_manager.var_name = name @property - def units(self): + def units(self) -> cf_units.Unit: """The S.I. unit of the object.""" return self._metadata_manager.units @units.setter - def units(self, unit): + def units(self, unit: cf_units.Unit | str | None) -> None: self._metadata_manager.units = cf_units.as_unit(unit) @property - def attributes(self): + def attributes(self) -> LimitedAttributeDict: return self._metadata_manager.attributes @attributes.setter - def attributes(self, attributes): + def attributes(self, attributes: Mapping) -> None: self._metadata_manager.attributes = LimitedAttributeDict(attributes or {}) @property diff --git a/lib/iris/common/resolve.py b/lib/iris/common/resolve.py index 5a96b52a02..c4bc18309b 100644 --- a/lib/iris/common/resolve.py +++ b/lib/iris/common/resolve.py @@ -31,7 +31,7 @@ _AuxCoverage = namedtuple( - "AuxCoverage", + "_AuxCoverage", [ "cube", "common_items_aux", @@ -45,18 +45,18 @@ ) _CategoryItems = namedtuple( - "CategoryItems", + "_CategoryItems", ["items_dim", "items_aux", "items_scalar"], ) _DimCoverage = namedtuple( - "DimCoverage", + "_DimCoverage", ["cube", "metadata", "coords", "dims_common", "dims_local", "dims_free"], ) -_Item = namedtuple("Item", ["metadata", "coord", "dims"]) +_Item = namedtuple("_Item", ["metadata", "coord", "dims"]) -_PreparedFactory = namedtuple("PreparedFactory", ["container", "dependencies"]) +_PreparedFactory = namedtuple("_PreparedFactory", ["container", "dependencies"]) @dataclass @@ -71,7 +71,7 @@ class _PreparedItem: axis: Any = None def create_coord(self, metadata): - from iris.experimental.ugrid.mesh import MeshCoord + from iris.mesh import MeshCoord if issubclass(self.container, MeshCoord): # Make a MeshCoord, for which we have mesh/location/axis. @@ -95,7 +95,7 @@ def create_coord(self, metadata): return result -_PreparedMetadata = namedtuple("PreparedMetadata", ["combined", "src", "tgt"]) +_PreparedMetadata = namedtuple("_PreparedMetadata", ["combined", "src", "tgt"]) class Resolve: @@ -741,7 +741,7 @@ def _create_prepared_item( if container is None: container = type(coord) - from iris.experimental.ugrid.mesh import MeshCoord + from iris.mesh import MeshCoord if issubclass(container, MeshCoord): # Build a prepared-item to make a MeshCoord. @@ -1639,7 +1639,7 @@ def _get_prepared_item( Boolean stating whether the ``metadata`` is from the ``src`` (``True``) or ``tgt`` :class:`~iris.cube.Cube`. Defaults to ``True``. - from_local: bool, default=False + from_local : bool, default=False Boolean controlling whether the ``metadata`` is used to search the ``category_local`` (``True``) or the :attr:`~iris.common.resolve.Resolve.prepared_category`. Defaults to ``False``. @@ -2358,16 +2358,16 @@ def cube(self, data, in_place=False): >>> resolver.map_rhs_to_lhs True >>> cube1.data.sum() - 124652160.0 + np.float32(124652160.0) >>> zeros.shape (240, 37, 49) >>> zeros.sum() - 0.0 + np.float32(0.0) >>> result = resolver.cube(zeros, in_place=True) >>> result is cube1 True >>> cube1.data.sum() - 0.0 + np.float32(0.0) """ from iris.cube import Cube diff --git a/lib/iris/coord_categorisation.py b/lib/iris/coord_categorisation.py index f4c3aa6cb4..12ad93a9c3 100644 --- a/lib/iris/coord_categorisation.py +++ b/lib/iris/coord_categorisation.py @@ -17,13 +17,23 @@ import calendar import collections +import inspect +from typing import Callable +import cftime import numpy as np import iris.coords +import iris.cube -def add_categorised_coord(cube, name, from_coord, category_function, units="1"): +def add_categorised_coord( + cube: iris.cube.Cube, + name: str, + from_coord: iris.coords.DimCoord | iris.coords.AuxCoord | str, + category_function: Callable, + units: str = "1", +) -> None: """Add a new coordinate to a cube, by categorising an existing one. Make a new :class:`iris.coords.AuxCoord` from mapped values, and add @@ -31,31 +41,39 @@ def add_categorised_coord(cube, name, from_coord, category_function, units="1"): Parameters ---------- - cube : :class:`iris.cube.Cube` - The cube containing 'from_coord'. The new coord will be added into it. - name : str - name of the created coordinate - from_coord : :class:`iris.coords.Coord` or str - coordinate in 'cube', or the name of one - category_function : callable - function(coordinate, value), returning a category value for a - coordinate point-value - units : str, default="1" - units of the category value, typically 'no_unit' or '1'. + cube : + The cube containing 'from_coord'. The new coord will be added into it. + name : + Name of the created coordinate. + from_coord : + Coordinate in 'cube', or the name of one. + category_function : + Function(coordinate, value), returning a category value for a coordinate + point-value. If ``value`` has a type hint :obj:`cftime.datetime`, the + coordinate points are translated to :obj:`cftime.datetime` s before + calling ``category_function``. + units : + Units of the category value, typically 'no_unit' or '1'. """ # Interpret coord, if given as a name - if isinstance(from_coord, str): - from_coord = cube.coord(from_coord) + coord = cube.coord(from_coord) if isinstance(from_coord, str) else from_coord if len(cube.coords(name)) > 0: msg = 'A coordinate "%s" already exists in the cube.' % name raise ValueError(msg) + # Translate the coordinate points to cftime datetimes if requested. + value_param = list(inspect.signature(category_function).parameters.values())[1] + if issubclass(value_param.annotation, cftime.datetime): + points = coord.units.num2date(coord.points, only_use_cftime_datetimes=True) + else: + points = coord.points + # Construct new coordinate by mapping values, using numpy.vectorize to # support multi-dimensional coords. # Test whether the result contains strings. If it does we must manually # force the dtype because of a numpy bug (see numpy #3270 on GitHub). - result = category_function(from_coord, from_coord.points.ravel()[0]) + result = category_function(coord, points.ravel()[0]) if isinstance(result, str): str_vectorised_fn = np.vectorize(category_function, otypes=[object]) @@ -66,14 +84,14 @@ def vectorised_fn(*args): else: vectorised_fn = np.vectorize(category_function) new_coord = iris.coords.AuxCoord( - vectorised_fn(from_coord, from_coord.points), + vectorised_fn(coord, points), units=units, - attributes=from_coord.attributes.copy(), + attributes=coord.attributes.copy(), ) new_coord.rename(name) # Add into the cube - cube.add_aux_coord(new_coord, cube.coord_dims(from_coord)) + cube.add_aux_coord(new_coord, cube.coord_dims(coord)) # ====================================== @@ -83,78 +101,62 @@ def vectorised_fn(*args): # coordinates only # - -# Private "helper" function -def _pt_date(coord, time): - """Return the datetime of a time-coordinate point. - - Parameters - ---------- - coord : Coord - coordinate (must be Time-type) - time : float - value of a coordinate point - - Returns - ------- - cftime.datetime - - """ - # NOTE: All of the currently defined categorisation functions are - # calendar operations on Time coordinates. - return coord.units.num2date(time, only_use_cftime_datetimes=True) - - # -------------------------------------------- # Time categorisations : calendar date components def add_year(cube, coord, name="year"): """Add a categorical calendar-year coordinate.""" - add_categorised_coord(cube, name, coord, lambda coord, x: _pt_date(coord, x).year) + + def get_year(_, value: cftime.datetime) -> int: + return value.year + + add_categorised_coord(cube, name, coord, get_year) def add_month_number(cube, coord, name="month_number"): """Add a categorical month coordinate, values 1..12.""" - add_categorised_coord(cube, name, coord, lambda coord, x: _pt_date(coord, x).month) + + def get_month_number(_, value: cftime.datetime) -> int: + return value.month + + add_categorised_coord(cube, name, coord, get_month_number) def add_month_fullname(cube, coord, name="month_fullname"): """Add a categorical month coordinate, values 'January'..'December'.""" - add_categorised_coord( - cube, - name, - coord, - lambda coord, x: calendar.month_name[_pt_date(coord, x).month], - units="no_unit", - ) + + def get_month_fullname(_, value: cftime.datetime) -> str: + return calendar.month_name[value.month] + + add_categorised_coord(cube, name, coord, get_month_fullname, units="no_unit") def add_month(cube, coord, name="month"): """Add a categorical month coordinate, values 'Jan'..'Dec'.""" - add_categorised_coord( - cube, - name, - coord, - lambda coord, x: calendar.month_abbr[_pt_date(coord, x).month], - units="no_unit", - ) + + def get_month_abbr(_, value: cftime.datetime) -> str: + return calendar.month_abbr[value.month] + + add_categorised_coord(cube, name, coord, get_month_abbr, units="no_unit") def add_day_of_month(cube, coord, name="day_of_month"): """Add a categorical day-of-month coordinate, values 1..31.""" - add_categorised_coord(cube, name, coord, lambda coord, x: _pt_date(coord, x).day) + + def get_day_of_month(_, value: cftime.datetime) -> int: + return value.day + + add_categorised_coord(cube, name, coord, get_day_of_month) def add_day_of_year(cube, coord, name="day_of_year"): """Add a categorical day-of-year coordinate, values 1..365 (1..366 in leap years).""" - # Note: cftime.datetime objects return a normal tuple from timetuple(), - # unlike datetime.datetime objects that return a namedtuple. - # Index the time tuple (element 7 is day of year) instead of using named - # element tm_yday. - add_categorised_coord( - cube, name, coord, lambda coord, x: _pt_date(coord, x).timetuple()[7] - ) + + def get_day_of_year(_, value: cftime.datetime) -> int: + return value.timetuple().tm_yday + + add_categorised_coord(cube, name, coord, get_day_of_year) # -------------------------------------------- @@ -163,31 +165,29 @@ def add_day_of_year(cube, coord, name="day_of_year"): def add_weekday_number(cube, coord, name="weekday_number"): """Add a categorical weekday coordinate, values 0..6 [0=Monday].""" - add_categorised_coord( - cube, name, coord, lambda coord, x: _pt_date(coord, x).dayofwk - ) + + def get_weekday_number(_, value: cftime.datetime) -> int: + return value.dayofwk + + add_categorised_coord(cube, name, coord, get_weekday_number) def add_weekday_fullname(cube, coord, name="weekday_fullname"): """Add a categorical weekday coordinate, values 'Monday'..'Sunday'.""" - add_categorised_coord( - cube, - name, - coord, - lambda coord, x: calendar.day_name[_pt_date(coord, x).dayofwk], - units="no_unit", - ) + + def get_weekday_fullname(_, value: cftime.datetime) -> str: + return calendar.day_name[value.dayofwk] + + add_categorised_coord(cube, name, coord, get_weekday_fullname, units="no_unit") def add_weekday(cube, coord, name="weekday"): """Add a categorical weekday coordinate, values 'Mon'..'Sun'.""" - add_categorised_coord( - cube, - name, - coord, - lambda coord, x: calendar.day_abbr[_pt_date(coord, x).dayofwk], - units="no_unit", - ) + + def get_weekday(_, value: cftime.datetime) -> str: + return calendar.day_abbr[value.dayofwk] + + add_categorised_coord(cube, name, coord, get_weekday, units="no_unit") # -------------------------------------------- @@ -196,7 +196,11 @@ def add_weekday(cube, coord, name="weekday"): def add_hour(cube, coord, name="hour"): """Add a categorical hour coordinate, values 0..23.""" - add_categorised_coord(cube, name, coord, lambda coord, x: _pt_date(coord, x).hour) + + def get_hour(_, value: cftime.datetime) -> int: + return value.hour + + add_categorised_coord(cube, name, coord, get_hour) # ---------------------------------------------- @@ -318,9 +322,8 @@ def add_season(cube, coord, name="season", seasons=("djf", "mam", "jja", "son")) month_season_numbers = _month_season_numbers(seasons) # Define a categorisation function. - def _season(coord, value): - dt = _pt_date(coord, value) - return seasons[month_season_numbers[dt.month]] + def _season(_, value: cftime.datetime) -> str: + return seasons[month_season_numbers[value.month]] # Apply the categorisation. add_categorised_coord(cube, name, coord, _season, units="no_unit") @@ -356,9 +359,8 @@ def add_season_number( month_season_numbers = _month_season_numbers(seasons) # Define a categorisation function. - def _season_number(coord, value): - dt = _pt_date(coord, value) - return month_season_numbers[dt.month] + def _season_number(_, value: cftime.datetime) -> int: + return month_season_numbers[value.month] # Apply the categorisation. add_categorised_coord(cube, name, coord, _season_number) @@ -385,7 +387,7 @@ def add_season_year( List of seasons defined by month abbreviations. Each month must appear once and only once. Defaults to standard meteorological seasons (``djf``, ``mam``, ``jja``, ``son``). - use_year_at_season_start: bool, default=False + use_year_at_season_start : bool, default=False Seasons spanning the year boundary (e.g. Winter ``djf``) will belong fully to the following year by default (e.g. the year of Jan and Feb). Set to ``True`` for spanning seasons to belong to the preceding @@ -400,10 +402,9 @@ def add_season_year( ) # Define a categorisation function. - def _season_year(coord, value): - dt = _pt_date(coord, value) - year = dt.year - year += month_year_adjusts[dt.month] + def _season_year(_, value: cftime.datetime) -> int: + year = value.year + year += month_year_adjusts[value.month] return year # Apply the categorisation. @@ -431,10 +432,7 @@ def add_season_membership(cube, coord, season, name="season_membership"): """ months = _months_in_season(season) - def _season_membership(coord, value): - dt = _pt_date(coord, value) - if dt.month in months: - return True - return False + def _season_membership(_, value: cftime.datetime) -> bool: + return value.month in months add_categorised_coord(cube, name, coord, _season_membership) diff --git a/lib/iris/coord_systems.py b/lib/iris/coord_systems.py index 35eea98764..4da46ae249 100644 --- a/lib/iris/coord_systems.py +++ b/lib/iris/coord_systems.py @@ -7,6 +7,7 @@ from abc import ABCMeta, abstractmethod from functools import cached_property import re +from typing import ClassVar import warnings import cartopy.crs as ccrs @@ -48,7 +49,7 @@ def _float_or_None(arg): class CoordSystem(metaclass=ABCMeta): """Abstract base class for coordinate systems.""" - grid_mapping_name = None + grid_mapping_name: ClassVar[str | None] = None def __eq__(self, other): """Override equality. @@ -161,9 +162,9 @@ def __init__( Axes of ellipsoid, in metres. At least one must be given (see note below). inverse_flattening : optional - Can be omitted if both axes given (see note below). Default 0.0 + Can be omitted if both axes given (see note below). Default 0.0. longitude_of_prime_meridian : optional - Specifies the prime meridian on the ellipsoid, in degrees. Default 0.0 + Specifies the prime meridian on the ellipsoid, in degrees. Default 0.0. Notes ----- @@ -357,14 +358,16 @@ def _crs(self): This property is created when required and then cached for speed. That cached value is cleared when an assignment is made to a property of the class that invalidates the cache. + """ return ccrs.Geodetic(self._globe) def _wipe_cached_properties(self): - """Wipes the cached properties on the object. + """Wipe the cached properties on the object. - Wipes the cached properties on the object as part of any update to a + Wipe the cached properties on the object as part of any update to a value that invalidates the cache. + """ try: delattr(self, "_crs") @@ -990,10 +993,10 @@ def __init__( Y offset from planar origin in metres. true_scale_lat : float, optional Latitude of true scale. - scale_factor_at_projection_origin : float, optional - Scale factor at the origin of the projection ellipsoid : :class:`GeogCS`, optional If given, defines the ellipsoid. + scale_factor_at_projection_origin : float, optional + Scale factor at the origin of the projection. Notes ----- @@ -1098,7 +1101,7 @@ def __init__( true_scale_lat : float, optional Latitude of true scale. scale_factor_at_projection_origin : float, optional - Scale factor at the origin of the projection + Scale factor at the origin of the projection. ellipsoid : :class:`GeogCS`, optional If given, defines the ellipsoid. @@ -1502,7 +1505,8 @@ class ObliqueMercator(CoordSystem): See Also -------- - :class:`RotatedMercator` + RotatedMercator : + :class:`ObliqueMercator` with ``azimuth_of_central_line=90``. """ @@ -1527,15 +1531,15 @@ def __init__( the centre line. latitude_of_projection_origin : float The true longitude of the central meridian in degrees. - longitude_of_projection_origin: float + longitude_of_projection_origin : float The true latitude of the planar origin in degrees. - false_easting: float, optional + false_easting : float, optional X offset from the planar origin in metres. Defaults to 0.0. - false_northing: float, optional + false_northing : float, optional Y offset from the planar origin in metres. Defaults to 0.0. - scale_factor_at_projection_origin: float, optional + scale_factor_at_projection_origin : float, optional Scale factor at the central meridian. Defaults to 1.0 . ellipsoid : :class:`GeogCS`, optional @@ -1615,6 +1619,8 @@ class RotatedMercator(ObliqueMercator): The Rotated Mercator projection is an Oblique Mercator projection with azimuth = +90. + Notes + ----- .. deprecated:: 3.8.0 This coordinate system was introduced as already scheduled for removal in a future release, since CF version 1.11 onwards now requires use of @@ -1639,18 +1645,18 @@ def __init__( ---------- latitude_of_projection_origin : float The true longitude of the central meridian in degrees. - longitude_of_projection_origin: float + longitude_of_projection_origin : float The true latitude of the planar origin in degrees. - false_easting: float, optional + false_easting : float, optional X offset from the planar origin in metres. Defaults to 0.0. - false_northing: float, optional + false_northing : float, optional Y offset from the planar origin in metres. Defaults to 0.0. - scale_factor_at_projection_origin: float, optional + scale_factor_at_projection_origin : float, optional Scale factor at the central meridian. Defaults to 1.0 . - ellipsoid: :class:`GeogCS`, optional + ellipsoid : :class:`GeogCS`, optional If given, defines the ellipsoid. """ diff --git a/lib/iris/coords.py b/lib/iris/coords.py index d9de063ea3..06a271cbba 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -289,7 +289,7 @@ def summary( Returns ------- - result : str + str Output text, with embedded newlines when :attr:`shorten`\ =False. Notes @@ -804,6 +804,9 @@ def xml_element(self, doc): :class:`_DimensionalMetadata`. """ + # deferred import to avoid possible circularity + from iris.mesh import Connectivity + # Create the XML element as the camelCaseEquivalent of the # class name. element_name = type(self).__name__ @@ -843,9 +846,7 @@ def xml_element(self, doc): # otherwise. if isinstance(self, Coord): values_term = "points" - # TODO: replace with isinstance(self, Connectivity) once Connectivity - # is re-integrated here (currently in experimental.ugrid). - elif hasattr(self, "indices"): + elif isinstance(self, Connectivity): values_term = "indices" else: values_term = "data" @@ -1168,12 +1169,12 @@ def _get_2d_coord_bound_grid(bounds): Parameters ---------- bounds : array - Coordinate bounds array of shape (Y, X, 4) + Coordinate bounds array of shape (Y, X, 4). Returns ------- array - Grid of shape (Y+1, X+1) + Grid of shape (Y+1, X+1). """ # Check bds has the shape (ny, nx, 4) @@ -1952,7 +1953,7 @@ def is_contiguous(self, rtol=1e-05, atol=1e-08): contiguous = False return contiguous - def contiguous_bounds(self): + def contiguous_bounds(self): # numpydoc ignore=SS05 """Contiguous bounds of 1D coordinate. Return the N+1 bound values for a contiguous bounded 1D coordinate @@ -2114,22 +2115,39 @@ def collapsed(self, dims_to_collapse=None): if np.issubdtype(self.dtype, np.str_): # Collapse the coordinate by serializing the points and # bounds as strings. - def serialize(x): - return "|".join([str(i) for i in x.flatten()]) + def serialize(x, axis): + if axis is None: + return "|".join(str(i) for i in x.flatten()) + + # np.apply_along_axis combined with str.join will truncate strings in + # some cases (https://github.com/numpy/numpy/issues/8352), so we need to + # loop through the array directly. First move (possibly multiple) axis + # of interest to trailing dim(s), then make a 2D array we can loop + # through. + work_array = np.moveaxis(x, axis, range(-len(axis), 0)) + out_shape = work_array.shape[: -len(axis)] + work_array = work_array.reshape(np.prod(out_shape, dtype=int), -1) + + joined = [] + for arr_slice in work_array: + joined.append(serialize(arr_slice, None)) + + return np.array(joined).reshape(out_shape) bounds = None if self.has_bounds(): - shape = self._bounds_dm.shape[1:] - bounds = [] - for index in np.ndindex(shape): - index_slice = (slice(None),) + tuple(index) - bounds.append(serialize(self.bounds[index_slice])) - dtype = np.dtype("U{}".format(max(map(len, bounds)))) - bounds = np.array(bounds, dtype=dtype).reshape((1,) + shape) - points = serialize(self.points) - dtype = np.dtype("U{}".format(len(points))) + # Express dims_to_collapse as non-negative integers. + if dims_to_collapse is None: + dims_to_collapse = range(self.ndim) + else: + dims_to_collapse = tuple( + dim % self.ndim for dim in dims_to_collapse + ) + bounds = serialize(self.bounds, dims_to_collapse) + + points = serialize(self.points, dims_to_collapse) # Create the new collapsed coordinate. - coord = self.copy(points=np.array(points, dtype=dtype), bounds=bounds) + coord = self.copy(points=np.array(points), bounds=bounds) else: # Collapse the coordinate by calculating the bounded extremes. if self.ndim > 1: @@ -2194,7 +2212,7 @@ def serialize(x): coord = self.copy(points=points, bounds=bounds) return coord - def _guess_bounds(self, bound_position=0.5): + def _guess_bounds(self, bound_position=0.5, monthly=False, yearly=False): """Return bounds for this coordinate based on its points. Parameters @@ -2202,6 +2220,12 @@ def _guess_bounds(self, bound_position=0.5): bound_position : float, default=0.5 The desired position of the bounds relative to the position of the points. + monthly : bool, default=False + If True, the coordinate must be monthly and bounds are set to the + start and ends of each month. + yearly : bool, default=False + If True, the coordinate must be yearly and bounds are set to the + start and ends of each year. Returns ------- @@ -2224,7 +2248,7 @@ def _guess_bounds(self, bound_position=0.5): if self.ndim != 1: raise iris.exceptions.CoordinateMultiDimError(self) - if self.shape[0] < 2: + if not monthly and self.shape[0] < 2: raise ValueError("Cannot guess bounds for a coordinate of length 1.") if self.has_bounds(): @@ -2233,31 +2257,80 @@ def _guess_bounds(self, bound_position=0.5): "before guessing new ones." ) - if getattr(self, "circular", False): - points = np.empty(self.shape[0] + 2) - points[1:-1] = self.points - direction = 1 if self.points[-1] > self.points[0] else -1 - points[0] = self.points[-1] - (self.units.modulus * direction) - points[-1] = self.points[0] + (self.units.modulus * direction) - diffs = np.diff(points) + if monthly or yearly: + if monthly and yearly: + raise ValueError( + "Cannot guess monthly and yearly bounds simultaneously." + ) + dates = self.units.num2date(self.points) + lower_bounds = [] + upper_bounds = [] + months_and_years = [] + if monthly: + for date in dates: + if date.month == 12: + lyear = date.year + uyear = date.year + 1 + lmonth = 12 + umonth = 1 + else: + lyear = uyear = date.year + lmonth = date.month + umonth = date.month + 1 + date_pair = (date.year, date.month) + if date_pair not in months_and_years: + months_and_years.append(date_pair) + else: + raise ValueError( + "Cannot guess monthly bounds for a coordinate with multiple " + "points in a month." + ) + lower_bounds.append(date.__class__(lyear, lmonth, 1, 0, 0)) + upper_bounds.append(date.__class__(uyear, umonth, 1, 0, 0)) + elif yearly: + for date in dates: + year = date.year + if year not in months_and_years: + months_and_years.append(year) + else: + raise ValueError( + "Cannot guess yearly bounds for a coordinate with multiple " + "points in a year." + ) + lower_bounds.append(date.__class__(date.year, 1, 1, 0, 0)) + upper_bounds.append(date.__class__(date.year + 1, 1, 1, 0, 0)) + bounds = self.units.date2num(np.array([lower_bounds, upper_bounds]).T) + contiguous = np.ma.allclose(bounds[1:, 0], bounds[:-1, 1]) + if not contiguous: + raise ValueError("Cannot guess bounds for a non-contiguous coordinate.") + + # if not monthly or yearly else: - diffs = np.diff(self.points) - diffs = np.insert(diffs, 0, diffs[0]) - diffs = np.append(diffs, diffs[-1]) + if getattr(self, "circular", False): + points = np.empty(self.shape[0] + 2) + points[1:-1] = self.points + direction = 1 if self.points[-1] > self.points[0] else -1 + points[0] = self.points[-1] - (self.units.modulus * direction) + points[-1] = self.points[0] + (self.units.modulus * direction) + diffs = np.diff(points) + else: + diffs = np.diff(self.points) + diffs = np.insert(diffs, 0, diffs[0]) + diffs = np.append(diffs, diffs[-1]) - min_bounds = self.points - diffs[:-1] * bound_position - max_bounds = self.points + diffs[1:] * (1 - bound_position) + min_bounds = self.points - diffs[:-1] * bound_position + max_bounds = self.points + diffs[1:] * (1 - bound_position) - bounds = np.array([min_bounds, max_bounds]).transpose() + bounds = np.array([min_bounds, max_bounds]).transpose() - if self.name() in ("latitude", "grid_latitude") and self.units == "degree": - points = self.points - if (points >= -90).all() and (points <= 90).all(): - np.clip(bounds, -90, 90, out=bounds) + if self.name() in ("latitude", "grid_latitude") and self.units == "degree": + points = self.points + if (points >= -90).all() and (points <= 90).all(): + np.clip(bounds, -90, 90, out=bounds) return bounds - def guess_bounds(self, bound_position=0.5): + def guess_bounds(self, bound_position=0.5, monthly=False, yearly=False): """Add contiguous bounds to a coordinate, calculated from its points. Puts a cell boundary at the specified fraction between each point and @@ -2274,6 +2347,13 @@ def guess_bounds(self, bound_position=0.5): bound_position : float, default=0.5 The desired position of the bounds relative to the position of the points. + monthly : bool, default=False + If True, the coordinate must be monthly and bounds are set to the + start and ends of each month. + yearly : bool, default=False + If True, the coordinate must be yearly and bounds are set to the + start and ends of each year. + Notes ----- @@ -2288,8 +2368,14 @@ def guess_bounds(self, bound_position=0.5): produce unexpected results : In such cases you should assign suitable values directly to the bounds property, instead. + .. note:: + + Monthly and Yearly work differently from the standard case. They + can work for single points but cannot be used together. + + """ - self.bounds = self._guess_bounds(bound_position) + self.bounds = self._guess_bounds(bound_position, monthly, yearly) def intersect(self, other, return_indices=False): """Return a new coordinate from the intersection of two coordinates. @@ -2345,9 +2431,9 @@ def nearest_neighbour_index(self, point): >>> cube = iris.load_cube(iris.sample_data_path('ostia_monthly.nc')) >>> cube.coord('latitude').nearest_neighbour_index(0) - 9 + np.int64(9) >>> cube.coord('longitude').nearest_neighbour_index(10) - 12 + np.int64(12) .. note:: If the coordinate contains bounds, these will be used to determine the nearest neighbour instead of the point values. @@ -2614,7 +2700,7 @@ def __init__( #: Whether the coordinate wraps by ``coord.units.modulus``. self.circular = circular - def __deepcopy__(self, memo): + def __deepcopy__(self, memo): # numpydoc ignore=SS02 """coord.__deepcopy__() -> Deep copy of coordinate. Used if copy.deepcopy is called on a coordinate. @@ -2704,7 +2790,12 @@ def _new_points_requirements(self, points): emsg = "The {!r} {} points array must be strictly monotonic." raise ValueError(emsg.format(self.name(), self.__class__.__name__)) - @Coord._values.setter + @property + def _values(self): + # Overridden just to allow .setter override. + return super()._values + + @_values.setter def _values(self, points): # DimCoord always realises the points, to allow monotonicity checks. # Ensure it is an actual array, and also make our own copy so that we @@ -2796,7 +2887,12 @@ def _new_bounds_requirements(self, bounds): return bounds - @Coord.bounds.setter + @property + def bounds(self): + # Overridden just to allow .setter override. + return super().bounds + + @bounds.setter def bounds(self, bounds): if bounds is not None: # Ensure we have a realised array of new bounds values. diff --git a/lib/iris/cube.py b/lib/iris/cube.py index e77646993e..30ac3432b7 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -5,21 +5,21 @@ """Classes for representing multi-dimensional data with metadata.""" -from collections import OrderedDict -import copy -from copy import deepcopy -from functools import partial, reduce -import itertools -import operator -from typing import ( +from __future__ import annotations + +from collections.abc import ( Container, Iterable, Iterator, Mapping, MutableMapping, - Optional, - Union, ) +import copy +from copy import deepcopy +from functools import partial, reduce +import itertools +import operator +from typing import TYPE_CHECKING, Any, Optional, TypeGuard import warnings from xml.dom.minidom import Document import zlib @@ -38,11 +38,17 @@ from iris.analysis.cartography import wrap_lons import iris.analysis.maths import iris.aux_factory +from iris.aux_factory import AuxCoordFactory from iris.common import CFVariableMixin, CubeMetadata, metadata_manager_factory -from iris.common.metadata import metadata_filter +from iris.common.metadata import CoordMetadata, metadata_filter from iris.common.mixin import LimitedAttributeDict import iris.coord_systems import iris.coords +from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, CellMethod, DimCoord + +if TYPE_CHECKING: + import iris.mesh + from iris.mesh import MeshCoord import iris.exceptions import iris.util import iris.warnings @@ -72,8 +78,10 @@ def add(self, cube): if sub_cube is not None: self.cubes.append(sub_cube) - def merged(self, unique=False): - """Return a new :class:`_CubeFilter` by merging the list of cubes. + def combined(self, unique=False): + """Return a new :class:`_CubeFilter` by combining the list of cubes. + + Combines the list of cubes with :func:`~iris._combine_load_cubes`. Parameters ---------- @@ -82,7 +90,12 @@ def merged(self, unique=False): duplicate cubes are detected. """ - return _CubeFilter(self.constraint, self.cubes.merge(unique)) + from iris import _combine_load_cubes + + return _CubeFilter( + self.constraint, + _combine_load_cubes(self.cubes, merge_require_unique=unique), + ) class _CubeFilterCollection: @@ -94,8 +107,8 @@ def from_cubes(cubes, constraints=None): constraints = iris._constraints.list_of_constraints(constraints) pairs = [_CubeFilter(constraint) for constraint in constraints] collection = _CubeFilterCollection(pairs) - for cube in cubes: - collection.add_cube(cube) + for c in cubes: + collection.add_cube(c) return collection def __init__(self, pairs): @@ -107,14 +120,18 @@ def add_cube(self, cube): pair.add(cube) def cubes(self): - """Return all the cubes in this collection concatenated into a single :class:`CubeList`.""" + """Return all the cubes in this collection in a single :class:`CubeList`.""" + from iris.cube import CubeList + result = CubeList() for pair in self.pairs: result.extend(pair.cubes) return result - def merged(self, unique=False): - """Return a new :class:`_CubeFilterCollection` by merging all the cube lists of this collection. + def combined(self, unique=False): + """Return a new :class:`_CubeFilterCollection` by combining all the cube lists of this collection. + + Combines each list of cubes using :func:`~iris._combine_load_cubes`. Parameters ---------- @@ -123,7 +140,7 @@ def merged(self, unique=False): duplicate cubes are detected. """ - return _CubeFilterCollection([pair.merged(unique) for pair in self.pairs]) + return _CubeFilterCollection([pair.combined(unique) for pair in self.pairs]) class CubeList(list): @@ -134,8 +151,8 @@ def __init__(self, *args, **kwargs): # Do whatever a list does, to initialise ourself "as a list" super().__init__(*args, **kwargs) # Check that all items in the list are cubes. - for cube in self: - self._assert_is_cube(cube) + for c in self: + self._assert_is_cube(c) def __str__(self): """Run short :meth:`Cube.summary` on every cube.""" @@ -169,14 +186,14 @@ def _repr_html_(self): def __add__(self, other): return CubeList(list.__add__(self, other)) - def __getitem__(self, keys): + def __getitem__(self, keys): # numpydoc ignore=SS02 """x.__getitem__(y) <==> x[y].""" result = super().__getitem__(keys) if isinstance(result, list): result = CubeList(result) return result - def __getslice__(self, start, stop): + def __getslice__(self, start, stop): # numpydoc ignore=SS02 """x.__getslice__(i, j) <==> x[i:j]. Use of negative indices is not supported. @@ -270,7 +287,8 @@ def extract_cube(self, constraint): See Also -------- - :meth:`~iris.cube.CubeList.extract` + iris.cube.CubeList.extract : + Filter each of the cubes which can be filtered by the given constraints. """ # Just validate this, so we can accept strings etc, but not multiples. @@ -293,7 +311,8 @@ def extract_cubes(self, constraints): See Also -------- - :meth:`~iris.cube.CubeList.extract` + iris.cube.CubeList.extract : + Filter each of the cubes which can be filtered by the given constraints. """ return self._extract_and_merge( @@ -308,9 +327,9 @@ def _extract_and_merge(cubes, constraints, strict=False, return_single_cube=Fals constraint_groups = dict( [(constraint, CubeList()) for constraint in constraints] ) - for cube in cubes: + for c in cubes: for constraint, cube_list in constraint_groups.items(): - sub_cube = constraint.extract(cube) + sub_cube = constraint.extract(c) if sub_cube is not None: cube_list.append(sub_cube) @@ -394,8 +413,8 @@ def merge_cube(self): # Register each of our cubes with a single ProtoCube. proto_cube = iris._merge.ProtoCube(self[0]) - for cube in self[1:]: - proto_cube.register(cube, error_on_mismatch=True) + for c in self[1:]: + proto_cube.register(c, error_on_mismatch=True) # Extract the merged cube from the ProtoCube. (merged_cube,) = proto_cube.merge() @@ -471,18 +490,18 @@ def merge(self, unique=True): """ # Register each of our cubes with its appropriate ProtoCube. proto_cubes_by_name = {} - for cube in self: - name = cube.standard_name + for c in self: + name = c.standard_name proto_cubes = proto_cubes_by_name.setdefault(name, []) proto_cube = None for target_proto_cube in proto_cubes: - if target_proto_cube.register(cube): + if target_proto_cube.register(c): proto_cube = target_proto_cube break if proto_cube is None: - proto_cube = iris._merge.ProtoCube(cube) + proto_cube = iris._merge.ProtoCube(c) proto_cubes.append(proto_cube) # Emulate Python 2 behaviour. @@ -547,7 +566,7 @@ def concatenate_cube( raise ValueError("can't concatenate an empty CubeList") names = [cube.metadata.name() for cube in self] - unique_names = list(OrderedDict.fromkeys(names)) + unique_names = list(dict.fromkeys(names)) if len(unique_names) == 1: res = concatenate( self, @@ -717,7 +736,7 @@ def realise_data(self): # Compute these stats together (avoiding multiple data passes). CubeList([a_std, b_std, ab_mean_diff, std_err]).realise_data() - .. Note:: + .. note:: Cubes with non-lazy data are not affected. @@ -730,7 +749,7 @@ def copy(self): return deepcopy(self) -def _is_single_item(testee): +def _is_single_item(testee) -> TypeGuard[str | AuxCoord | DimCoord | int]: """Return whether this is a single item, rather than an iterable. We count string types as 'single', also. @@ -788,7 +807,7 @@ class CubeAttrsDict(MutableMapping): def __init__( self, - combined: Optional[Union[Mapping, str]] = "__unspecified", + combined: Optional[Mapping] = None, locals: Optional[Mapping] = None, globals: Optional[Mapping] = None, ): @@ -804,7 +823,7 @@ def __init__( Parameters ---------- combined : dict - values to init both 'self.globals' and 'self.locals'. If 'combined' itself + Values to init both 'self.globals' and 'self.locals'. If 'combined' itself has attributes named 'locals' and 'globals', these are used to update the respective content (after initially setting the individual ones). Otherwise, 'combined' is treated as a generic mapping, applied as @@ -812,9 +831,9 @@ def __init__( i.e. it will set locals and/or globals with the same logic as :meth:`~iris.cube.CubeAttrsDict.__setitem__` . locals : dict - initial content for 'self.locals' + Initial content for 'self.locals'. globals : dict - initial content for 'self.globals' + Initial content for 'self.globals'. Examples -------- @@ -836,10 +855,11 @@ def __init__( """ # First initialise locals + globals, defaulting to empty. - self.locals = locals - self.globals = globals + # See https://github.com/python/mypy/issues/3004 + self.locals = locals # type: ignore[assignment] + self.globals = globals # type: ignore[assignment] # Update with combined, if present. - if not isinstance(combined, str) or combined != "__unspecified": + if combined is not None: # Treat a single input with 'locals' and 'globals' properties as an # existing CubeAttrsDict, and update from its content. # N.B. enforce deep copying, consistent with general Iris usage. @@ -1126,7 +1146,7 @@ def _sort_xml_attrs(cls, doc): Parameters ---------- - doc : :class:`xml.dom.minidom.Document`. + doc : :class:`xml.dom.minidom.Document` Returns ------- @@ -1170,18 +1190,20 @@ def _walk_nodes(node): def __init__( self, - data, - standard_name=None, - long_name=None, - var_name=None, - units=None, - attributes=None, - cell_methods=None, - dim_coords_and_dims=None, - aux_coords_and_dims=None, - aux_factories=None, - cell_measures_and_dims=None, - ancillary_variables_and_dims=None, + data: np.typing.ArrayLike, + standard_name: str | None = None, + long_name: str | None = None, + var_name: str | None = None, + units: Unit | str | None = None, + attributes: Mapping | None = None, + cell_methods: Iterable[CellMethod] | None = None, + dim_coords_and_dims: Iterable[tuple[DimCoord, int]] | None = None, + aux_coords_and_dims: Iterable[tuple[AuxCoord, int | Iterable[int]]] + | None = None, + aux_factories: Iterable[AuxCoordFactory] | None = None, + cell_measures_and_dims: Iterable[tuple[CellMeasure, int]] | None = None, + ancillary_variables_and_dims: Iterable[tuple[AncillaryVariable, int]] + | None = None, ): """Create a cube with data and optional metadata. @@ -1200,33 +1222,33 @@ def __init__( array_like (as described in :func:`numpy.asarray`). See :attr:`Cube.data`. - standard_name : optional + standard_name : The standard name for the Cube's data. - long_name : optional + long_name : An unconstrained description of the cube. - var_name : optional + var_name : The NetCDF variable name for the cube. - units : optional + units : The unit of the cube, e.g. ``"m s-1"`` or ``"kelvin"``. - attributes : optional - A dictionary of cube attributes - cell_methods : optional + attributes : + A dictionary of cube attributes. + cell_methods : A tuple of CellMethod objects, generally set by Iris, e.g. ``(CellMethod("mean", coords='latitude'), )``. - dim_coords_and_dims : optional + dim_coords_and_dims : A list of coordinates with scalar dimension mappings, e.g ``[(lat_coord, 0), (lon_coord, 1)]``. - aux_coords_and_dims : optional + aux_coords_and_dims : A list of coordinates with dimension mappings, e.g ``[(lat_coord, 0), (lon_coord, (0, 1))]``. See also :meth:`Cube.add_dim_coord()` and :meth:`Cube.add_aux_coord()`. - aux_factories : optional + aux_factories : A list of auxiliary coordinate factories. See :mod:`iris.aux_factory`. - cell_measures_and_dims : optional + cell_measures_and_dims : A list of CellMeasures with dimension mappings. - ancillary_variables_and_dims : optional + ancillary_variables_and_dims : A list of AncillaryVariables with dimension mappings. Examples @@ -1268,22 +1290,28 @@ def __init__( #: The NetCDF variable name for the Cube. self.var_name = var_name - self.cell_methods = cell_methods + # See https://github.com/python/mypy/issues/3004. + self.cell_methods = cell_methods # type: ignore[assignment] #: A dictionary for arbitrary Cube metadata. #: A few keys are restricted - see :class:`CubeAttrsDict`. - self.attributes = attributes + # See https://github.com/python/mypy/issues/3004. + self.attributes = attributes # type: ignore[assignment] # Coords - self._dim_coords_and_dims = [] - self._aux_coords_and_dims = [] - self._aux_factories = [] + self._dim_coords_and_dims: list[tuple[DimCoord, int]] = [] + self._aux_coords_and_dims: list[ + tuple[AuxCoord | DimCoord, tuple[int, ...]] + ] = [] + self._aux_factories: list[AuxCoordFactory] = [] # Cell Measures - self._cell_measures_and_dims = [] + self._cell_measures_and_dims: list[tuple[CellMeasure, tuple[int, ...]]] = [] # Ancillary Variables - self._ancillary_variables_and_dims = [] + self._ancillary_variables_and_dims: list[ + tuple[AncillaryVariable, tuple[int, ...]] + ] = [] identities = set() if dim_coords_and_dims: @@ -1298,12 +1326,12 @@ def __init__( dims.add(dim) if aux_coords_and_dims: - for coord, dims in aux_coords_and_dims: - identity = coord.standard_name, coord.long_name + for auxcoord, auxdims in aux_coords_and_dims: + identity = auxcoord.standard_name, auxcoord.long_name if identity not in identities: - self._add_unique_aux_coord(coord, dims) + self._add_unique_aux_coord(auxcoord, auxdims) else: - self.add_aux_coord(coord, dims) + self.add_aux_coord(auxcoord, auxdims) identities.add(identity) if aux_factories: @@ -1311,15 +1339,15 @@ def __init__( self.add_aux_factory(factory) if cell_measures_and_dims: - for cell_measure, dims in cell_measures_and_dims: - self.add_cell_measure(cell_measure, dims) + for cell_measure, cmdims in cell_measures_and_dims: + self.add_cell_measure(cell_measure, cmdims) if ancillary_variables_and_dims: - for ancillary_variable, dims in ancillary_variables_and_dims: - self.add_ancillary_variable(ancillary_variable, dims) + for ancillary_variable, avdims in ancillary_variables_and_dims: + self.add_ancillary_variable(ancillary_variable, avdims) @property - def _names(self): + def _names(self) -> tuple[str | None, str | None, str | None, str | None]: """Tuple containing the value of each name participating in the identity of a :class:`iris.cube.Cube`. A tuple containing the value of each name participating in the identity @@ -1333,12 +1361,12 @@ def _names(self): # # Ensure that .attributes is always a :class:`CubeAttrsDict`. # - @property + @property # type: ignore[override] def attributes(self) -> CubeAttrsDict: - return super().attributes + return super().attributes # type: ignore[return-value] @attributes.setter - def attributes(self, attributes: Optional[Mapping]): + def attributes(self, attributes: Mapping | None) -> None: """Override to CfVariableMixin.attributes.setter. An override to CfVariableMixin.attributes.setter, which ensures that Cube @@ -1370,7 +1398,11 @@ def _dimensional_metadata(self, name_or_dimensional_metadata): raise KeyError(f"{name_or_dimensional_metadata} was not found in {self}.") return found_item - def is_compatible(self, other, ignore=None): + def is_compatible( + self, + other: Cube | CubeMetadata, + ignore: Iterable[str] | str | None = None, + ) -> bool: """Return whether the cube is compatible with another. Compatibility is determined by comparing :meth:`iris.cube.Cube.name()`, @@ -1382,7 +1414,7 @@ def is_compatible(self, other, ignore=None): other : An instance of :class:`iris.cube.Cube` or :class:`iris.cube.CubeMetadata`. - ignore : optional + ignore : A single attribute key or iterable of attribute keys to ignore when comparing the cubes. Default is None. To ignore all attributes set this to other.attributes. @@ -1424,7 +1456,7 @@ def is_compatible(self, other, ignore=None): return compatible - def convert_units(self, unit): + def convert_units(self, unit: str | Unit) -> None: """Change the cube's units, converting the values in the data array. For example, if a cube's :attr:`~iris.cube.Cube.units` are @@ -1461,11 +1493,15 @@ def convert_units(self, unit): self.data = new_data self.units = unit - def add_cell_method(self, cell_method): + def add_cell_method(self, cell_method: CellMethod) -> None: """Add a :class:`~iris.coords.CellMethod` to the Cube.""" self.cell_methods += (cell_method,) - def add_aux_coord(self, coord, data_dims=None): + def add_aux_coord( + self, + coord: AuxCoord | DimCoord, + data_dims: Iterable[int] | int | None = None, + ) -> None: """Add a CF auxiliary coordinate to the cube. Parameters @@ -1473,7 +1509,7 @@ def add_aux_coord(self, coord, data_dims=None): coord : The :class:`iris.coords.DimCoord` or :class:`iris.coords.AuxCoord` instance to add to the cube. - data_dims : optional + data_dims : Integer or iterable of integers giving the data dimensions spanned by the coordinate. @@ -1485,7 +1521,8 @@ def add_aux_coord(self, coord, data_dims=None): See Also -------- - :meth:`Cube.remove_coord()`. + remove_coord : + Remove a coordinate from the cube. """ if self.coords(coord): # TODO: just fail on duplicate object @@ -1494,11 +1531,15 @@ def add_aux_coord(self, coord, data_dims=None): ) self._add_unique_aux_coord(coord, data_dims) - def _check_multi_dim_metadata(self, metadata, data_dims): + def _check_multi_dim_metadata( + self, + metadata: iris.coords._DimensionalMetadata, + data_dims: Iterable[int] | int | None, + ) -> tuple[int, ...]: # Convert to a tuple of integers if data_dims is None: data_dims = tuple() - elif isinstance(data_dims, Container): + elif isinstance(data_dims, Iterable): data_dims = tuple(int(d) for d in data_dims) else: data_dims = (int(data_dims),) @@ -1532,9 +1573,17 @@ def _check_multi_dim_metadata(self, metadata, data_dims): raise iris.exceptions.CannotAddError(msg) return data_dims - def _add_unique_aux_coord(self, coord, data_dims): + def _add_unique_aux_coord( + self, + coord: AuxCoord | DimCoord, + data_dims: Iterable[int] | int | None, + ) -> None: data_dims = self._check_multi_dim_metadata(coord, data_dims) - if hasattr(coord, "mesh"): + + def is_mesh_coord(anycoord: iris.coords.Coord) -> TypeGuard[MeshCoord]: + return hasattr(anycoord, "mesh") + + if is_mesh_coord(coord): mesh = self.mesh if mesh: msg = ( @@ -1574,7 +1623,7 @@ def _add_unique_aux_coord(self, coord, data_dims): self._aux_coords_and_dims.append((coord, data_dims)) - def add_aux_factory(self, aux_factory): + def add_aux_factory(self, aux_factory: AuxCoordFactory) -> None: """Add an auxiliary coordinate factory to the cube. Parameters @@ -1606,7 +1655,11 @@ def coordsonly(coords_and_dims): ) self._aux_factories.append(aux_factory) - def add_cell_measure(self, cell_measure, data_dims=None): + def add_cell_measure( + self, + cell_measure: CellMeasure, + data_dims: Iterable[int] | int | None = None, + ) -> None: """Add a CF cell measure to the cube. Parameters @@ -1614,7 +1667,7 @@ def add_cell_measure(self, cell_measure, data_dims=None): cell_measure : The :class:`iris.coords.CellMeasure` instance to add to the cube. - data_dims : optional + data_dims : Integer or iterable of integers giving the data dimensions spanned by the coordinate. @@ -1626,7 +1679,8 @@ def add_cell_measure(self, cell_measure, data_dims=None): See Also -------- - :meth:`Cube.remove_cell_measure()`. + remove_cell_measure : + Remove a cell measure from the cube. """ if self.cell_measures(cell_measure): @@ -1639,15 +1693,19 @@ def add_cell_measure(self, cell_measure, data_dims=None): key=lambda cm_dims: (cm_dims[0].metadata, cm_dims[1]) ) - def add_ancillary_variable(self, ancillary_variable, data_dims=None): + def add_ancillary_variable( + self, + ancillary_variable: AncillaryVariable, + data_dims: Iterable[int] | int | None = None, + ) -> None: """Add a CF ancillary variable to the cube. Parameters ---------- ancillary_variable : The :class:`iris.coords.AncillaryVariable` instance to be added to - the cube - data_dims : optional + the cube. + data_dims : Integer or iterable of integers giving the data dimensions spanned by the ancillary variable. @@ -1656,6 +1714,7 @@ def add_ancillary_variable(self, ancillary_variable, data_dims=None): ValueError Raises a ValueError if an ancillary variable with identical metadata already exists on the cube. + """ if self.ancillary_variables(ancillary_variable): raise iris.exceptions.CannotAddError( @@ -1668,12 +1727,12 @@ def add_ancillary_variable(self, ancillary_variable, data_dims=None): key=lambda av_dims: (av_dims[0].metadata, av_dims[1]) ) - def add_dim_coord(self, dim_coord, data_dim): + def add_dim_coord(self, dim_coord: DimCoord, data_dim: int | tuple[int]) -> None: """Add a CF coordinate to the cube. Parameters ---------- - dim_coord : :class:`iris.coords.DimCoord` + dim_coord : The :class:`iris.coords.DimCoord` instance to add to the cube. data_dim : Integer giving the data dimension spanned by the coordinate. @@ -1687,7 +1746,8 @@ def add_dim_coord(self, dim_coord, data_dim): See Also -------- - :meth:`Cube.remove_coord()`. + remove_coord : + Remove a coordinate from the cube. """ if self.coords(dim_coord): @@ -1702,7 +1762,11 @@ def add_dim_coord(self, dim_coord, data_dim): ) self._add_unique_dim_coord(dim_coord, data_dim) - def _add_unique_dim_coord(self, dim_coord, data_dim): + def _add_unique_dim_coord( + self, + dim_coord: DimCoord, + data_dim: int | tuple[int], + ) -> None: if isinstance(dim_coord, iris.coords.AuxCoord): raise iris.exceptions.CannotAddError( "The dim_coord may not be an AuxCoord instance." @@ -1738,11 +1802,11 @@ def _add_unique_dim_coord(self, dim_coord, data_dim): self._dim_coords_and_dims.append((dim_coord, int(data_dim))) - def remove_aux_factory(self, aux_factory): + def remove_aux_factory(self, aux_factory: AuxCoordFactory) -> None: """Remove the given auxiliary coordinate factory from the cube.""" self._aux_factories.remove(aux_factory) - def _remove_coord(self, coord): + def _remove_coord(self, coord: DimCoord | AuxCoord) -> None: self._dim_coords_and_dims = [ (coord_, dim) for coord_, dim in self._dim_coords_and_dims @@ -1757,18 +1821,20 @@ def _remove_coord(self, coord): if coord.metadata == aux_factory.metadata: self.remove_aux_factory(aux_factory) - def remove_coord(self, coord): + def remove_coord(self, coord: str | DimCoord | AuxCoord | AuxCoordFactory) -> None: """Remove a coordinate from the cube. Parameters ---------- - coord : str or coord + coord : The (name of the) coordinate to remove from the cube. See Also -------- - :meth:`Cube.add_dim_coord()` - :meth:`Cube.add_aux_coord()` + add_dim_coord : + Add a CF coordinate to the cube. + add_aux_coord : + Add a CF auxiliary coordinate to the cube. """ coord = self.coord(coord) @@ -1777,12 +1843,12 @@ def remove_coord(self, coord): for factory in self.aux_factories: factory.update(coord) - def remove_cell_measure(self, cell_measure): + def remove_cell_measure(self, cell_measure: str | CellMeasure) -> None: """Remove a cell measure from the cube. Parameters ---------- - cell_measure : str or cell_measure + cell_measure : The (name of the) cell measure to remove from the cube. As either * (a) a :attr:`standard_name`, :attr:`long_name`, or @@ -1795,15 +1861,14 @@ def remove_cell_measure(self, cell_measure): Notes ----- - .. note:: - - If the argument given does not represent a valid cell_measure on - the cube, an :class:`iris.exceptions.CellMeasureNotFoundError` - is raised. + If the argument given does not represent a valid cell_measure on + the cube, an :class:`iris.exceptions.CellMeasureNotFoundError` + is raised. See Also -------- - :meth:`Cube.add_cell_measure()` + add_cell_measure : + Add a CF cell measure to the cube. """ cell_measure = self.cell_measure(cell_measure) @@ -1814,12 +1879,15 @@ def remove_cell_measure(self, cell_measure): if cell_measure_ is not cell_measure ] - def remove_ancillary_variable(self, ancillary_variable): + def remove_ancillary_variable( + self, + ancillary_variable: str | AncillaryVariable, + ) -> None: """Remove an ancillary variable from the cube. Parameters ---------- - ancillary_variable : str or AncillaryVariable + ancillary_variable : The (name of the) AncillaryVariable to remove from the cube. """ @@ -1831,7 +1899,7 @@ def remove_ancillary_variable(self, ancillary_variable): if ancillary_variable_ is not ancillary_variable ] - def replace_coord(self, new_coord): + def replace_coord(self, new_coord: DimCoord | AuxCoord) -> None: """Replace the coordinate whose metadata matches the given coordinate.""" old_coord = self.coord(new_coord) dims = self.coord_dims(old_coord) @@ -1845,7 +1913,9 @@ def replace_coord(self, new_coord): for factory in self.aux_factories: factory.update(old_coord, new_coord) - def coord_dims(self, coord): + def coord_dims( + self, coord: str | DimCoord | AuxCoord | AuxCoordFactory + ) -> tuple[int, ...]: """Return a tuple of the data dimensions relevant to the given coordinate. When searching for the given coordinate in the cube the comparison is @@ -1855,9 +1925,13 @@ def coord_dims(self, coord): Parameters ---------- - coord : str or coord + coord : The (name of the) coord to look for. + Returns + ------- + tuple: + A tuple of the data dimensions relevant to the given coordinate. """ name_provided = False if isinstance(coord, str): @@ -1868,7 +1942,9 @@ def coord_dims(self, coord): coord_id = id(coord) # Dimension of dimension coordinate by object id - dims_by_id = {id(c): (d,) for c, d in self._dim_coords_and_dims} + dims_by_id: dict[int, tuple[int, ...]] = { + id(c): (d,) for c, d in self._dim_coords_and_dims + } # Check for id match - faster than equality check match = dims_by_id.get(coord_id) @@ -1905,14 +1981,18 @@ def matcher(factory): return match - def cell_measure_dims(self, cell_measure): + def cell_measure_dims(self, cell_measure: str | CellMeasure) -> tuple[int, ...]: """Return a tuple of the data dimensions relevant to the given CellMeasure. Parameters ---------- - cell_measure : str or CellMeasure + cell_measure : The (name of the) cell measure to look for. + Returns + ------- + tuple: + A tuple of the data dimensions relevant to the given cell measure. """ cell_measure = self.cell_measure(cell_measure) @@ -1927,7 +2007,10 @@ def cell_measure_dims(self, cell_measure): return matches[0] - def ancillary_variable_dims(self, ancillary_variable): + def ancillary_variable_dims( + self, + ancillary_variable: str | AncillaryVariable, + ) -> tuple[int, ...]: """Return a tuple of the data dimensions relevant to the given AncillaryVariable. Parameters @@ -1935,6 +2018,10 @@ def ancillary_variable_dims(self, ancillary_variable): ancillary_variable : str or AncillaryVariable The (name of the) AncillaryVariable to look for. + Returns + ------- + tuple: + A tuple of the data dimensions relevant to the given ancillary variable. """ ancillary_variable = self.ancillary_variable(ancillary_variable) @@ -1953,7 +2040,13 @@ def ancillary_variable_dims(self, ancillary_variable): return matches[0] - def aux_factory(self, name=None, standard_name=None, long_name=None, var_name=None): + def aux_factory( + self, + name: str | None = None, + standard_name: str | None = None, + long_name: str | None = None, + var_name: str | None = None, + ) -> AuxCoordFactory: """Return the single coordinate factory that matches the criteria. Return the single coordinate factory that matches the criteria, @@ -1961,18 +2054,23 @@ def aux_factory(self, name=None, standard_name=None, long_name=None, var_name=No Parameters ---------- - name : optional + name : If not None, matches against factory.name(). - standard_name : optional + standard_name : The CF standard name of the desired coordinate factory. If None, does not check for standard name. - long_name : optional + long_name : An unconstrained description of the coordinate factory. If None, does not check for long_name. - var_name : optional + var_name : The NetCDF variable name of the desired coordinate factory. If None, does not check for var_name. + Returns + ------- + AuxCoordFactory: + The single coordinate factory that matches the criteria. + Notes ----- .. note:: @@ -1982,7 +2080,7 @@ def aux_factory(self, name=None, standard_name=None, long_name=None, var_name=No :class:`iris.exceptions.CoordinateNotFoundError` is raised. """ - factories = self.aux_factories + factories = list(self.aux_factories) if name is not None: factories = [factory for factory in factories if factory.name() == name] @@ -2021,23 +2119,28 @@ def aux_factory(self, name=None, standard_name=None, long_name=None, var_name=No def coords( self, - name_or_coord=None, - standard_name=None, - long_name=None, - var_name=None, - attributes=None, - axis=None, + name_or_coord: str + | DimCoord + | AuxCoord + | AuxCoordFactory + | CoordMetadata + | None = None, + standard_name: str | None = None, + long_name: str | None = None, + var_name: str | None = None, + attributes: Mapping | None = None, + axis: iris.util.Axis | None = None, contains_dimension=None, - dimensions=None, + dimensions: Iterable[int] | int | None = None, coord_system=None, - dim_coords=None, - mesh_coords=None, - ): + dim_coords: bool | None = None, + mesh_coords: bool | None = None, + ) -> list[DimCoord | AuxCoord]: r"""Return a list of coordinates from the :class:`Cube` that match the provided criteria. Parameters ---------- - name_or_coord : optional + name_or_coord : Either, * a :attr:`~iris.common.mixin.CFVariableMixin.standard_name`, @@ -2048,41 +2151,41 @@ def coords( * a coordinate or metadata instance equal to that of the desired coordinate e.g., :class:`~iris.coords.DimCoord` or :class:`~iris.common.metadata.CoordMetadata`. - standard_name : optional + standard_name : The CF standard name of the desired coordinate. If ``None``, does not check for ``standard name``. - long_name : optional + long_name : An unconstrained description of the coordinate. If ``None``, does not check for ``long_name``. - var_name : optional + var_name : The NetCDF variable name of the desired coordinate. If ``None``, does not check for ``var_name``. - attributes : optional + attributes : A dictionary of attributes desired on the coordinates. If ``None``, does not check for ``attributes``. - axis : optional + axis : The desired coordinate axis, see :func:`iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - contains_dimension : optional + contains_dimension : The desired coordinate contains the data dimension. If ``None``, does not check for the dimension. - dimensions : optional + dimensions : The exact data dimensions of the desired coordinate. Coordinates with no data dimension can be found with an empty ``tuple`` or ``list`` i.e., ``()`` or ``[]``. If ``None``, does not check for dimensions. - coord_system : optional + coord_system : Whether the desired coordinates have a coordinate system equal to the given coordinate system. If ``None``, no check is done. - dim_coords : optional + dim_coords : Set to ``True`` to only return coordinates that are the cube's dimension coordinates. Set to ``False`` to only return coordinates that are the cube's auxiliary, mesh and derived coordinates. If ``None``, returns all coordinates. - mesh_coords : optional + mesh_coords : Set to ``True`` to return only coordinates which are - :class:`~iris.experimental.ugrid.MeshCoord`\'s. + :class:`~iris.mesh.MeshCoord`\'s. Set to ``False`` to return only non-mesh coordinates. If ``None``, returns all coordinates. @@ -2092,11 +2195,12 @@ def coords( See Also -------- - :meth:`Cube.coord` for matching exactly one coordinate. + coord : + For matching exactly one coordinate. """ - coords_and_factories = [] + coords_and_factories: list[DimCoord | AuxCoord | AuxCoordFactory] = [] if dim_coords in [True, None]: coords_and_factories += list(self.dim_coords) @@ -2108,7 +2212,7 @@ def coords( if mesh_coords is not None: # Select on mesh or non-mesh. mesh_coords = bool(mesh_coords) - # Use duck typing to avoid importing from iris.experimental.ugrid, + # Use duck typing to avoid importing from iris.mesh, # which could be a circular import. if mesh_coords: # *only* MeshCoords @@ -2146,7 +2250,7 @@ def coords( ] if dimensions is not None: - if not isinstance(dimensions, Container): + if not isinstance(dimensions, Iterable): dimensions = [dimensions] dimensions = tuple(dimensions) coords_and_factories = [ @@ -2177,23 +2281,28 @@ def extract_coord(coord_or_factory): def coord( self, - name_or_coord=None, - standard_name=None, - long_name=None, - var_name=None, - attributes=None, - axis=None, + name_or_coord: str + | DimCoord + | AuxCoord + | AuxCoordFactory + | CoordMetadata + | None = None, + standard_name: str | None = None, + long_name: str | None = None, + var_name: str | None = None, + attributes: Mapping | None = None, + axis: iris.util.Axis | None = None, contains_dimension=None, - dimensions=None, + dimensions: Iterable[int] | int | None = None, coord_system=None, - dim_coords=None, - mesh_coords=None, - ): + dim_coords: bool | None = None, + mesh_coords: bool | None = None, + ) -> DimCoord | AuxCoord: r"""Return a single coordinate from the :class:`Cube` that matches the provided criteria. Parameters ---------- - name_or_coord : optional + name_or_coord : Either, * a :attr:`~iris.common.mixin.CFVariableMixin.standard_name`, @@ -2204,41 +2313,41 @@ def coord( * a coordinate or metadata instance equal to that of the desired coordinate e.g., :class:`~iris.coords.DimCoord` or :class:`~iris.common.metadata.CoordMetadata`. - standard_name : optional + standard_name : The CF standard name of the desired coordinate. If ``None``, does not check for ``standard name``. - long_name : optional + long_name : An unconstrained description of the coordinate. If ``None``, does not check for ``long_name``. - var_name : optional + var_name : The NetCDF variable name of the desired coordinate. If ``None``, does not check for ``var_name``. - attributes : optional + attributes : A dictionary of attributes desired on the coordinates. If ``None``, does not check for ``attributes``. - axis : optional + axis : The desired coordinate axis, see :func:`iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - contains_dimension : optional + contains_dimension : The desired coordinate contains the data dimension. If ``None``, does not check for the dimension. - dimensions : optional + dimensions : The exact data dimensions of the desired coordinate. Coordinates with no data dimension can be found with an empty ``tuple`` or ``list`` i.e., ``()`` or ``[]``. If ``None``, does not check for dimensions. - coord_system : optional + coord_system : Whether the desired coordinates have a coordinate system equal to the given coordinate system. If ``None``, no check is done. - dim_coords : optional + dim_coords : Set to ``True`` to only return coordinates that are the cube's dimension coordinates. Set to ``False`` to only return coordinates that are the cube's auxiliary, mesh and derived coordinates. If ``None``, returns all coordinates. - mesh_coords : optional + mesh_coords : Set to ``True`` to return only coordinates which are - :class:`~iris.experimental.ugrid.MeshCoord`\'s. + :class:`~iris.mesh.MeshCoord`\'s. Set to ``False`` to return only non-mesh coordinates. If ``None``, returns all coordinates. @@ -2255,7 +2364,9 @@ def coord( See Also -------- - :meth:`Cube.coords` for matching zero or more coordinates. + coords : + For matching zero or more coordinates. + """ coords = self.coords( name_or_coord=name_or_coord, @@ -2268,6 +2379,7 @@ def coord( dimensions=dimensions, coord_system=coord_system, dim_coords=dim_coords, + mesh_coords=mesh_coords, ) if len(coords) > 1: @@ -2296,7 +2408,10 @@ def coord( return coords[0] - def coord_system(self, spec=None): + def coord_system( + self, + spec: str | type[iris.coord_systems.CoordSystem] | None = None, + ) -> iris.coord_systems.CoordSystem | None: """Find the coordinate system of the given type. If no target coordinate system is provided then find @@ -2304,7 +2419,7 @@ def coord_system(self, spec=None): Parameters ---------- - spec : optional + spec : The the name or type of a coordinate system subclass. E.g. :: @@ -2345,84 +2460,93 @@ def coord_system(self, spec=None): return result - def _any_meshcoord(self): + def _any_meshcoord(self) -> MeshCoord | None: """Return a MeshCoord if there are any, else None.""" mesh_coords = self.coords(mesh_coords=True) if mesh_coords: result = mesh_coords[0] else: result = None - return result + return result # type: ignore[return-value] @property - def mesh(self): - r"""Return the unstructured :class:`~iris.experimental.ugrid.Mesh` associated with the cube. + def mesh(self) -> iris.mesh.MeshXY | None: + r"""Return the unstructured :class:`~iris.mesh.MeshXY` associated with the cube. - Return the unstructured :class:`~iris.experimental.ugrid.Mesh` + Return the unstructured :class:`~iris.mesh.MeshXY` associated with the cube, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.mesh.MeshCoord`, or ``None`` if it has none. Returns ------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` or None + :class:`iris.mesh.MeshXY` or None The mesh of the cube - :class:`~iris.experimental.ugrid.MeshCoord`'s, + :class:`~iris.mesh.MeshCoord`'s, or ``None``. """ - result = self._any_meshcoord() - if result is not None: - result = result.mesh + coord = self._any_meshcoord() + if coord is None: + result = None + else: + result = coord.mesh return result @property - def location(self): + def location(self) -> iris.mesh.components.Location | None: r"""Return the mesh "location" of the cube data. Return the mesh "location" of the cube data, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.mesh.MeshCoord`, or ``None`` if it has none. Returns ------- - location : str or None + str or None The mesh location of the cube - :class:`~iris.experimental.ugrid.MeshCoords` + :class:`~iris.mesh.MeshCoords` (i.e. one of 'face' / 'edge' / 'node'), or ``None``. """ - result = self._any_meshcoord() - if result is not None: - result = result.location + coord = self._any_meshcoord() + if coord is None: + result = None + else: + result = coord.location return result - def mesh_dim(self): + def mesh_dim(self) -> int | None: r"""Return the cube dimension of the mesh. Return the cube dimension of the mesh, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.mesh.MeshCoord`, or ``None`` if it has none. Returns ------- - mesh_dim : int or None + int or None The cube dimension which the cube - :class:`~iris.experimental.ugrid.MeshCoord` map to, + :class:`~iris.mesh.MeshCoord` map to, or ``None``. """ - result = self._any_meshcoord() - if result is not None: - (result,) = self.coord_dims(result) # result is a 1-tuple + coord = self._any_meshcoord() + if coord is None: + result = None + else: + (result,) = self.coord_dims(coord) # result is a 1-tuple return result - def cell_measures(self, name_or_cell_measure=None): + def cell_measures( + self, + name_or_cell_measure: str | CellMeasure | None = None, + ) -> list[CellMeasure]: """Return a list of cell measures in this cube fitting the given criteria. Parameters ---------- - name_or_cell_measure : optional + name_or_cell_measure : Either * (a) a :attr:`standard_name`, :attr:`long_name`, or @@ -2433,9 +2557,15 @@ def cell_measures(self, name_or_cell_measure=None): * (b) a cell_measure instance with metadata equal to that of the desired cell_measures. + Returns + ------- + list + List of cell measures in this cube fitting the given criteria. + See Also -------- - :meth:`Cube.cell_measure()`. + cell_measure : + Return a single cell_measure. """ name = None @@ -2456,7 +2586,10 @@ def cell_measures(self, name_or_cell_measure=None): cell_measures.append(cm) return cell_measures - def cell_measure(self, name_or_cell_measure=None): + def cell_measure( + self, + name_or_cell_measure: str | CellMeasure | None = None, + ) -> CellMeasure: """Return a single cell_measure given the same arguments as :meth:`Cube.cell_measures`. Notes @@ -2467,9 +2600,14 @@ def cell_measure(self, name_or_cell_measure=None): being matched, an :class:`iris.exceptions.CellMeasureNotFoundError` is raised. + Returns + ------- + CellMeasure + A single cell measure in this cube fitting the given criteria. + See Also -------- - :meth:`Cube.cell_measures()` + cell_measures : For full keyword documentation. """ @@ -2504,12 +2642,15 @@ def cell_measure(self, name_or_cell_measure=None): return cell_measures[0] - def ancillary_variables(self, name_or_ancillary_variable=None): + def ancillary_variables( + self, + name_or_ancillary_variable: str | AncillaryVariable | None = None, + ) -> list[AncillaryVariable]: """Return a list of ancillary variable in this cube fitting the given criteria. Parameters ---------- - name_or_ancillary_variable : optional + name_or_ancillary_variable : Either * (a) a :attr:`standard_name`, :attr:`long_name`, or @@ -2520,9 +2661,15 @@ def ancillary_variables(self, name_or_ancillary_variable=None): * (b) a ancillary_variable instance with metadata equal to that of the desired ancillary_variables. + Returns + ------- + list + List of ancillary variables in this cube fitting the given criteria. + See Also -------- - :meth:`Cube.ancillary_variable()`. + ancillary_variable : + Return a ancillary_variable. """ name = None @@ -2543,7 +2690,10 @@ def ancillary_variables(self, name_or_ancillary_variable=None): ancillary_variables.append(av) return ancillary_variables - def ancillary_variable(self, name_or_ancillary_variable=None): + def ancillary_variable( + self, + name_or_ancillary_variable: str | AncillaryVariable | None = None, + ) -> AncillaryVariable: """Return a single ancillary_variable given the same arguments as :meth:`Cube.ancillary_variables`. Notes @@ -2554,9 +2704,14 @@ def ancillary_variable(self, name_or_ancillary_variable=None): ancillary_variable being matched, an :class:`iris.exceptions.AncillaryVariableNotFoundError` is raised. + Returns + ------- + AncillaryVariable + A single ancillary variable in this cube fitting the given criteria. + See Also -------- - :meth:`Cube.ancillary_variables()` + ancillary_variables : For full keyword documentation. """ @@ -2595,7 +2750,7 @@ def ancillary_variable(self, name_or_ancillary_variable=None): return ancillary_variables[0] @property - def cell_methods(self): + def cell_methods(self) -> tuple[CellMethod, ...]: """Tuple of :class:`iris.coords.CellMethod`. Tuple of :class:`iris.coords.CellMethod` representing the processing @@ -2605,7 +2760,10 @@ def cell_methods(self): return self._metadata_manager.cell_methods @cell_methods.setter - def cell_methods(self, cell_methods: Iterable): + def cell_methods( + self, + cell_methods: Iterable[CellMethod] | None, + ) -> None: if not cell_methods: # For backwards compatibility: Empty or null value is equivalent to (). cell_methods = () @@ -2616,14 +2774,14 @@ def cell_methods(self, cell_methods: Iterable): # All contents should be CellMethods. Requiring class membership is # somewhat non-Pythonic, but simple, and not a problem for now. if not isinstance(cell_method, iris.coords.CellMethod): - msg = ( + msg = ( # type: ignore[unreachable] f"Cube.cell_methods assigned value includes {cell_method}, " "which is not an iris.coords.CellMethod." ) raise ValueError(msg) self._metadata_manager.cell_methods = cell_methods - def core_data(self): + def core_data(self) -> np.ndarray | da.Array: """Retrieve the data array of this :class:`~iris.cube.Cube`. Retrieve the data array of this :class:`~iris.cube.Cube` in its @@ -2638,7 +2796,7 @@ def core_data(self): return self._data_manager.core_data() @property - def shape(self): + def shape(self) -> tuple[int, ...]: """The shape of the data of this cube.""" return self._data_manager.shape @@ -2648,11 +2806,11 @@ def dtype(self): return self._data_manager.dtype @property - def ndim(self): + def ndim(self) -> int: """The number of dimensions in the data of this cube.""" return self._data_manager.ndim - def lazy_data(self): + def lazy_data(self) -> da.Array: """Return a "lazy array" representing the Cube data. Return a "lazy array" representing the Cube data. A lazy array @@ -2677,7 +2835,7 @@ def lazy_data(self): return self._data_manager.lazy_data() @property - def data(self): + def data(self) -> np.ndarray: """The :class:`numpy.ndarray` representing the multi-dimensional data of the cube. Notes @@ -2712,11 +2870,11 @@ def data(self): return self._data_manager.data @data.setter - def data(self, data): + def data(self, data: np.typing.ArrayLike) -> None: self._data_manager.data = data - def has_lazy_data(self): - """Details whether this :class:`~iris.cube.Cube` has lazy data. + def has_lazy_data(self) -> bool: + """Detail whether this :class:`~iris.cube.Cube` has lazy data. Returns ------- @@ -2726,7 +2884,7 @@ def has_lazy_data(self): return self._data_manager.has_lazy_data() @property - def dim_coords(self): + def dim_coords(self) -> tuple[DimCoord, ...]: """Return a tuple of all the dimension coordinates, ordered by dimension. .. note:: @@ -2750,7 +2908,7 @@ def dim_coords(self): ) @property - def aux_coords(self): + def aux_coords(self) -> tuple[AuxCoord | DimCoord, ...]: """Return a tuple of all the auxiliary coordinates, ordered by dimension(s).""" return tuple( ( @@ -2763,7 +2921,7 @@ def aux_coords(self): ) @property - def derived_coords(self): + def derived_coords(self) -> tuple[AuxCoord, ...]: """Return a tuple of all the coordinates generated by the coordinate factories.""" return tuple( factory.make_coord(self.coord_dims) @@ -2773,11 +2931,11 @@ def derived_coords(self): ) @property - def aux_factories(self): + def aux_factories(self) -> tuple[AuxCoordFactory, ...]: """Return a tuple of all the coordinate factories.""" return tuple(self._aux_factories) - def summary(self, shorten=False, name_padding=35): + def summary(self, shorten: bool = False, name_padding: int = 35) -> str: """Summary of the Cube. String summary of the Cube with name+units, a list of dim coord names @@ -2785,11 +2943,11 @@ def summary(self, shorten=False, name_padding=35): Parameters ---------- - shorten : bool, default=False + shorten : If set, produce a one-line summary of minimal width, showing only the cube name, units and dimensions. When not set (default), produces a full multi-line summary string. - name_padding : int, default=35 + name_padding : Control the *minimum* width of the cube name + units, i.e. the indent of the dimension map section. @@ -2800,13 +2958,13 @@ def summary(self, shorten=False, name_padding=35): summary = printer.to_string(oneline=shorten, name_padding=name_padding) return summary - def __str__(self): + def __str__(self) -> str: return self.summary() - def __repr__(self): + def __repr__(self) -> str: return "" % self.summary(shorten=True, name_padding=1) - def _repr_html_(self): + def _repr_html_(self) -> str: from iris.experimental.representation import CubeRepresentation representer = CubeRepresentation(self) @@ -2816,7 +2974,7 @@ def _repr_html_(self): # TypeError with a useful message if a Cube is iterated over. __iter__ = None - def __getitem__(self, keys): + def __getitem__(self, keys) -> Cube: """Cube indexing has been implemented at the data level. Cube indexing (through use of square bracket notation) has been @@ -2867,7 +3025,7 @@ def new_ancillary_variable_dims(av_): data = ma.array(data.data, mask=data.mask, dtype=cube_data.dtype) # Make the new cube slice - cube = Cube(data) + cube = self.__class__(data) cube.metadata = deepcopy(self.metadata) # Record a mapping from old coordinate IDs to new coordinates, @@ -2925,7 +3083,7 @@ def new_ancillary_variable_dims(av_): return cube - def subset(self, coord): + def subset(self, coord: AuxCoord | DimCoord) -> Cube | None: """Get a subset of the cube by providing the desired resultant coordinate. Get a subset of the cube by providing the desired resultant @@ -2965,24 +3123,23 @@ def subset(self, coord): if coord_indices.size == 0: # No matches found. - return + return None # Build up a slice which spans the whole of the cube full_slice = [slice(None, None)] * len(self.shape) # Update the full slice to only extract specific indices which # were identified above full_slice[coord_to_extract_dim] = coord_indices - full_slice = tuple(full_slice) - result = self[full_slice] + result = self[tuple(full_slice)] return result - def extract(self, constraint): + def extract(self, constraint: iris.Constraint | str | None) -> Cube: """Filter cube by the given constraint using :meth:`iris.Constraint.extract`.""" # Cast the constraint into a proper constraint if it is not so already constraint = iris._constraints.as_constraint(constraint) return constraint.extract(self) - def intersection(self, *args, **kwargs): + def intersection(self, *args, **kwargs) -> Cube: """Return the intersection of the cube with specified coordinate ranges. Coordinate ranges can be specified as: @@ -3000,7 +3157,7 @@ def intersection(self, *args, **kwargs): ---------- coord : Either a :class:`iris.coords.Coord`, or coordinate name - (as defined in :meth:`iris.cube.Cube.coords()`) + (as defined in :meth:`iris.cube.Cube.coords()`). minimum : The minimum value of the range to select. maximum : @@ -3008,7 +3165,7 @@ def intersection(self, *args, **kwargs): min_inclusive : If True, coordinate values equal to `minimum` will be included in the selection. Default is True. - max_inclusive: + max_inclusive : If True, coordinate values equal to `maximum` will be included in the selection. Default is True. ignore_bounds : optional @@ -3061,23 +3218,28 @@ def intersection(self, *args, **kwargs): for arg in args: result = result._intersect( *arg, ignore_bounds=ignore_bounds, threshold=threshold - ) + ) # type: ignore[misc] for name, value in kwargs.items(): result = result._intersect( name, *value, ignore_bounds=ignore_bounds, threshold=threshold - ) + ) # type: ignore[misc] return result def _intersect( self, - name_or_coord, - minimum, - maximum, - min_inclusive=True, - max_inclusive=True, - ignore_bounds=False, + name_or_coord: str + | DimCoord + | AuxCoord + | AuxCoordFactory + | CoordMetadata + | None, + minimum: float | int, + maximum: float | int, + min_inclusive: bool = True, + max_inclusive: bool = True, + ignore_bounds: bool = False, threshold=0, - ): + ) -> Cube: coord = self.coord(name_or_coord) if coord.ndim != 1: raise iris.exceptions.CoordinateMultiDimError(coord) @@ -3122,12 +3284,7 @@ def make_chunk(key): result = chunks[0] else: chunk_data = [chunk.core_data() for chunk in chunks] - if self.has_lazy_data(): - func = da.concatenate - else: - module = ma if ma.isMaskedArray(self.data) else np - func = module.concatenate - data = func(chunk_data, dim) + data = _lazy.concatenate(chunk_data, axis=dim) result = iris.cube.Cube(data) result.metadata = deepcopy(self.metadata) @@ -3169,13 +3326,44 @@ def create_coords(src_coords, add_coord): add_coord(result_coord, dims) coord_mapping[id(src_coord)] = result_coord + def create_metadata(src_metadatas, add_metadata, get_metadata): + for src_metadata in src_metadatas: + dims = src_metadata.cube_dims(self) + if dim in dims: + dim_within_coord = dims.index(dim) + data = np.concatenate( + [ + get_metadata(chunk, src_metadata.name()).core_data() + for chunk in chunks + ], + dim_within_coord, + ) + result_coord = src_metadata.copy(values=data) + else: + result_coord = src_metadata.copy() + add_metadata(result_coord, dims) + create_coords(self.dim_coords, result.add_dim_coord) create_coords(self.aux_coords, result.add_aux_coord) + create_metadata( + self.cell_measures(), result.add_cell_measure, Cube.cell_measure + ) + create_metadata( + self.ancillary_variables(), + result.add_ancillary_variable, + Cube.ancillary_variable, + ) for factory in self.aux_factories: result.add_aux_factory(factory.updated(coord_mapping)) return result - def _intersect_derive_subset(self, coord, points, bounds, inside_indices): + def _intersect_derive_subset( + self, + coord: AuxCoord | DimCoord, + points: np.ndarray, + bounds: np.ndarray, + inside_indices: np.ndarray, + ) -> list[slice]: # Return the subsets, i.e. the means to allow the slicing of # coordinates to ensure that they remain contiguous. modulus = coord.units.modulus @@ -3259,14 +3447,14 @@ def dim_coord_subset(): def _intersect_modulus( self, - coord, - minimum, - maximum, - min_inclusive, - max_inclusive, - ignore_bounds, - threshold, - ): + coord: AuxCoord | DimCoord, + minimum: float | int, + maximum: float | int, + min_inclusive: bool, + max_inclusive: bool, + ignore_bounds: bool, + threshold: float | int, + ) -> tuple[list[slice], np.ndarray, np.ndarray]: modulus = coord.units.modulus if maximum > minimum + modulus: raise ValueError("requested range greater than coordinate's unit's modulus") @@ -3350,7 +3538,7 @@ def _intersect_modulus( subsets = self._intersect_derive_subset(coord, points, bounds, inside_indices) return subsets, points, bounds - def _as_list_of_coords(self, names_or_coords): + def _as_list_of_coords(self, names_or_coords) -> list[AuxCoord | DimCoord]: """Convert a name, coord, or list of names/coords to a list of coords.""" # If not iterable, convert to list of a single item if _is_single_item(names_or_coords): @@ -3359,7 +3547,7 @@ def _as_list_of_coords(self, names_or_coords): coords = [] for name_or_coord in names_or_coords: if isinstance(name_or_coord, str) or isinstance( - name_or_coord, iris.coords.Coord + name_or_coord, (iris.coords.DimCoord, iris.coords.AuxCoord) ): coords.append(self.coord(name_or_coord)) else: @@ -3372,7 +3560,14 @@ def _as_list_of_coords(self, names_or_coords): raise TypeError(msg) return coords - def slices_over(self, ref_to_slice): + def slices_over( + self, + ref_to_slice: str + | AuxCoord + | DimCoord + | int + | Iterable[str | AuxCoord | DimCoord | int], + ) -> Iterable[Cube]: """Return an iterator of all subcubes. Return an iterator of all subcubes along a given coordinate or @@ -3380,7 +3575,7 @@ def slices_over(self, ref_to_slice): Parameters ---------- - ref_to_slice: str, coord, dimension index or a list of these + ref_to_slice : Determines which dimensions will be iterated along (i.e. the dimensions that are not returned in the subcubes). A mix of input types can also be provided. @@ -3391,10 +3586,37 @@ def slices_over(self, ref_to_slice): Examples -------- - For example, to get all subcubes along the time dimension:: - - for sub_cube in cube.slices_over('time'): - print(sub_cube) + For example, for a cube with dimensions `realization`, `time`, `latitude` and + `longitude`: + + >>> fname = iris.sample_data_path('GloSea4', 'ensemble_01[01].pp') + >>> cube = iris.load_cube(fname, 'surface_temperature') + >>> print(cube.summary(shorten=True)) + surface_temperature / (K) (realization: 2; time: 6; latitude: 145; longitude: 192) + + To get all 12x2D longitude/latitude subcubes: + + >>> for sub_cube in cube.slices_over(['realization', 'time']): + ... print(sub_cube.summary(shorten=True)) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + surface_temperature / (K) (latitude: 145; longitude: 192) + + To get realizations as 2x3D separate subcubes, using the `realization` dimension index: + + >>> for sub_cube in cube.slices_over(0): + ... print(sub_cube.summary(shorten=True)) + surface_temperature / (K) (time: 6; latitude: 145; longitude: 192) + surface_temperature / (K) (time: 6; latitude: 145; longitude: 192) Notes ----- @@ -3406,19 +3628,20 @@ def slices_over(self, ref_to_slice): See Also -------- - :meth:`iris.cube.Cube.slices`. + iris.cube.Cube.slices : + Return an iterator of all subcubes given the coordinates or dimension indices. - """ + """ # noqa: D214, D406, D407, D410, D411 # Required to handle a mix between types. if _is_single_item(ref_to_slice): ref_to_slice = [ref_to_slice] - slice_dims = set() - for ref in ref_to_slice: + slice_dims: set[int] = set() + for ref in ref_to_slice: # type: ignore[union-attr] try: (coord,) = self._as_list_of_coords(ref) except TypeError: - dim = int(ref) + dim = int(ref) # type: ignore[arg-type] if dim < 0 or dim > self.ndim: msg = ( "Requested an iterator over a dimension ({}) " @@ -3427,7 +3650,7 @@ def slices_over(self, ref_to_slice): raise ValueError(msg) # Convert coord index to a single-element list to prevent a # TypeError when `slice_dims.update` is called with it. - dims = [dim] + dims: tuple[int, ...] = (dim,) else: dims = self.coord_dims(coord) slice_dims.update(dims) @@ -3436,7 +3659,15 @@ def slices_over(self, ref_to_slice): opposite_dims = list(all_dims - slice_dims) return self.slices(opposite_dims, ordered=False) - def slices(self, ref_to_slice, ordered=True): + def slices( + self, + ref_to_slice: str + | AuxCoord + | DimCoord + | int + | Iterable[str | AuxCoord | DimCoord | int], + ordered: bool = True, + ) -> Iterator[Cube]: """Return an iterator of all subcubes given the coordinates or dimension indices. Return an iterator of all subcubes given the coordinates or dimension @@ -3444,16 +3675,15 @@ def slices(self, ref_to_slice, ordered=True): Parameters ---------- - ref_to_slice : str, coord, dimension index or a list of these + ref_to_slice : Determines which dimensions will be returned in the subcubes (i.e. the dimensions that are not iterated over). A mix of input types can also be provided. They must all be orthogonal (i.e. point to different dimensions). - ordered : bool, default=True - if True, the order which the coords to slice or data_dims - are given will be the order in which they represent the data in - the resulting cube slices. If False, the order will follow that of - the source cube. Default is True. + ordered : + If True, subcube dimensions are ordered to match the dimension order + in `ref_to_slice`. If False, the order will follow that of + the source cube. Returns ------- @@ -3461,17 +3691,51 @@ def slices(self, ref_to_slice, ordered=True): Examples -------- - For example, to get all 2d longitude/latitude subcubes from a - multi-dimensional cube:: - - for sub_cube in cube.slices(['longitude', 'latitude']): - print(sub_cube) + For example, for a cube with dimensions `realization`, `time`, `latitude` and + `longitude`: + + >>> fname = iris.sample_data_path('GloSea4', 'ensemble_01[01].pp') + >>> cube = iris.load_cube(fname, 'surface_temperature') + >>> print(cube.summary(shorten=True)) + surface_temperature / (K) (realization: 2; time: 6; latitude: 145; longitude: 192) + + To get all 12x2D longitude/latitude subcubes: + + >>> for sub_cube in cube.slices(['longitude', 'latitude']): + ... print(sub_cube.summary(shorten=True)) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + surface_temperature / (K) (longitude: 192; latitude: 145) + + + .. warning:: + Note that the dimension order returned in the sub_cubes matches the order specified + in the ``cube.slices`` call, *not* the order of the dimensions in the original cube. + + To get all realizations as 2x3D separate subcubes, using the `time`, `latitude` + and `longitude` dimensions' indices: + + >>> for sub_cube in cube.slices([1, 2, 3]): + ... print(sub_cube.summary(shorten=True)) + surface_temperature / (K) (time: 6; latitude: 145; longitude: 192) + surface_temperature / (K) (time: 6; latitude: 145; longitude: 192) See Also -------- - :meth:`iris.cube.Cube.slices_over`. + iris.cube.Cube.slices_over : + Return an iterator of all subcubes along a given coordinate or + dimension index. - """ + """ # noqa: D214, D406, D407, D410, D411 if not isinstance(ordered, bool): raise TypeError("'ordered' argument to slices must be boolean.") @@ -3479,8 +3743,8 @@ def slices(self, ref_to_slice, ordered=True): if _is_single_item(ref_to_slice): ref_to_slice = [ref_to_slice] - dim_to_slice = [] - for ref in ref_to_slice: + dim_to_slice: list[int] = [] + for ref in ref_to_slice: # type: ignore[union-attr] try: # attempt to handle as coordinate coord = self._as_list_of_coords(ref)[0] @@ -3497,7 +3761,7 @@ def slices(self, ref_to_slice, ordered=True): except TypeError: try: # attempt to handle as dimension index - dim = int(ref) + dim = int(ref) # type: ignore[arg-type] except ValueError: raise ValueError( "{} Incompatible type {} for slicing".format(ref, type(ref)) @@ -3523,12 +3787,12 @@ def slices(self, ref_to_slice, ordered=True): return _SliceIterator(self, dims_index, dim_to_slice, ordered) - def transpose(self, new_order=None): + def transpose(self, new_order: list[int] | None = None) -> None: """Re-order the data dimensions of the cube in-place. Parameters ---------- - new_order : list of ints, optional + new_order : By default, reverse the dimensions, otherwise permute the axes according to the values given. @@ -3587,7 +3851,12 @@ def remap_cube_metadata(metadata_and_dims): map(remap_cube_metadata, self._ancillary_variables_and_dims) ) - def xml(self, checksum=False, order=True, byteorder=True): + def xml( + self, + checksum: bool = False, + order: bool = True, + byteorder: bool = True, + ) -> str: """Return a fully valid CubeML string representation of the Cube.""" doc = Document() @@ -3760,12 +4029,12 @@ def _order(array): return cube_xml_element - def copy(self, data=None): + def copy(self, data: np.typing.ArrayLike | None = None) -> Cube: """Return a deep copy of this cube. Parameters ---------- - data : optional + data : Replace the data of the cube copy with provided data payload. Returns @@ -3773,7 +4042,7 @@ def copy(self, data=None): A copy instance of the :class:`Cube`. """ - memo = {} + memo: dict[int, Any] = {} cube = self._deepcopy(memo, data=data) return cube @@ -3891,14 +4160,16 @@ def __ne__(self, other): def __hash__(self): return hash(id(self)) - __add__ = iris.analysis.maths.add + def __add__(self, other): + return iris.analysis.maths.add(self, other) def __iadd__(self, other): return iris.analysis.maths.add(self, other, in_place=True) __radd__ = __add__ - __sub__ = iris.analysis.maths.subtract + def __sub__(self, other): + return iris.analysis.maths.subtract(self, other) def __isub__(self, other): return iris.analysis.maths.subtract(self, other, in_place=True) @@ -3906,7 +4177,8 @@ def __isub__(self, other): def __rsub__(self, other): return (-self) + other - __mul__ = iris.analysis.maths.multiply + def __mul__(self, other): + return iris.analysis.maths.multiply(self, other) def __imul__(self, other): return iris.analysis.maths.multiply(self, other, in_place=True) @@ -3937,7 +4209,12 @@ def __neg__(self): # END OPERATOR OVERLOADS - def collapsed(self, coords, aggregator, **kwargs): + def collapsed( + self, + coords: str | AuxCoord | DimCoord | Iterable[str | AuxCoord | DimCoord], + aggregator: iris.analysis.Aggregator, + **kwargs, + ) -> Cube: """Collapse one or more dimensions over the cube given the coordinate/s and an aggregation. Examples of aggregations that may be used include @@ -3967,12 +4244,12 @@ def collapsed(self, coords, aggregator, **kwargs): Parameters ---------- - coords : str, coord or a list of strings/coords + coords : Coordinate names/coordinates over which the cube should be collapsed. - aggregator : :class:`iris.analysis.Aggregator` + aggregator : Aggregator to be applied for collapse operation. - **kwargs : dict, optional + **kwargs : Aggregation function keyword arguments. Returns @@ -4041,13 +4318,13 @@ def collapsed(self, coords, aggregator, **kwargs): kwargs["weights"] = weights_info.array # Convert any coordinate names to coordinates - coords = self._as_list_of_coords(coords) + coordinates = self._as_list_of_coords(coords) if isinstance( aggregator, iris.analysis.WeightedAggregator ) and not aggregator.uses_weighting(**kwargs): msg = "Collapsing spatial coordinate {!r} without weighting" - lat_match = [coord for coord in coords if "latitude" in coord.name()] + lat_match = [coord for coord in coordinates if "latitude" in coord.name()] if lat_match: for coord in lat_match: warnings.warn( @@ -4056,18 +4333,11 @@ def collapsed(self, coords, aggregator, **kwargs): ) # Determine the dimensions we need to collapse (and those we don't) - if aggregator.cell_method == "peak": - dims_to_collapse = [list(self.coord_dims(coord)) for coord in coords] - - # Remove duplicate dimensions. - new_dims = OrderedDict.fromkeys(d for dim in dims_to_collapse for d in dim) - # Reverse the dimensions so the order can be maintained when - # reshaping the data. - dims_to_collapse = list(new_dims)[::-1] - else: - dims_to_collapse = set() - for coord in coords: - dims_to_collapse.update(self.coord_dims(coord)) + # Remove duplicate dimensions and reverse the dimensions so the order + # can be maintained when reshaping the data. + dims_to_collapse = list( + dict.fromkeys(d for coord in coordinates for d in self.coord_dims(coord)) + )[::-1] if aggregator.name() == "max_run" and len(dims_to_collapse) > 1: msg = "Not possible to calculate runs over more than one dimension" @@ -4077,17 +4347,17 @@ def collapsed(self, coords, aggregator, **kwargs): msg = "Cannot collapse a dimension which does not describe any data." raise iris.exceptions.CoordinateCollapseError(msg) - untouched_dims = set(range(self.ndim)) - set(dims_to_collapse) + untouched_dims = sorted(set(range(self.ndim)) - set(dims_to_collapse)) collapsed_cube = iris.util._strip_metadata_from_dims(self, dims_to_collapse) # Remove the collapsed dimension(s) from the metadata - indices = [slice(None, None)] * self.ndim + indices: list[slice | int] = [slice(None, None)] * self.ndim for dim in dims_to_collapse: indices[dim] = 0 collapsed_cube = collapsed_cube[tuple(indices)] - # Collapse any coords that span the dimension(s) being collapsed + # Collapse any coordinates that span the dimension(s) being collapsed for coord in self.dim_coords + self.aux_coords: coord_dims = self.coord_dims(coord) if set(dims_to_collapse).intersection(coord_dims): @@ -4098,8 +4368,6 @@ def collapsed(self, coords, aggregator, **kwargs): ] collapsed_cube.replace_coord(coord.collapsed(local_dims)) - untouched_dims = sorted(untouched_dims) - # Record the axis(s) argument passed to 'aggregation', so the same is # passed to the 'update_metadata' function. collapse_axis = -1 @@ -4126,11 +4394,12 @@ def collapsed(self, coords, aggregator, **kwargs): # on the cube lazy array. # NOTE: do not reform the data in this case, as 'lazy_aggregate' # accepts multiple axes (unlike 'aggregate'). - collapse_axes = list(dims_to_collapse) - if len(collapse_axes) == 1: + if len(dims_to_collapse) == 1: # Replace a "list of 1 axes" with just a number : This single-axis form is *required* by functions # like da.average (and np.average), if a 1d weights array is specified. - collapse_axes = collapse_axes[0] + collapse_axes: int | list[int] = dims_to_collapse[0] + else: + collapse_axes = list(dims_to_collapse) try: data_result = aggregator.lazy_aggregate( @@ -4168,15 +4437,23 @@ def collapsed(self, coords, aggregator, **kwargs): aggregator.update_metadata( collapsed_cube, - coords, + coordinates, axis=collapse_axis, _weights_units=getattr(weights_info, "units", None), **kwargs, ) - result = aggregator.post_process(collapsed_cube, data_result, coords, **kwargs) + result = aggregator.post_process( + collapsed_cube, data_result, coordinates, **kwargs + ) return result - def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): + def aggregated_by( + self, + coords: str | AuxCoord | DimCoord | Iterable[str | AuxCoord | DimCoord], + aggregator: iris.analysis.Aggregator, + climatological: bool = False, + **kwargs, + ) -> Cube: """Perform aggregation over the cube given one or more "group coordinates". A "group coordinate" is a coordinate where repeating values represent a @@ -4202,17 +4479,17 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): Parameters ---------- - coords : (list of coord names or :class:`iris.coords.Coord` instances) + coords : One or more coordinates over which group aggregation is to be performed. - aggregator : :class:`iris.analysis.Aggregator` + aggregator : Aggregator to be applied to each group. - climatological : bool, default=False + climatological : Indicates whether the output is expected to be climatological. For any aggregated time coord(s), this causes the climatological flag to be set and the point for each cell to equal its first bound, thereby preserving the time of year. - **kwargs : dict, optional + **kwargs : Aggregator and aggregation function keyword arguments. Returns @@ -4261,30 +4538,33 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): kwargs["weights"] = weights_info.array groupby_coords = [] - dimension_to_groupby = None + dimension_to_groupby: int | None = None - coords = self._as_list_of_coords(coords) - for coord in sorted(coords, key=lambda coord: coord.metadata): + coordinates = self._as_list_of_coords(coords) + for coord in sorted(coordinates, key=lambda coord: coord.metadata): if coord.ndim > 1: msg = ( "Cannot aggregate_by coord %s as it is " "multidimensional." % coord.name() ) raise iris.exceptions.CoordinateMultiDimError(msg) - dimension = self.coord_dims(coord) - if not dimension: + dimensions = self.coord_dims(coord) + if not dimensions: msg = ( 'Cannot group-by the coordinate "%s", as its ' "dimension does not describe any data." % coord.name() ) raise iris.exceptions.CoordinateCollapseError(msg) if dimension_to_groupby is None: - dimension_to_groupby = dimension[0] - if dimension_to_groupby != dimension[0]: + dimension_to_groupby = dimensions[0] + if dimension_to_groupby != dimensions[0]: msg = "Cannot group-by coordinates over different dimensions." raise iris.exceptions.CoordinateCollapseError(msg) groupby_coords.append(coord) + if dimension_to_groupby is None: + raise ValueError("Unable to aggregate by an empty list of `coords`.") + # Check shape of weights. These must either match the shape of the cube # or be 1D (in this case, their length must be equal to the length of the # dimension we are aggregating over). @@ -4340,11 +4620,10 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): aggregateby_cube = iris.util._strip_metadata_from_dims( self, [dimension_to_groupby] ) - key = [slice(None, None)] * self.ndim + key: list[slice | tuple[int, ...]] = [slice(None, None)] * self.ndim # Generate unique index tuple key to maintain monotonicity. key[dimension_to_groupby] = tuple(range(len(groupby))) - key = tuple(key) - aggregateby_cube = aggregateby_cube[key] + aggregateby_cube = aggregateby_cube[tuple(key)] for coord in groupby_coords + shared_coords: aggregateby_cube.remove_coord(coord) @@ -4359,32 +4638,27 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): # Choose appropriate data and functions for data aggregation. if aggregator.lazy_func is not None and self.has_lazy_data(): - stack = da.stack input_data = self.lazy_data() agg_method = aggregator.lazy_aggregate else: input_data = self.data - # Note numpy.stack does not preserve masks. - stack = ma.stack if ma.isMaskedArray(input_data) else np.stack agg_method = aggregator.aggregate # Create data and weights slices. front_slice = (slice(None),) * dimension_to_groupby back_slice = (slice(None),) * (len(data_shape) - dimension_to_groupby - 1) - groupby_subarrs = map( - lambda groupby_slice: iris.util._slice_data_with_keys( + groupby_subarrs = ( + iris.util._slice_data_with_keys( input_data, front_slice + (groupby_slice,) + back_slice - )[1], - groupby.group(), + )[1] + for groupby_slice in groupby.group() ) if weights is not None: - groupby_subweights = map( - lambda groupby_slice: weights[ - front_slice + (groupby_slice,) + back_slice - ], - groupby.group(), + groupby_subweights = ( + weights[front_slice + (groupby_slice,) + back_slice] + for groupby_slice in groupby.group() ) else: groupby_subweights = (None for _ in range(len(groupby))) @@ -4393,7 +4667,7 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): agg = iris.analysis.create_weighted_aggregator_fn( agg_method, axis=dimension_to_groupby, **kwargs ) - result = list(map(agg, groupby_subarrs, groupby_subweights)) + result = tuple(map(agg, groupby_subarrs, groupby_subweights)) # If weights are returned, "result" is a list of tuples (each tuple # contains two elements; the first is the aggregated data, the @@ -4401,12 +4675,13 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): # (one for the aggregated data and one for the aggregated weights) # before combining the different slices. if return_weights: - result, weights_result = list(zip(*result)) - aggregateby_weights = stack(weights_result, axis=dimension_to_groupby) + data_result, weights_result = list(zip(*result)) + aggregateby_weights = _lazy.stack(weights_result, axis=dimension_to_groupby) else: + data_result = result aggregateby_weights = None - aggregateby_data = stack(result, axis=dimension_to_groupby) + aggregateby_data = _lazy.stack(data_result, axis=dimension_to_groupby) # Ensure plain ndarray is output if plain ndarray was input. if ma.isMaskedArray(aggregateby_data) and not ma.isMaskedArray(input_data): aggregateby_data = ma.getdata(aggregateby_data) @@ -4420,9 +4695,9 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): **kwargs, ) # Replace the appropriate coordinates within the aggregate-by cube. - (dim_coord,) = self.coords( - dimensions=dimension_to_groupby, dim_coords=True - ) or [None] + dim_coords = self.coords(dimensions=dimension_to_groupby, dim_coords=True) + dim_coord = dim_coords[0] if dim_coords else None + for coord in groupby.coords: new_coord = coord.copy() @@ -4456,12 +4731,18 @@ def aggregated_by(self, coords, aggregator, climatological=False, **kwargs): else: data_result = (aggregateby_data, aggregateby_weights) aggregateby_cube = aggregator.post_process( - aggregateby_cube, data_result, coords, **kwargs + aggregateby_cube, data_result, coordinates, **kwargs ) return aggregateby_cube - def rolling_window(self, coord, aggregator, window, **kwargs): + def rolling_window( + self, + coord: str | AuxCoord | DimCoord, + aggregator: iris.analysis.Aggregator, + window: int, + **kwargs, + ) -> Cube: """Perform rolling window aggregation on a cube. Perform rolling window aggregation on a cube given a coordinate, an @@ -4469,14 +4750,14 @@ def rolling_window(self, coord, aggregator, window, **kwargs): Parameters ---------- - coord : str or :class:`iris.coords.Coord` + coord : The coordinate over which to perform the rolling window aggregation. - aggregator : :class:`iris.analysis.Aggregator` + aggregator : Aggregator to be applied to the data. - window : int + window : Size of window to use. - **kwargs : dict, optional + **kwargs : Aggregator and aggregation function keyword arguments. The weights argument to the aggregator, if any, should be a 1d array, cube, or (names of) :meth:`~iris.cube.Cube.coords`, @@ -4488,18 +4769,12 @@ def rolling_window(self, coord, aggregator, window, **kwargs): ------- :class:`iris.cube.Cube`. - Notes - ----- - .. note:: - - This operation does not yet have support for lazy evaluation. - Examples -------- >>> import iris, iris.analysis >>> fname = iris.sample_data_path('GloSea4', 'ensemble_010.pp') - >>> air_press = iris.load_cube(fname, 'surface_temperature') - >>> print(air_press) + >>> cube = iris.load_cube(fname, 'surface_temperature') + >>> print(cube) surface_temperature / (K) \ (time: 6; latitude: 145; longitude: 192) Dimension coordinates: @@ -4523,7 +4798,7 @@ def rolling_window(self, coord, aggregator, window, **kwargs): 'Data from Met Office Unified Model' um_version '7.6' - >>> print(air_press.rolling_window('time', iris.analysis.MEAN, 3)) + >>> print(cube.rolling_window('time', iris.analysis.MEAN, 3)) surface_temperature / (K) \ (time: 4; latitude: 145; longitude: 192) Dimension coordinates: @@ -4574,13 +4849,13 @@ def rolling_window(self, coord, aggregator, window, **kwargs): if coord.ndim > 1: raise iris.exceptions.CoordinateMultiDimError(coord) - dimension = self.coord_dims(coord) - if len(dimension) != 1: + dimensions = self.coord_dims(coord) + if len(dimensions) != 1: raise iris.exceptions.CoordinateCollapseError( 'Cannot perform rolling window with coordinate "%s", ' "must map to one data dimension." % coord.name() ) - dimension = dimension[0] + dimension = dimensions[0] # Use indexing to get a result-cube of the correct shape. # NB. This indexes the data array which is wasted work. @@ -4597,7 +4872,7 @@ def rolling_window(self, coord, aggregator, window, **kwargs): # this will add an extra dimension to the data at dimension + 1 which # represents the rolled window (i.e. will have a length of window) rolling_window_data = iris.util.rolling_window( - self.data, window=window, axis=dimension + self.core_data(), window=window, axis=dimension ) # now update all of the coordinates to reflect the aggregation @@ -4616,7 +4891,7 @@ def rolling_window(self, coord, aggregator, window, **kwargs): "coordinate." % coord_.name() ) - new_bounds = iris.util.rolling_window(coord_.points, window) + new_bounds = iris.util.rolling_window(coord_.core_points(), window) if np.issubdtype(new_bounds.dtype, np.str_): # Handle case where the AuxCoord contains string. The points @@ -4662,13 +4937,21 @@ def rolling_window(self, coord, aggregator, window, **kwargs): kwargs["weights"] = iris.util.broadcast_to_shape( weights, rolling_window_data.shape, (dimension + 1,) ) - data_result = aggregator.aggregate( - rolling_window_data, axis=dimension + 1, **kwargs - ) + + if aggregator.lazy_func is not None and self.has_lazy_data(): + agg_method = aggregator.lazy_aggregate + else: + agg_method = aggregator.aggregate + data_result = agg_method(rolling_window_data, axis=dimension + 1, **kwargs) result = aggregator.post_process(new_cube, data_result, [coord], **kwargs) return result - def interpolate(self, sample_points, scheme, collapse_scalar=True): + def interpolate( + self, + sample_points: Iterable[tuple[AuxCoord | DimCoord | str, np.typing.ArrayLike]], + scheme: iris.analysis.InterpolationScheme, + collapse_scalar: bool = True, + ) -> Cube: """Interpolate from this :class:`~iris.cube.Cube` to the given sample points. Interpolate from this :class:`~iris.cube.Cube` to the given @@ -4752,10 +5035,10 @@ def interpolate(self, sample_points, scheme, collapse_scalar=True): """ coords, points = zip(*sample_points) - interp = scheme.interpolator(self, coords) + interp = scheme.interpolator(self, coords) # type: ignore[arg-type] return interp(points, collapse_scalar=collapse_scalar) - def regrid(self, grid, scheme): + def regrid(self, grid: Cube, scheme: iris.analysis.RegriddingScheme) -> Cube: r"""Regrid this :class:`~iris.cube.Cube` on to the given target `grid`. Regrid this :class:`~iris.cube.Cube` on to the given target `grid` diff --git a/lib/iris/experimental/animate.py b/lib/iris/experimental/animate.py index 5c9fa77bf8..13c1613802 100644 --- a/lib/iris/experimental/animate.py +++ b/lib/iris/experimental/animate.py @@ -8,15 +8,15 @@ ----- .. deprecated:: 3.4.0 -``iris.experimental.animate.animate()`` has been moved to -:func:`iris.plot.animate`. This module will therefore be removed in a future -release. + ``iris.experimental.animate.animate()`` has been moved to + :func:`iris.plot.animate`. This module will therefore be removed in a future + release. """ def animate(cube_iterator, plot_func, fig=None, **kwargs): - """Animates the given cube iterator. + """Animate the given cube iterator. Warnings -------- diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py new file mode 100644 index 0000000000..57cbded2c2 --- /dev/null +++ b/lib/iris/experimental/geovista.py @@ -0,0 +1,335 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Experimental module for using some GeoVista operations with Iris cubes.""" + +from geovista import Transform +from geovista.common import VTK_CELL_IDS, VTK_POINT_IDS + +from iris.exceptions import CoordinateNotFoundError +from iris.mesh import MeshXY + + +def _get_coord(cube, axis): + """Get the axis coordinates from the cube.""" + try: + coord = cube.coord(axis=axis, dim_coords=True) + except CoordinateNotFoundError: + coord = cube.coord(axis=axis) + return coord + + +def cube_to_polydata(cube, **kwargs): + r"""Create a :class:`pyvista.PolyData` object from a :class:`~iris.cube.Cube`. + + The resulting :class:`~pyvista.PolyData` object can be plotted using + a :class:`geovista.geoplotter.GeoPlotter`. + + Uses :class:`geovista.bridge.Transform` to parse the cube's information - one + of: :meth:`~geovista.bridge.Transform.from_1d` / + :meth:`~geovista.bridge.Transform.from_2d` / + :meth:`~geovista.bridge.Transform.from_unstructured`. + + Parameters + ---------- + cube : :class:`~iris.cube.Cube` + The Cube containing the spatial information and data for creating the + :class:`~pyvista.PolyData`. + + **kwargs : dict, optional + Additional keyword arguments to be passed to the relevant + :class:`~geovista.bridge.Transform` method (e.g ``zlevel``). + + Returns + ------- + :class:`~pyvista.PolyData` + The PolyData object representing the cube's spatial information and data. + + Raises + ------ + NotImplementedError + If a :class:`~iris.cube.Cube` with too many dimensions is passed. Only + the horizontal data can be represented, meaning a 2D Cube, or 1D Cube + if the horizontal space is described by + :class:`~iris.mesh.MeshCoord`\ s. + + Examples + -------- + .. testsetup:: + + from iris import load_cube, sample_data_path + + cube = load_cube(sample_data_path("air_temp.pp")) + cube_w_time = load_cube(sample_data_path("A1B_north_america.nc")) + cube_mesh = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + + >>> from iris.experimental.geovista import cube_to_polydata + + Converting a standard 2-dimensional :class:`~iris.cube.Cube` with + 1-dimensional coordinates: + + >>> print(cube.summary(shorten=True)) + air_temperature / (K) (latitude: 73; longitude: 96) + >>> print(cube_to_polydata(cube)) + PolyData (... + N Cells: 7008 + N Points: 7178 + N Strips: 0 + X Bounds: -9.992e-01, 9.992e-01 + Y Bounds: -9.992e-01, 9.992e-01 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 + + Configure the conversion by passing additional keyword arguments: + + >>> print(cube_to_polydata(cube, radius=2)) + PolyData (... + N Cells: 7008 + N Points: 7178 + N Strips: 0 + X Bounds: -1.998e+00, 1.998e+00 + Y Bounds: -1.998e+00, 1.998e+00 + Z Bounds: -2.000e+00, 2.000e+00 + N Arrays: 4 + + Converting a :class:`~iris.cube.Cube` that has a + :attr:`~iris.cube.Cube.mesh` describing its horizontal space: + + >>> print(cube_mesh.summary(shorten=True)) + synthetic / (1) (-- : 96) + >>> print(cube_to_polydata(cube_mesh)) + PolyData (... + N Cells: 96 + N Points: 98 + N Strips: 0 + X Bounds: -1.000e+00, 1.000e+00 + Y Bounds: -1.000e+00, 1.000e+00 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 + + Remember to reduce the dimensionality of your :class:`~iris.cube.Cube` to + just be the horizontal space: + + >>> print(cube_w_time.summary(shorten=True)) + air_temperature / (K) (time: 240; latitude: 37; longitude: 49) + >>> print(cube_to_polydata(cube_w_time[0, :, :])) + PolyData (... + N Cells: 1813 + N Points: 1900 + N Strips: 0 + X Bounds: -6.961e-01, 6.961e-01 + Y Bounds: -9.686e-01, -3.411e-01 + Z Bounds: 2.483e-01, 8.714e-01 + N Arrays: 4 + + """ + if cube.mesh: + if cube.ndim != 1: + raise NotImplementedError("Cubes with a mesh must be one dimensional") + lons, lats = cube.mesh.node_coords + face_node = cube.mesh.face_node_connectivity + indices = face_node.indices_by_location() + + polydata = Transform.from_unstructured( + xs=lons.points, + ys=lats.points, + connectivity=indices, + data=cube.data, + name=f"{cube.name()} / ({cube.units})", + start_index=face_node.start_index, + **kwargs, + ) + # TODO: Add support for point clouds + elif cube.ndim == 2: + x_coord = _get_coord(cube, "X") + y_coord = _get_coord(cube, "Y") + transform_kwargs = dict( + xs=x_coord.contiguous_bounds(), + ys=y_coord.contiguous_bounds(), + data=cube.data, + name=f"{cube.name()} / ({cube.units})", + **kwargs, + ) + coord_system = cube.coord_system() + if coord_system: + transform_kwargs["crs"] = coord_system.as_cartopy_crs().proj4_init + + if x_coord.ndim == 2 and y_coord.ndim == 2: + polydata = Transform.from_2d(**transform_kwargs) + + elif x_coord.ndim == 1 and y_coord.ndim == 1: + polydata = Transform.from_1d(**transform_kwargs) + + else: + raise NotImplementedError("Only 1D and 2D coordinates are supported") + else: + raise NotImplementedError("Cube must have a mesh or have 2 dimensions") + + return polydata + + +def extract_unstructured_region(cube, polydata, region, **kwargs): + """Index a :class:`~iris.cube.Cube` with a :attr:`~iris.cube.Cube.mesh` to a specific region. + + Uses :meth:`geovista.geodesic.BBox.enclosed` to identify the `cube` indices + that are within the specified region (`region` being a + :class:`~geovista.geodesic.BBox` class). + + Parameters + ---------- + cube : :class:`~iris.cube.Cube` + The cube to be indexed (must have a :attr:`~iris.cube.Cube.mesh`). + polydata : :class:`pyvista.PolyData` + A :class:`~pyvista.PolyData` representing the same horizontal space as + `cube`. The region extraction is first applied to `polydata`, with the + resulting indices then applied to `cube`. In many cases `polydata` can + be created by applying :func:`cube_to_polydata` to `cube`. + region : :class:`geovista.geodesic.BBox` + A :class:`~geovista.geodesic.BBox` representing the region to be + extracted. + **kwargs : dict, optional + Additional keyword arguments to be passed to the + :meth:`geovista.geodesic.BBox.enclosed` method (e.g ``preference``). + + Returns + ------- + :class:`~iris.cube.Cube` + The region extracted cube. + + Raises + ------ + ValueError + If `polydata` and the :attr:`~iris.cube.Cube.mesh` on `cube` do not + have the same shape. + + Examples + -------- + .. testsetup:: + + from iris import load_cube, sample_data_path + from iris.coords import AuxCoord + from iris.cube import CubeList + + file_path = sample_data_path("mesh_C4_synthetic_float.nc") + cube_w_mesh = load_cube(file_path) + + level_cubes = CubeList() + for height_level in range(72): + height_coord = AuxCoord([height_level], standard_name="height") + level_cube = cube_w_mesh.copy() + level_cube.add_aux_coord(height_coord) + level_cubes.append(level_cube) + + cube_w_mesh = level_cubes.merge_cube() + other_cube_w_mesh = cube_w_mesh[:20, :] + + The parameters of :func:`extract_unstructured_region` have been designed with + flexibility and reuse in mind. This is demonstrated below. + + >>> from geovista.geodesic import BBox + >>> from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region + >>> print(cube_w_mesh.shape) + (72, 96) + >>> # The mesh dimension represents the horizontal space of the cube. + >>> print(cube_w_mesh.shape[cube_w_mesh.mesh_dim()]) + 96 + >>> cube_polydata = cube_to_polydata(cube_w_mesh[0, :]) + >>> extracted_cube = extract_unstructured_region( + ... cube=cube_w_mesh, + ... polydata=cube_polydata, + ... region=BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]), + ... ) + >>> print(extracted_cube.shape) + (72, 11) + + Now reuse the same `cube` and `polydata` to extract a different region: + + >>> new_region = BBox(lons=[0, 35, 35, 0], lats=[-25, -25, 45, 45]) + >>> extracted_cube = extract_unstructured_region( + ... cube=cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... ) + >>> print(extracted_cube.shape) + (72, 6) + + Now apply the same region extraction to a different `cube` that has the + same horizontal shape: + + >>> print(other_cube_w_mesh.shape) + (20, 96) + >>> extracted_cube = extract_unstructured_region( + ... cube=other_cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... ) + >>> print(extracted_cube.shape) + (20, 6) + + Arbitrary keywords can be passed down to + :meth:`geovista.geodesic.BBox.enclosed` (``outside`` in this example): + + >>> extracted_cube = extract_unstructured_region( + ... cube=other_cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... outside=True, + ... ) + >>> print(extracted_cube.shape) + (20, 90) + + """ + if cube.mesh: + # Find what dimension the mesh is in on the cube + mesh_dim = cube.mesh_dim() + recreate_mesh = False + + if cube.location == "face": + polydata_length = polydata.GetNumberOfCells() + indices_key = VTK_CELL_IDS + recreate_mesh = True + elif cube.location == "node": + polydata_length = polydata.GetNumberOfPoints() + indices_key = VTK_POINT_IDS + else: + raise NotImplementedError( + f"cube.location must be `face` or `node`. Found: {cube.location}." + ) + + if cube.shape[mesh_dim] != polydata_length: + raise ValueError( + f"The mesh on the cube and the polydata" + f"must have the same shape." + f" Found Mesh: {cube.shape[mesh_dim]}," + f" Polydata: {polydata_length}." + ) + + region_polydata = region.enclosed(polydata, **kwargs) + indices = region_polydata[indices_key] + if len(indices) == 0: + raise IndexError("No part of `polydata` falls within `region`.") + + my_tuple = tuple( + [slice(None) if i != mesh_dim else indices for i in range(cube.ndim)] + ) + + region_cube = cube[my_tuple] + + if recreate_mesh: + coords_on_mesh_dim = region_cube.coords(dimensions=mesh_dim) + new_mesh = MeshXY.from_coords( + *[c for c in coords_on_mesh_dim if c.has_bounds()] + ) + + new_mesh_coords = new_mesh.to_MeshCoords(cube.location) + + for coord in new_mesh_coords: + region_cube.remove_coord(coord.name()) + region_cube.add_aux_coord(coord, mesh_dim) + + # TODO: Support unstructured point based data without a mesh + else: + raise ValueError("Cube must have a mesh") + + return region_cube diff --git a/lib/iris/experimental/raster.py b/lib/iris/experimental/raster.py index ba7efc68b0..52ef2f651b 100644 --- a/lib/iris/experimental/raster.py +++ b/lib/iris/experimental/raster.py @@ -58,7 +58,7 @@ def _gdal_write_array(x_min, x_step, y_max, y_step, coord_system, data, fname, f coord_system : iris.coord_systems.CoordSystem Coordinate system for X and Y. data : numpy.ndarray - 2d array of values to export + 2d array of values to export. fname : str Output file name. ftype : str @@ -66,9 +66,7 @@ def _gdal_write_array(x_min, x_step, y_max, y_step, coord_system, data, fname, f Notes ----- - .. note:: - - Projection information is currently not written to the output. + Projection information is currently not written to the output. """ byte_order = data.dtype.str[0] @@ -109,14 +107,6 @@ def _gdal_write_array(x_min, x_step, y_max, y_step, coord_system, data, fname, f def export_geotiff(cube, fname): """Write cube data to raster file format as a PixelIsArea GeoTiff image. - .. deprecated:: 3.2.0 - - This method is scheduled to be removed in a future release, and no - replacement is currently planned. - If you make use of this functionality, please contact the Iris - Developers to discuss how to retain it (which could include reversing - the deprecation). - Parameters ---------- cube : Cube @@ -127,10 +117,16 @@ def export_geotiff(cube, fname): Notes ----- - .. note:: + For more details on GeoTiff specification and PixelIsArea, see: + https://www.remotesensing.org/geotiff/spec/geotiff2.5.html#2.5.2.2 + + .. deprecated:: 3.2.0 - For more details on GeoTiff specification and PixelIsArea, see: - https://www.remotesensing.org/geotiff/spec/geotiff2.5.html#2.5.2.2 + This method is scheduled to be removed in a future release, and no + replacement is currently planned. + If you make use of this functionality, please contact the Iris + Developers to discuss how to retain it (which could include reversing + the deprecation). """ wmsg = ( diff --git a/lib/iris/experimental/regrid.py b/lib/iris/experimental/regrid.py index c1d209cac0..4ffad43a2c 100644 --- a/lib/iris/experimental/regrid.py +++ b/lib/iris/experimental/regrid.py @@ -4,9 +4,9 @@ # See LICENSE in the root of the repository for full licensing details. """Regridding functions. -.. note:: - - .. deprecated:: 3.2.0 +Notes +----- +.. deprecated:: 3.2.0 This package will be removed in a future release. The PointInCell class has now moved to :class:`iris.analysis.PointInCell`. @@ -16,6 +16,7 @@ discuss how to replace it or to retain it. """ + import copy import functools import warnings @@ -57,33 +58,12 @@ def regrid_area_weighted_rectilinear_src_and_grid(src_cube, grid_cube, mdtol=0): mean of data values from src_grid regridded onto the horizontal grid of grid_cube. - .. note:: - - .. deprecated:: 3.2.0 - - This function is scheduled to be removed in a future release. - Please use :meth:`iris.cube.Cube.regrid` with the - :class:`iris.analysis.AreaWeighted` scheme instead : this is an exact - replacement. - - For example : - - .. code:: - - result = src_cube.regrid(grid_cube, AreaWeighted()) - This function requires that the horizontal grids of both cubes are rectilinear (i.e. expressed in terms of two orthogonal 1D coordinates) and that these grids are in the same coordinate system. This function also requires that the coordinates describing the horizontal grids all have bounds. - .. note:: - - Elements in data array of the returned cube that lie either partially - or entirely outside of the horizontal extent of the src_cube will - be masked irrespective of the value of mdtol. - Parameters ---------- src_cube : :class:`iris.cube.Cube` @@ -105,6 +85,25 @@ def regrid_area_weighted_rectilinear_src_and_grid(src_cube, grid_cube, mdtol=0): ------- A new :class:`iris.cube.Cube` instance. + Notes + ----- + Elements in data array of the returned cube that lie either partially + or entirely outside of the horizontal extent of the src_cube will + be masked irrespective of the value of mdtol. + + .. deprecated:: 3.2.0 + + This function is scheduled to be removed in a future release. + Please use :meth:`iris.cube.Cube.regrid` with the + :class:`iris.analysis.AreaWeighted` scheme instead : this is an exact + replacement. + + For example : + + .. code:: + + result = src_cube.regrid(grid_cube, AreaWeighted()) + """ wmsg = ( "The function " @@ -131,21 +130,6 @@ def regrid_weighted_curvilinear_to_rectilinear(src_cube, weights, grid_cube): mean of data values from :data:`src_cube` and the weights from :data:`weights` regridded onto the horizontal grid of :data:`grid_cube`. - .. note :: - - .. deprecated:: 3.2.0 - - This function is scheduled to be removed in a future release. - Please use :meth:`iris.cube.Cube.regrid` with the - :class:`iris.analysis.PointInCell` scheme instead : this is an exact - replacement. - - For example : - - .. code:: - - result = src_cube.regrid(grid_cube, PointInCell()) - This function requires that the :data:`src_cube` has a horizontal grid defined by a pair of X- and Y-axis coordinates which are mapped over the same cube dimensions, thus each point has an individually defined X and @@ -165,10 +149,10 @@ def regrid_weighted_curvilinear_to_rectilinear(src_cube, weights, grid_cube): :math:`\sum (src\_cube.data_{ij} * weights_{ij}) / \sum weights_{ij}`, for all :math:`ij` :data:`src_cube` points that are bound by that cell. - .. warning:: - - All coordinates that span the :data:`src_cube` that don't define - the horizontal curvilinear grid will be ignored. + Warnings + -------- + All coordinates that span the :data:`src_cube` that don't define + the horizontal curvilinear grid will be ignored. Parameters ---------- @@ -187,6 +171,21 @@ def regrid_weighted_curvilinear_to_rectilinear(src_cube, weights, grid_cube): ------- A :class:`iris.cube.Cube` instance. + Notes + ----- + .. deprecated:: 3.2.0 + + This function is scheduled to be removed in a future release. + Please use :meth:`iris.cube.Cube.regrid` with the + :class:`iris.analysis.PointInCell` scheme instead : this is an exact + replacement. + + For example : + + .. code:: + + result = src_cube.regrid(grid_cube, PointInCell()) + """ wmsg = ( "The function " @@ -341,7 +340,7 @@ def _regrid( projection, method, ): - """Regrids input data from the source to the target. Calculation is.""" + """Regrid input data from the source to the target. Calculation is.""" # Transform coordinates into the projection the interpolation will be # performed in. src_projection = src_x_coord.coord_system.as_cartopy_projection() @@ -622,9 +621,16 @@ def __init__(self, projection=None): Linear regridding scheme that uses scipy.interpolate.griddata on projected unstructured data. - .. note:: + Parameters + ---------- + projection : `cartopy.crs` instance, optional + The projection that the scipy calculation is performed in. + If None is given, a PlateCarree projection is used. Defaults to + None. - .. deprecated:: 3.2.0 + Notes + ----- + .. deprecated:: 3.2.0 This class is scheduled to be removed in a future release, and no replacement is currently planned. @@ -632,13 +638,6 @@ def __init__(self, projection=None): Developers to discuss how to retain it (which could include reversing the deprecation). - Parameters - ---------- - projection : `cartopy.crs instance`, optional - The projection that the scipy calculation is performed in. - If None is given, a PlateCarree projection is used. Defaults to - None. - """ self.projection = projection wmsg = ( @@ -696,7 +695,7 @@ class ProjectedUnstructuredNearest: The source cube and the target cube will be projected into a common projection for the scipy calculation to be performed. - .. Note:: + .. note:: The :class:`iris.analysis.UnstructuredNearest` scheme performs essentially the same job. That calculation is more rigorously correct and may be applied to larger data regions (including global). @@ -707,9 +706,16 @@ class ProjectedUnstructuredNearest: def __init__(self, projection=None): """Nearest regridding scheme that uses scipy.interpolate.griddata on projected unstructured data. - .. note:: + Parameters + ---------- + projection : `cartopy.crs instance`, optional + The projection that the scipy calculation is performed in. + If None is given, a PlateCarree projection is used. Defaults to + None. - .. deprecated:: 3.2.0 + Notes + ----- + .. deprecated:: 3.2.0 This class is scheduled to be removed in a future release, and no exact replacement is currently planned. @@ -718,13 +724,6 @@ def __init__(self, projection=None): contact the Iris Developers to discuss how to retain it (which could include reversing the deprecation). - Parameters - ---------- - projection : `cartopy.crs instance`, optional - The projection that the scipy calculation is performed in. - If None is given, a PlateCarree projection is used. Defaults to - None. - """ self.projection = projection wmsg = ( diff --git a/lib/iris/experimental/regrid_conservative.py b/lib/iris/experimental/regrid_conservative.py index e15b1c29a5..c4dbf965f8 100644 --- a/lib/iris/experimental/regrid_conservative.py +++ b/lib/iris/experimental/regrid_conservative.py @@ -4,9 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """Support for conservative regridding via ESMPy. -.. note:: - - .. deprecated:: 3.2.0 +.. deprecated:: 3.2.0 This package will be removed in a future release. Please use @@ -143,22 +141,6 @@ def _make_esmpy_field(x_coord, y_coord, ref_name="field", data=None, mask=None): def regrid_conservative_via_esmpy(source_cube, grid_cube): """Perform a conservative regridding with ESMPy. - .. note :: - - .. deprecated:: 3.2.0 - - This function is scheduled to be removed in a future release. - Please use - `iris-esmf-regrid `_ - instead. - - For example : - - .. code:: - - from emsf_regrid.schemes import ESMFAreaWeighted - result = src_cube.regrid(grid_cube, ESMFAreaWeighted()) - Regrids the data of a source cube onto a new grid defined by a destination cube. @@ -185,13 +167,10 @@ def regrid_conservative_via_esmpy(source_cube, grid_cube): the reference surfaces are also regridded, using ordinary bilinear interpolation. - .. note:: - - Both source and destination cubes must have two dimension coordinates - identified with axes 'X' and 'Y' which share a coord_system with a - Cartopy CRS. - The grids are defined by :meth:`iris.coords.Coord.contiguous_bounds` of - these. + Both source and destination cubes must have two dimension coordinates + identified with axes 'X' and 'Y' which share a coord_system with a + Cartopy CRS. The grids are defined by :meth:`iris.coords.Coord.contiguous_bounds` + of these. .. note:: @@ -200,6 +179,20 @@ def regrid_conservative_via_esmpy(source_cube, grid_cube): To alter this, make a prior call to ESMF.Manager(). + .. deprecated:: 3.2.0 + + This function is scheduled to be removed in a future release. + Please use + `iris-esmf-regrid `_ + instead. + + For example : + + .. code:: + + from emsf_regrid.schemes import ESMFAreaWeighted + result = src_cube.regrid(grid_cube, ESMFAreaWeighted()) + """ wmsg = ( "The function " diff --git a/lib/iris/experimental/representation.py b/lib/iris/experimental/representation.py index 4ffe176e3a..0648cc8e0d 100644 --- a/lib/iris/experimental/representation.py +++ b/lib/iris/experimental/representation.py @@ -209,13 +209,13 @@ def _make_row(self, title, body=None, col_span=0): Parameters ---------- - body : str, optional - Contains the content for each cell not in the left-most (title) column. - If None, indicates this row is a title row (see below). - title : stre, optional + title : str, optional Contains the row heading. If `body` is None, indicates that the row contains a sub-heading; e.g. 'Dimension coordinates:'. + body : str, optional + Contains the content for each cell not in the left-most (title) column. + If None, indicates this row is a title row (see below). col_span : int, default=0 Indicates how many columns the string should span. diff --git a/lib/iris/experimental/ugrid.py b/lib/iris/experimental/ugrid.py new file mode 100644 index 0000000000..7db26ca26b --- /dev/null +++ b/lib/iris/experimental/ugrid.py @@ -0,0 +1,155 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. + +"""Legacy import location for mesh support. + +See :mod:`iris.mesh` for the new, correct import location. + +Notes +----- +This import path alias is provided for backwards compatibility, but will be removed +in a future release : Please re-write code to import from the new module path. + +This legacy import module will be removed in a future release. +N.B. it does **not** need to wait for a major release, since the former API was +experimental. + +.. deprecated:: 3.10 + All the former :mod:`iris.experimental.mesh` modules have been relocated to + :mod:`iris.mesh` and its submodules. Please re-write code to import from the new + module path, and replace any 'iris.experimental.ugrid.Mesh' with + 'iris.mesh.MeshXY'. + + This import path alias is provided for backwards compatibility, but will be removed + in a future release : N.B. removing this does **not** need to wait for a major + release, since the API is experimental. + +""" + +from __future__ import annotations + +from contextlib import contextmanager +import threading + +from .._deprecation import warn_deprecated +from ..mesh import Connectivity as _Connectivity +from ..mesh import MeshCoord as _MeshCoord +from ..mesh import MeshXY as _MeshXY +from ..mesh import load_mesh, load_meshes, recombine_submeshes, save_mesh + + +# NOTE: publishing the original Mesh, MeshCoord and Connectivity here causes a Sphinx +# Sphinx warning, E.G.: +# "WARNING: duplicate object description of iris.mesh.Mesh, other instance +# in generated/api/iris.experimental.mesh, use :no-index: for one of them" +# For some reason, this only happens for the classes, and not the functions. +# +# This is a fatal problem, i.e. breaks the build since we are building with -W. +# We couldn't fix this with "autodoc_suppress_warnings", so the solution for now is to +# wrap the classes. Which is really ugly. +class Mesh(_MeshXY): + pass + + +class MeshCoord(_MeshCoord): + pass + + +class Connectivity(_Connectivity): + pass + + +class ParseUGridOnLoad(threading.local): + def __init__(self): + """Thead-safe state to enable UGRID-aware NetCDF loading. + + A flag for dictating whether to use the experimental UGRID-aware + version of Iris NetCDF loading. Object is thread-safe. + + Use via the run-time switch + :const:`~iris.mesh.load.PARSE_UGRID_ON_LOAD`. + Use :meth:`context` to temporarily activate. + + Notes + ----- + .. deprecated:: 1.10 + Do not use -- due to be removed at next major release : + UGRID loading is now **always** active for files containing a UGRID mesh. + + """ + + def __bool__(self): + return True + + @contextmanager + def context(self): + """Activate UGRID-aware NetCDF loading. + + Use the standard Iris loading API while within the context manager. If + the loaded file(s) include any UGRID content, this will be parsed and + attached to the resultant cube(s) accordingly. + + Use via the run-time switch + :const:`~iris.mesh.load.PARSE_UGRID_ON_LOAD`. + + For example:: + + with PARSE_UGRID_ON_LOAD.context(): + my_cube_list = iris.load([my_file_path, my_file_path2], + constraint=my_constraint, + callback=my_callback) + + Notes + ----- + .. deprecated:: 1.10 + Do not use -- due to be removed at next major release : + UGRID loading is now **always** active for files containing a UGRID mesh. + + Examples + -------- + Replace usage, for example: + + .. code-block:: python + + with iris.experimental.mesh.PARSE_UGRID_ON_LOAD.context(): + mesh_cubes = iris.load(path) + + with: + + .. code-block:: python + + mesh_cubes = iris.load(path) + + """ + wmsg = ( + "iris.experimental.mesh.load.PARSE_UGRID_ON_LOAD has been deprecated " + "and will be removed. Please remove all uses : these are no longer needed, " + "as UGRID loading is now applied to any file containing a mesh." + ) + warn_deprecated(wmsg) + yield + + +#: Run-time switch for experimental UGRID-aware NetCDF loading. See :class:`~iris.mesh.load.ParseUGridOnLoad`. +PARSE_UGRID_ON_LOAD = ParseUGridOnLoad() + + +__all__ = [ + "Connectivity", + "Mesh", + "MeshCoord", + "PARSE_UGRID_ON_LOAD", + "load_mesh", + "load_meshes", + "recombine_submeshes", + "save_mesh", +] + +warn_deprecated( + "All the former :mod:`iris.experimental.mesh` modules have been relocated to " + "module 'iris.mesh' and its submodules. " + "Please re-write code to import from the new module path, and replace any " + "'iris.experimental.ugrid.Mesh' with 'iris.mesh.MeshXY'." +) diff --git a/lib/iris/experimental/ugrid/cf.py b/lib/iris/experimental/ugrid/cf.py deleted file mode 100644 index 6897b4ca67..0000000000 --- a/lib/iris/experimental/ugrid/cf.py +++ /dev/null @@ -1,291 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. - -"""Extensions to Iris' CF variable representation to represent CF UGrid variables. - -Eventual destination: :mod:`iris.fileformats.cf`. - -""" -import warnings - -from ...fileformats import cf -from ...warnings import IrisCfLabelVarWarning, IrisCfMissingVarWarning -from .mesh import Connectivity - - -class CFUGridConnectivityVariable(cf.CFVariable): - """A CF_UGRID connectivity variable. - - A CF_UGRID connectivity variable points to an index variable identifying - for every element (edge/face/volume) the indices of its corner nodes. The - connectivity array will thus be a matrix of size n-elements x n-corners. - For the indexing one may use either 0- or 1-based indexing; the convention - used should be specified using a ``start_index`` attribute to the index - variable. - - For face elements: the corner nodes should be specified in anticlockwise - direction as viewed from above. For volume elements: use the - additional attribute ``volume_shape_type`` which points to a flag variable - that specifies for every volume its shape. - - Identified by a CF-netCDF variable attribute equal to any one of the values - in :attr:`~iris.experimental.ugrid.mesh.Connectivity.UGRID_CF_ROLES`. - - .. seealso:: - - The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ - - """ - - cf_identity = NotImplemented - cf_identities = Connectivity.UGRID_CF_ROLES - - @classmethod - def identify(cls, variables, ignore=None, target=None, warn=True): - result = {} - ignore, target = cls._identify_common(variables, ignore, target) - - # Identify all CF-UGRID connectivity variables. - for nc_var_name, nc_var in target.items(): - # Check for connectivity variable references, iterating through - # the valid cf roles. - for identity in cls.cf_identities: - nc_var_att = getattr(nc_var, identity, None) - - if nc_var_att is not None: - # UGRID only allows for one of each connectivity cf role. - name = nc_var_att.strip() - if name not in ignore: - if name not in variables: - message = ( - f"Missing CF-UGRID connectivity variable " - f"{name}, referenced by netCDF variable " - f"{nc_var_name}" - ) - if warn: - warnings.warn(message, category=IrisCfMissingVarWarning) - else: - # Restrict to non-string type i.e. not a - # CFLabelVariable. - if not cf._is_str_dtype(variables[name]): - result[name] = CFUGridConnectivityVariable( - name, variables[name] - ) - else: - message = ( - f"Ignoring variable {name}, identified " - f"as a CF-UGRID connectivity - is a " - f"CF-netCDF label variable." - ) - if warn: - warnings.warn( - message, category=IrisCfLabelVarWarning - ) - - return result - - -class CFUGridAuxiliaryCoordinateVariable(cf.CFVariable): - """A CF-UGRID auxiliary coordinate variable. - - A CF-UGRID auxiliary coordinate variable is a CF-netCDF auxiliary - coordinate variable representing the element (node/edge/face/volume) - locations (latitude, longitude or other spatial coordinates, and optional - elevation or other coordinates). These auxiliary coordinate variables will - have length n-elements. - - For elements other than nodes, these auxiliary coordinate variables may - have in turn a ``bounds`` attribute that specifies the bounding coordinates - of the element (thereby duplicating the data in the ``node_coordinates`` - variables). - - Identified by the CF-netCDF variable attribute - ``node_``/``edge_``/``face_``/``volume_coordinates``. - - .. seealso:: - - The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ - - """ - - cf_identity = NotImplemented - cf_identities = [ - "node_coordinates", - "edge_coordinates", - "face_coordinates", - "volume_coordinates", - ] - - @classmethod - def identify(cls, variables, ignore=None, target=None, warn=True): - result = {} - ignore, target = cls._identify_common(variables, ignore, target) - - # Identify any CF-UGRID-relevant auxiliary coordinate variables. - for nc_var_name, nc_var in target.items(): - # Check for UGRID auxiliary coordinate variable references. - for identity in cls.cf_identities: - nc_var_att = getattr(nc_var, identity, None) - - if nc_var_att is not None: - for name in nc_var_att.split(): - if name not in ignore: - if name not in variables: - message = ( - f"Missing CF-netCDF auxiliary coordinate " - f"variable {name}, referenced by netCDF " - f"variable {nc_var_name}" - ) - if warn: - warnings.warn( - message, - category=IrisCfMissingVarWarning, - ) - else: - # Restrict to non-string type i.e. not a - # CFLabelVariable. - if not cf._is_str_dtype(variables[name]): - result[name] = CFUGridAuxiliaryCoordinateVariable( - name, variables[name] - ) - else: - message = ( - f"Ignoring variable {name}, " - f"identified as a CF-netCDF " - f"auxiliary coordinate - is a " - f"CF-netCDF label variable." - ) - if warn: - warnings.warn( - message, - category=IrisCfLabelVarWarning, - ) - - return result - - -class CFUGridMeshVariable(cf.CFVariable): - """A CF-UGRID mesh variable is a dummy variable for storing topology information as attributes. - - A CF-UGRID mesh variable is a dummy variable for storing topology - information as attributes. The mesh variable has the ``cf_role`` - 'mesh_topology'. - - The UGRID conventions describe define the mesh topology as the - interconnection of various geometrical elements of the mesh. The pure - interconnectivity is independent of georeferencing the individual - geometrical elements, but for the practical applications for which the - UGRID CF extension is defined, coordinate data will always be added. - - Identified by the CF-netCDF variable attribute 'mesh'. - - .. seealso:: - - The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ - - """ - - cf_identity = "mesh" - - @classmethod - def identify(cls, variables, ignore=None, target=None, warn=True): - result = {} - ignore, target = cls._identify_common(variables, ignore, target) - - # Identify all CF-UGRID mesh variables. - all_vars = target == variables - for nc_var_name, nc_var in target.items(): - if all_vars: - # SPECIAL BEHAVIOUR FOR MESH VARIABLES. - # We are looking for all mesh variables. Check if THIS variable - # is a mesh using its own attributes. - if getattr(nc_var, "cf_role", "") == "mesh_topology": - result[nc_var_name] = CFUGridMeshVariable(nc_var_name, nc_var) - - # Check for mesh variable references. - nc_var_att = getattr(nc_var, cls.cf_identity, None) - - if nc_var_att is not None: - # UGRID only allows for 1 mesh per variable. - name = nc_var_att.strip() - if name not in ignore: - if name not in variables: - message = ( - f"Missing CF-UGRID mesh variable {name}, " - f"referenced by netCDF variable {nc_var_name}" - ) - if warn: - warnings.warn(message, category=IrisCfMissingVarWarning) - else: - # Restrict to non-string type i.e. not a - # CFLabelVariable. - if not cf._is_str_dtype(variables[name]): - result[name] = CFUGridMeshVariable(name, variables[name]) - else: - message = ( - f"Ignoring variable {name}, identified as a " - f"CF-UGRID mesh - is a CF-netCDF label " - f"variable." - ) - if warn: - warnings.warn(message, category=IrisCfLabelVarWarning) - - return result - - -class CFUGridGroup(cf.CFGroup): - """Represents a collection of CF Metadata Conventions variables and netCDF global attributes. - - Represents a collection of 'NetCDF Climate and Forecast (CF) Metadata - Conventions' variables and netCDF global attributes. - - Specialisation of :class:`~iris.fileformats.cf.CFGroup` that includes extra - collections for CF-UGRID-specific variable types. - - """ - - @property - def connectivities(self): - """Collection of CF-UGRID connectivity variables.""" - return self._cf_getter(CFUGridConnectivityVariable) - - @property - def ugrid_coords(self): - """Collection of CF-UGRID-relevant auxiliary coordinate variables.""" - return self._cf_getter(CFUGridAuxiliaryCoordinateVariable) - - @property - def meshes(self): - """Collection of CF-UGRID mesh variables.""" - return self._cf_getter(CFUGridMeshVariable) - - @property - def non_data_variable_names(self): - """:class:`set` of names of the CF-netCDF/CF-UGRID variables that are not the data pay-load.""" - extra_variables = (self.connectivities, self.ugrid_coords, self.meshes) - extra_result = set() - for variable in extra_variables: - extra_result |= set(variable) - return super().non_data_variable_names | extra_result - - -class CFUGridReader(cf.CFReader): - """Allows the contents of a netCDF file to be. - - This class allows the contents of a netCDF file to be interpreted according - to the 'NetCDF Climate and Forecast (CF) Metadata Conventions'. - - Specialisation of :class:`~iris.fileformats.cf.CFReader` that can also - handle CF-UGRID-specific variable types. - - """ - - _variable_types = cf.CFReader._variable_types + ( - CFUGridConnectivityVariable, - CFUGridAuxiliaryCoordinateVariable, - CFUGridMeshVariable, - ) - - CFGroup = CFUGridGroup diff --git a/lib/iris/experimental/ugrid/metadata.py b/lib/iris/experimental/ugrid/metadata.py deleted file mode 100644 index 8969ab72a1..0000000000 --- a/lib/iris/experimental/ugrid/metadata.py +++ /dev/null @@ -1,397 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. - -"""The common metadata API classes for :mod:`iris.experimental.ugrid.mesh`. - -Eventual destination: :mod:`iris.common.metadata`. - -""" -from functools import wraps - -from ...common import BaseMetadata -from ...common.lenient import _lenient_service as lenient_service -from ...common.metadata import ( - SERVICES, - SERVICES_COMBINE, - SERVICES_DIFFERENCE, - SERVICES_EQUAL, -) - - -class ConnectivityMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.experimental.ugrid.mesh.Connectivity`.""" - - # The "location_axis" member is stateful only, and does not participate in - # lenient/strict equivalence. - _members = ("cf_role", "start_index", "location_axis") - - __slots__ = () - - @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) - @lenient_service - def __eq__(self, other): - return super().__eq__(other) - - def _combine_lenient(self, other): - """Perform lenient combination of metadata members for connectivities. - - Parameters - ---------- - other : ConnectivityMetadata - The other connectivity metadata participating in the lenient - combination. - - Returns - ------- - A list of combined metadata member values. - - """ - - # Perform "strict" combination for "cf_role", "start_index", "location_axis". - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return left if left == right else None - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in ConnectivityMetadata._members] - # Perform lenient combination of the other parent members. - result = super()._combine_lenient(other) - result.extend(values) - - return result - - def _compare_lenient(self, other): - """Perform lenient equality of metadata members for connectivities. - - Parameters - ---------- - other : ConnectivityMetadata - The other connectivity metadata participating in the lenient - comparison. - - Returns - ------- - bool - - """ - # Perform "strict" comparison for "cf_role", "start_index". - # The "location_axis" member is not part of lenient equivalence. - members = filter( - lambda member: member != "location_axis", - ConnectivityMetadata._members, - ) - result = all( - [getattr(self, field) == getattr(other, field) for field in members] - ) - if result: - # Perform lenient comparison of the other parent members. - result = super()._compare_lenient(other) - - return result - - def _difference_lenient(self, other): - """Perform lenient difference of metadata members for connectivities. - - Parameters - ---------- - other : ConnectivityMetadata - The other connectivity metadata participating in the lenient - difference. - - Returns - ------- - A list of difference metadata member values. - - """ - - # Perform "strict" difference for "cf_role", "start_index", "location_axis". - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return None if left == right else (left, right) - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in ConnectivityMetadata._members] - # Perform lenient difference of the other parent members. - result = super()._difference_lenient(other) - result.extend(values) - - return result - - @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) - @lenient_service - def combine(self, other, lenient=None): - return super().combine(other, lenient=lenient) - - @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) - @lenient_service - def difference(self, other, lenient=None): - return super().difference(other, lenient=lenient) - - @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) - @lenient_service - def equal(self, other, lenient=None): - return super().equal(other, lenient=lenient) - - -class MeshMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.experimental.ugrid.mesh.Mesh`.""" - - # The node_dimension", "edge_dimension" and "face_dimension" members are - # stateful only; they not participate in lenient/strict equivalence. - _members = ( - "topology_dimension", - "node_dimension", - "edge_dimension", - "face_dimension", - ) - - __slots__ = () - - @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) - @lenient_service - def __eq__(self, other): - return super().__eq__(other) - - def _combine_lenient(self, other): - """Perform lenient combination of metadata members for meshes. - - Parameters - ---------- - other : MeshMetadata - The other mesh metadata participating in the lenient - combination. - - Returns - ------- - A list of combined metadata member values. - - """ - - # Perform "strict" combination for "topology_dimension", - # "node_dimension", "edge_dimension" and "face_dimension". - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return left if left == right else None - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in MeshMetadata._members] - # Perform lenient combination of the other parent members. - result = super()._combine_lenient(other) - result.extend(values) - - return result - - def _compare_lenient(self, other): - """Perform lenient equality of metadata members for meshes. - - Parameters - ---------- - other : MeshMetadata - The other mesh metadata participating in the lenient - comparison. - - Returns - ------- - bool - - """ - # Perform "strict" comparison for "topology_dimension". - # "node_dimension", "edge_dimension" and "face_dimension" are not part - # of lenient equivalence at all. - result = self.topology_dimension == other.topology_dimension - if result: - # Perform lenient comparison of the other parent members. - result = super()._compare_lenient(other) - - return result - - def _difference_lenient(self, other): - """Perform lenient difference of metadata members for meshes. - - Parameters - ---------- - other : MeshMetadata - The other mesh metadata participating in the lenient - difference. - - Returns - ------- - A list of difference metadata member values. - - """ - - # Perform "strict" difference for "topology_dimension", - # "node_dimension", "edge_dimension" and "face_dimension". - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return None if left == right else (left, right) - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in MeshMetadata._members] - # Perform lenient difference of the other parent members. - result = super()._difference_lenient(other) - result.extend(values) - - return result - - @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) - @lenient_service - def combine(self, other, lenient=None): - return super().combine(other, lenient=lenient) - - @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) - @lenient_service - def difference(self, other, lenient=None): - return super().difference(other, lenient=lenient) - - @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) - @lenient_service - def equal(self, other, lenient=None): - return super().equal(other, lenient=lenient) - - -class MeshCoordMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.coords.MeshCoord`.""" - - _members = ("location", "axis") - # NOTE: in future, we may add 'mesh' as part of this metadata, - # as the Mesh seems part of the 'identity' of a MeshCoord. - # For now we omit it, particularly as we don't yet implement Mesh.__eq__. - # - # Thus, for now, the MeshCoord class will need to handle 'mesh' explicitly - # in identity / comparison, but in future that may be simplified. - - __slots__ = () - - @wraps(BaseMetadata.__eq__, assigned=("__doc__",), updated=()) - @lenient_service - def __eq__(self, other): - return super().__eq__(other) - - def _combine_lenient(self, other): - """Perform lenient combination of metadata members for MeshCoord. - - Parameters - ---------- - other : MeshCoordMetadata - The other metadata participating in the lenient combination. - - Returns - ------- - A list of combined metadata member values. - - """ - - # It is actually "strict" : return None except where members are equal. - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return left if left == right else None - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in self._members] - # Perform lenient combination of the other parent members. - result = super()._combine_lenient(other) - result.extend(values) - - return result - - def _compare_lenient(self, other): - """Perform lenient equality of metadata members for MeshCoord. - - Parameters - ---------- - other : MeshCoordMetadata - The other metadata participating in the lenient comparison. - - Returns - ------- - bool - - """ - # Perform "strict" comparison for the MeshCoord specific members - # 'location', 'axis' : for equality, they must all match. - result = all( - [getattr(self, field) == getattr(other, field) for field in self._members] - ) - if result: - # Perform lenient comparison of the other parent members. - result = super()._compare_lenient(other) - - return result - - def _difference_lenient(self, other): - """Perform lenient difference of metadata members for MeshCoord. - - Parameters - ---------- - other : MeshCoordMetadata - The other MeshCoord metadata participating in the lenient - difference. - - Returns - ------- - A list of different metadata member values. - - """ - - # Perform "strict" difference for location / axis. - def func(field): - left = getattr(self, field) - right = getattr(other, field) - return None if left == right else (left, right) - - # Note that, we use "_members" not "_fields". - values = [func(field) for field in self._members] - # Perform lenient difference of the other parent members. - result = super()._difference_lenient(other) - result.extend(values) - - return result - - @wraps(BaseMetadata.combine, assigned=("__doc__",), updated=()) - @lenient_service - def combine(self, other, lenient=None): - return super().combine(other, lenient=lenient) - - @wraps(BaseMetadata.difference, assigned=("__doc__",), updated=()) - @lenient_service - def difference(self, other, lenient=None): - return super().difference(other, lenient=lenient) - - @wraps(BaseMetadata.equal, assigned=("__doc__",), updated=()) - @lenient_service - def equal(self, other, lenient=None): - return super().equal(other, lenient=lenient) - - -# Add our new optional metadata operations into the 'convenience collections' -# of lenient metadata services. -# TODO: when included in 'iris.common.metadata', install each one directly ? -_op_names_and_service_collections = [ - ("combine", SERVICES_COMBINE), - ("difference", SERVICES_DIFFERENCE), - ("__eq__", SERVICES_EQUAL), - ("equal", SERVICES_EQUAL), -] -_metadata_classes = [ConnectivityMetadata, MeshMetadata, MeshCoordMetadata] -for _cls in _metadata_classes: - for _name, _service_collection in _op_names_and_service_collections: - _method = getattr(_cls, _name) - _service_collection.append(_method) - SERVICES.append(_method) - -del ( - _op_names_and_service_collections, - _metadata_classes, - _cls, - _name, - _service_collection, - _method, -) diff --git a/lib/iris/experimental/ugrid/save.py b/lib/iris/experimental/ugrid/save.py deleted file mode 100644 index 40d1c42e90..0000000000 --- a/lib/iris/experimental/ugrid/save.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. - -"""Extension to Iris' NetCDF saving to allow :class:`~iris.experimental.ugrid.mesh.Mesh` saving in UGRID format. - -Eventual destination: :mod:`iris.fileformats.netcdf`. - -""" -from collections.abc import Iterable - -from ...fileformats import netcdf - - -def save_mesh(mesh, filename, netcdf_format="NETCDF4"): - """Save mesh(es) to a netCDF file. - - Parameters - ---------- - mesh : :class:`iris.experimental.ugrid.Mesh` or iterable - Mesh(es) to save. - filename : str - Name of the netCDF file to create. - netcdf_format : str, default="NETCDF4" - Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', - 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. - - """ - # TODO: integrate with standard saving API when no longer 'experimental'. - - if isinstance(mesh, Iterable): - meshes = mesh - else: - meshes = [mesh] - - # Initialise Manager for saving - with netcdf.Saver(filename, netcdf_format) as sman: - # Iterate through the list. - for mesh in meshes: - # Get suitable dimension names. - mesh_dimensions, _ = sman._get_dim_names(mesh) - - # Create dimensions. - sman._create_cf_dimensions(cube=None, dimension_names=mesh_dimensions) - - # Create the mesh components. - sman._add_mesh(mesh) - - # Add a conventions attribute. - # TODO: add 'UGRID' to conventions, when this is agreed with CF ? - sman.update_global_attributes(Conventions=netcdf.CF_CONVENTIONS_VERSION) diff --git a/lib/iris/fileformats/_ff.py b/lib/iris/fileformats/_ff.py index 18c1aa766e..b6b45b8b3c 100644 --- a/lib/iris/fileformats/_ff.py +++ b/lib/iris/fileformats/_ff.py @@ -5,6 +5,7 @@ """Provides UK Met Office Fields File (FF) format specific capabilities.""" import os +from typing import Any import warnings import numpy as np @@ -370,9 +371,22 @@ def __init__(self, filename, word_depth=DEFAULT_FF_WORD_DEPTH): setattr(self, elem, res) def __str__(self): + def _str_tuple(to_print: Any): + """Print NumPy scalars within tuples as numbers, not np objects. + + E.g. ``lookup_table`` is a tuple of NumPy scalars. + NumPy v2 by default prints ``np.int32(1)`` instead of ``1`` when + printing an iterable of scalars. + """ + if isinstance(to_print, tuple): + result = "(" + ", ".join([str(i) for i in to_print]) + ")" + else: + result = str(to_print) + return result + attributes = [] for name, _ in FF_HEADER: - attributes.append(" {}: {}".format(name, getattr(self, name))) + attributes.append(f" {name}: {_str_tuple(getattr(self, name))}") return "FF Header:\n" + "\n".join(attributes) def __repr__(self): @@ -841,9 +855,9 @@ def load_cubes(filenames, callback, constraints=None): Parameters ---------- filenames : - List of fields files filenames to load + List of fields files filenames to load. callback : - A function which can be passed on to :func:`iris.io.run_callback` + A function which can be passed on to :func:`iris.io.run_callback`. Notes ----- @@ -864,8 +878,8 @@ def load_cubes_32bit_ieee(filenames, callback, constraints=None): See Also -------- - :func:`load_cubes` - For keyword details + :func:`load_cubes` : + For keyword details. """ return pp._load_cubes_variable_loader( diff --git a/lib/iris/fileformats/_ff_cross_references.py b/lib/iris/fileformats/_ff_cross_references.py index b060ed42e9..6e9ce16363 100644 --- a/lib/iris/fileformats/_ff_cross_references.py +++ b/lib/iris/fileformats/_ff_cross_references.py @@ -2,9 +2,9 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -""" -Table providing UM grid-code, field-code and pseudolevel-type for (some) -stash codes. Used in UM file i/o. +"""Table providing UM grid-code, field-code and pseudolevel-type for (some) stash codes. + +Used in UM file i/o. """ diff --git a/lib/iris/fileformats/_nc_load_rules/engine.py b/lib/iris/fileformats/_nc_load_rules/engine.py index 111e8320b6..48092508a4 100644 --- a/lib/iris/fileformats/_nc_load_rules/engine.py +++ b/lib/iris/fileformats/_nc_load_rules/engine.py @@ -18,6 +18,7 @@ used in :meth:`iris.fileformats.netcdf._actions_activation_stats`. """ + from .actions import run_actions diff --git a/lib/iris/fileformats/_nc_load_rules/helpers.py b/lib/iris/fileformats/_nc_load_rules/helpers.py index dc68274a36..faf40ad210 100644 --- a/lib/iris/fileformats/_nc_load_rules/helpers.py +++ b/lib/iris/fileformats/_nc_load_rules/helpers.py @@ -13,6 +13,7 @@ build routines, and which it does not use. """ + from __future__ import annotations import re @@ -40,7 +41,6 @@ if TYPE_CHECKING: from numpy.ma import MaskedArray - from numpy.typing import ArrayLike from iris.fileformats.cf import CFBoundaryVariable @@ -202,11 +202,11 @@ _CM_INTERVAL = "interval" _CM_METHOD = "method" _CM_NAME = "name" -_CM_PARSE_NAME = re.compile(r"([\w_]+\s*?:\s+)+") +_CM_PARSE_NAME = re.compile(r"([\w_]+\s*?:\s*)+") _CM_PARSE = re.compile( r""" - (?P([\w_]+\s*?:\s+)+) - (?P[\w_\s]+(?![\w_]*\s*?:))\s* + (?P([\w_]+\s*?:\s*)+) + (?P[^\s][\w_\s]+(?![\w_]*\s*?:))\s* (?: \(\s* (?P.+) @@ -282,7 +282,7 @@ def _split_cell_methods(nc_cell_methods: str) -> List[re.Match]: Returns ------- nc_cell_methods_matches: list of re.Match objects - A list of re.Match objects associated with each parsed cell method + A list of re.Match objects associated with each parsed cell method. Notes ----- @@ -296,6 +296,12 @@ def _split_cell_methods(nc_cell_methods: str) -> List[re.Match]: for m in _CM_PARSE_NAME.finditer(nc_cell_methods): name_start_inds.append(m.start()) + # No matches? Must be malformed cell_method string; warn and return + if not name_start_inds: + msg = f"Failed to parse cell method string: {nc_cell_methods}" + warnings.warn(msg, category=iris.warnings.IrisCfLoadWarning, stacklevel=2) + return [] + # Remove those that fall inside brackets bracket_depth = 0 for ind, cha in enumerate(nc_cell_methods): @@ -522,7 +528,7 @@ def _get_ellipsoid(cf_grid_var): if datum == "unknown": datum = None - if not iris.FUTURE.datum_support: + if datum is not None and not iris.FUTURE.datum_support: wmsg = ( "Ignoring a datum in netCDF load for consistency with existing " "behaviour. In a future version of Iris, this datum will be " @@ -1036,7 +1042,9 @@ def reorder_bounds_data(bounds_data, cf_bounds_var, cf_coord_var): ################################################################################ def _normalise_bounds_units( - points_units: str, cf_bounds_var: CFBoundaryVariable, bounds_data: ArrayLike + points_units: str | None, + cf_bounds_var: CFBoundaryVariable, + bounds_data: MaskedArray, ) -> Optional[MaskedArray]: """Ensure bounds have units compatible with points. @@ -1063,26 +1071,27 @@ def _normalise_bounds_units( """ bounds_units = get_attr_units(cf_bounds_var, {}) + result: MaskedArray | None = bounds_data if bounds_units != UNKNOWN_UNIT_STRING: - points_units = cf_units.Unit(points_units) - bounds_units = cf_units.Unit(bounds_units) + p_units = cf_units.Unit(points_units) + b_units = cf_units.Unit(bounds_units) - if bounds_units != points_units: - if bounds_units.is_convertible(points_units): - bounds_data = bounds_units.convert(bounds_data, points_units) + if b_units != p_units: + if b_units.is_convertible(p_units): + result = b_units.convert(bounds_data, p_units) else: wmsg = ( f"Ignoring bounds on NetCDF variable {cf_bounds_var.cf_name!r}. " - f"Expected units compatible with {points_units.origin!r}, got " - f"{bounds_units.origin!r}." + f"Expected units compatible with {p_units.origin!r}, got " + f"{b_units.origin!r}." ) warnings.warn( wmsg, category=iris.warnings.IrisCfLoadWarning, stacklevel=2 ) - bounds_data = None + result = None - return bounds_data + return result ################################################################################ diff --git a/lib/iris/fileformats/_structured_array_identification.py b/lib/iris/fileformats/_structured_array_identification.py index 8dada77458..0f386e9815 100644 --- a/lib/iris/fileformats/_structured_array_identification.py +++ b/lib/iris/fileformats/_structured_array_identification.py @@ -300,7 +300,7 @@ class GroupStructure: """ def __init__(self, length, component_structure, array_order="c"): - """group_component_to_array - a dictionary. See also TODO.""" + """Group_component_to_array - a dictionary. See also TODO.""" #: The size common to all of the original arrays and used to determine #: possible shape configurations. self.length = length diff --git a/lib/iris/fileformats/abf.py b/lib/iris/fileformats/abf.py index 6dd8dfd14f..1ac95a42eb 100644 --- a/lib/iris/fileformats/abf.py +++ b/lib/iris/fileformats/abf.py @@ -200,9 +200,9 @@ def load_cubes(filespecs, callback=None): Parameters ---------- filenames : - List of ABF filenames to load + List of ABF filenames to load. callback : optional - A function that can be passed to :func:`iris.io.run_callback` + A function that can be passed to :func:`iris.io.run_callback`. Notes ----- diff --git a/lib/iris/fileformats/cf.py b/lib/iris/fileformats/cf.py index 0dc505d522..e7b0d8063e 100644 --- a/lib/iris/fileformats/cf.py +++ b/lib/iris/fileformats/cf.py @@ -18,14 +18,17 @@ from collections.abc import Iterable, MutableMapping import os import re +from typing import ClassVar, Optional import warnings import numpy as np import numpy.ma as ma from iris.fileformats.netcdf import _thread_safe_nc +from iris.mesh.components import Connectivity import iris.util import iris.warnings +from iris.warnings import IrisCfLabelVarWarning, IrisCfMissingVarWarning # # CF parse pattern common to both formula terms and measure CF variables. @@ -71,7 +74,7 @@ class CFVariable(metaclass=ABCMeta): #: Name of the netCDF variable attribute that identifies this #: CF-netCDF variable. - cf_identity = None + cf_identity: ClassVar[str | None] = None def __init__(self, name, data): # Accessing the list of netCDF attributes is surprisingly slow. @@ -888,6 +891,226 @@ def identify(cls, variables, ignore=None, target=None, warn=True): return result +class CFUGridConnectivityVariable(CFVariable): + """A CF_UGRID connectivity variable. + + A CF_UGRID connectivity variable points to an index variable identifying + for every element (edge/face/volume) the indices of its corner nodes. The + connectivity array will thus be a matrix of size n-elements x n-corners. + For the indexing one may use either 0- or 1-based indexing; the convention + used should be specified using a ``start_index`` attribute to the index + variable. + + For face elements: the corner nodes should be specified in anticlockwise + direction as viewed from above. For volume elements: use the + additional attribute ``volume_shape_type`` which points to a flag variable + that specifies for every volume its shape. + + Identified by a CF-netCDF variable attribute equal to any one of the values + in :attr:`~iris.mesh.Connectivity.UGRID_CF_ROLES`. + + .. seealso:: + + The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ + + """ + + cf_identity = NotImplemented + cf_identities = Connectivity.UGRID_CF_ROLES + + @classmethod + def identify(cls, variables, ignore=None, target=None, warn=True): + result = {} + ignore, target = cls._identify_common(variables, ignore, target) + + # Identify all CF-UGRID connectivity variables. + for nc_var_name, nc_var in target.items(): + # Check for connectivity variable references, iterating through + # the valid cf roles. + for identity in cls.cf_identities: + nc_var_att = getattr(nc_var, identity, None) + + if nc_var_att is not None: + # UGRID only allows for one of each connectivity cf role. + name = nc_var_att.strip() + if name not in ignore: + if name not in variables: + message = ( + f"Missing CF-UGRID connectivity variable " + f"{name}, referenced by netCDF variable " + f"{nc_var_name}" + ) + if warn: + warnings.warn(message, category=IrisCfMissingVarWarning) + else: + # Restrict to non-string type i.e. not a + # CFLabelVariable. + if not _is_str_dtype(variables[name]): + result[name] = CFUGridConnectivityVariable( + name, variables[name] + ) + else: + message = ( + f"Ignoring variable {name}, identified " + f"as a CF-UGRID connectivity - is a " + f"CF-netCDF label variable." + ) + if warn: + warnings.warn( + message, category=IrisCfLabelVarWarning + ) + + return result + + +class CFUGridAuxiliaryCoordinateVariable(CFVariable): + """A CF-UGRID auxiliary coordinate variable. + + A CF-UGRID auxiliary coordinate variable is a CF-netCDF auxiliary + coordinate variable representing the element (node/edge/face/volume) + locations (latitude, longitude or other spatial coordinates, and optional + elevation or other coordinates). These auxiliary coordinate variables will + have length n-elements. + + For elements other than nodes, these auxiliary coordinate variables may + have in turn a ``bounds`` attribute that specifies the bounding coordinates + of the element (thereby duplicating the data in the ``node_coordinates`` + variables). + + Identified by the CF-netCDF variable attribute + ``node_``/``edge_``/``face_``/``volume_coordinates``. + + .. seealso:: + + The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ + + """ + + cf_identity = NotImplemented + cf_identities = [ + "node_coordinates", + "edge_coordinates", + "face_coordinates", + "volume_coordinates", + ] + + @classmethod + def identify(cls, variables, ignore=None, target=None, warn=True): + result = {} + ignore, target = cls._identify_common(variables, ignore, target) + + # Identify any CF-UGRID-relevant auxiliary coordinate variables. + for nc_var_name, nc_var in target.items(): + # Check for UGRID auxiliary coordinate variable references. + for identity in cls.cf_identities: + nc_var_att = getattr(nc_var, identity, None) + + if nc_var_att is not None: + for name in nc_var_att.split(): + if name not in ignore: + if name not in variables: + message = ( + f"Missing CF-netCDF auxiliary coordinate " + f"variable {name}, referenced by netCDF " + f"variable {nc_var_name}" + ) + if warn: + warnings.warn( + message, + category=IrisCfMissingVarWarning, + ) + else: + # Restrict to non-string type i.e. not a + # CFLabelVariable. + if not _is_str_dtype(variables[name]): + result[name] = CFUGridAuxiliaryCoordinateVariable( + name, variables[name] + ) + else: + message = ( + f"Ignoring variable {name}, " + f"identified as a CF-netCDF " + f"auxiliary coordinate - is a " + f"CF-netCDF label variable." + ) + if warn: + warnings.warn( + message, + category=IrisCfLabelVarWarning, + ) + + return result + + +class CFUGridMeshVariable(CFVariable): + """A CF-UGRID mesh variable is a dummy variable for storing topology information as attributes. + + A CF-UGRID mesh variable is a dummy variable for storing topology + information as attributes. The mesh variable has the ``cf_role`` + 'mesh_topology'. + + The UGRID conventions describe define the mesh topology as the + interconnection of various geometrical elements of the mesh. The pure + interconnectivity is independent of georeferencing the individual + geometrical elements, but for the practical applications for which the + UGRID CF extension is defined, coordinate data will always be added. + + Identified by the CF-netCDF variable attribute 'mesh'. + + .. seealso:: + + The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ + + """ + + cf_identity = "mesh" + + @classmethod + def identify(cls, variables, ignore=None, target=None, warn=True): + result = {} + ignore, target = cls._identify_common(variables, ignore, target) + + # Identify all CF-UGRID mesh variables. + all_vars = target == variables + for nc_var_name, nc_var in target.items(): + if all_vars: + # SPECIAL BEHAVIOUR FOR MESH VARIABLES. + # We are looking for all mesh variables. Check if THIS variable + # is a mesh using its own attributes. + if getattr(nc_var, "cf_role", "") == "mesh_topology": + result[nc_var_name] = CFUGridMeshVariable(nc_var_name, nc_var) + + # Check for mesh variable references. + nc_var_att = getattr(nc_var, cls.cf_identity, None) + + if nc_var_att is not None: + # UGRID only allows for 1 mesh per variable. + name = nc_var_att.strip() + if name not in ignore: + if name not in variables: + message = ( + f"Missing CF-UGRID mesh variable {name}, " + f"referenced by netCDF variable {nc_var_name}" + ) + if warn: + warnings.warn(message, category=IrisCfMissingVarWarning) + else: + # Restrict to non-string type i.e. not a + # CFLabelVariable. + if not _is_str_dtype(variables[name]): + result[name] = CFUGridMeshVariable(name, variables[name]) + else: + message = ( + f"Ignoring variable {name}, identified as a " + f"CF-UGRID mesh - is a CF-netCDF label " + f"variable." + ) + if warn: + warnings.warn(message, category=IrisCfLabelVarWarning) + + return result + + ################################################################################ class CFGroup(MutableMapping): """Collection of 'NetCDF CF Metadata Conventions variables and netCDF global attributes. @@ -979,12 +1202,30 @@ def non_data_variable_names(self): self.grid_mappings, self.labels, self.cell_measures, + self.connectivities, + self.ugrid_coords, + self.meshes, ) result = set() for variable in non_data_variables: result |= set(variable) return result + @property + def connectivities(self): + """Collection of CF-UGRID connectivity variables.""" + return self._cf_getter(CFUGridConnectivityVariable) + + @property + def ugrid_coords(self): + """Collection of CF-UGRID-relevant auxiliary coordinate variables.""" + return self._cf_getter(CFUGridAuxiliaryCoordinateVariable) + + @property + def meshes(self): + """Collection of CF-UGRID mesh variables.""" + return self._cf_getter(CFUGridMeshVariable) + def keys(self): """Return the names of all the CF-netCDF variables in the group.""" return self._cf_variables.keys() @@ -1053,9 +1294,11 @@ class CFReader: CFGridMappingVariable, CFLabelVariable, CFMeasureVariable, + CFUGridConnectivityVariable, + CFUGridAuxiliaryCoordinateVariable, + CFUGridMeshVariable, ) - # TODO: remove once iris.experimental.ugrid.CFUGridReader is folded in. CFGroup = CFGroup def __init__(self, file_source, warn=False, monotonic=False): @@ -1088,6 +1331,11 @@ def __init__(self, file_source, warn=False, monotonic=False): self._check_monotonic = monotonic + self._with_ugrid = True + if not self._has_meshes(): + self._trim_ugrid_variable_types() + self._with_ugrid = False + self._translate() self._build_cf_groups() self._reset() @@ -1105,6 +1353,25 @@ def __exit__(self, exc_type, exc_value, traceback): # When used as a context-manager, **always** close the file on exit. self._close() + def _has_meshes(self): + result = False + for variable in self._dataset.variables.values(): + if hasattr(variable, "mesh") or hasattr(variable, "node_coordinates"): + result = True + break + return result + + def _trim_ugrid_variable_types(self): + self._variable_types = ( + CFAncillaryDataVariable, + CFAuxiliaryCoordinateVariable, + CFBoundaryVariable, + CFClimatologyVariable, + CFGridMappingVariable, + CFLabelVariable, + CFMeasureVariable, + ) + @property def filename(self): """The file that the CFReader is reading.""" @@ -1172,9 +1439,7 @@ def _build_cf_groups(self): """Build the first order relationships between CF-netCDF variables.""" def _build(cf_variable): - # TODO: isinstance(cf_variable, UGridMeshVariable) - # UGridMeshVariable currently in experimental.ugrid - circular import. - is_mesh_var = cf_variable.cf_identity == "mesh" + is_mesh_var = isinstance(cf_variable, CFUGridMeshVariable) ugrid_coord_names = [] ugrid_coords = getattr(self.cf_group, "ugrid_coords", None) if ugrid_coords is not None: @@ -1183,6 +1448,35 @@ def _build(cf_variable): coordinate_names = list(self.cf_group.coordinates.keys()) cf_group = self.CFGroup() + def _span_check( + var_name: str, via_formula_terms: Optional[str] = None + ) -> None: + """Sanity check dimensionality.""" + var = self.cf_group[var_name] + # No span check is necessary if variable is attached to a mesh. + if is_mesh_var or var.spans(cf_variable): + cf_group[var_name] = var + else: + # Register the ignored variable. + # N.B. 'ignored' variable from enclosing scope. + ignored.add(var_name) + + text_formula = text_via = "" + if via_formula_terms: + text_formula = " formula terms" + text_via = f" via variable {via_formula_terms}" + + message = ( + f"Ignoring{text_formula} variable {var_name} " + f"referenced by variable {cf_variable.cf_name}" + f"{text_via}: Dimensions {var.dimensions} do not span " + f"{cf_variable.dimensions}" + ) + warnings.warn( + message, + category=iris.warnings.IrisCfNonSpanningVarWarning, + ) + # Build CF variable relationships. for variable_type in self._variable_types: ignore = [] @@ -1201,28 +1495,8 @@ def _build(cf_variable): warn=False, ) # Sanity check dimensionality coverage. - for cf_name, cf_var in match.items(): - # No span check is necessary if variable is attached to a mesh. - if is_mesh_var or cf_var.spans(cf_variable): - cf_group[cf_name] = self.cf_group[cf_name] - else: - # Register the ignored variable. - # N.B. 'ignored' variable from enclosing scope. - ignored.add(cf_name) - msg = ( - "Ignoring variable {!r} referenced " - "by variable {!r}: Dimensions {!r} do not " - "span {!r}".format( - cf_name, - cf_variable.cf_name, - cf_var.dimensions, - cf_variable.dimensions, - ) - ) - warnings.warn( - msg, - category=iris.warnings.IrisCfNonSpanningVarWarning, - ) + for cf_name in match: + _span_check(cf_name) # Build CF data variable relationships. if isinstance(cf_variable, CFDataVariable): @@ -1249,29 +1523,7 @@ def _build(cf_variable): for cf_var in self.cf_group.formula_terms.values(): for cf_root in cf_var.cf_terms_by_root: if cf_root in cf_group and cf_var.cf_name not in cf_group: - # Sanity check dimensionality. - if cf_var.spans(cf_variable): - cf_group[cf_var.cf_name] = cf_var - else: - # Register the ignored variable. - # N.B. 'ignored' variable from enclosing scope. - ignored.add(cf_var.cf_name) - msg = ( - "Ignoring formula terms variable {!r} " - "referenced by data variable {!r} via " - "variable {!r}: Dimensions {!r} do not " - "span {!r}".format( - cf_var.cf_name, - cf_variable.cf_name, - cf_root, - cf_var.dimensions, - cf_variable.dimensions, - ) - ) - warnings.warn( - msg, - category=iris.warnings.IrisCfNonSpanningVarWarning, - ) + _span_check(cf_var.cf_name, cf_root) # Add the CF group to the variable. cf_variable.cf_group = cf_group diff --git a/lib/iris/fileformats/dot.py b/lib/iris/fileformats/dot.py index 53f85794c6..8405368ade 100644 --- a/lib/iris/fileformats/dot.py +++ b/lib/iris/fileformats/dot.py @@ -57,13 +57,14 @@ def save(cube, target): Parameters ---------- - cube: :class:`iris.cube.Cube`. + cube : :class:`iris.cube.Cube` target : A filename or open file handle. See Also -------- - :func:`iris.io.save`. + iris.io.save : + Save one or more Cubes to file (or other writeable). """ if isinstance(target, str): @@ -90,7 +91,7 @@ def save_png(source, target, launch=False): Parameters ---------- - source: :class:`iris.cube.Cube`, or dot filename. + source : :class:`iris.cube.Cube`, or dot filename target : A filename or open file handle. If passing a file handle, take care to open it for binary output. @@ -99,7 +100,8 @@ def save_png(source, target, launch=False): See Also -------- - :func:`iris.io.save`. + iris.io.save : + Save one or more Cubes to file (or other writeable). """ # From cube or dot file? diff --git a/lib/iris/fileformats/netcdf/__init__.py b/lib/iris/fileformats/netcdf/__init__.py index 61b6f74cc6..6de6778416 100644 --- a/lib/iris/fileformats/netcdf/__init__.py +++ b/lib/iris/fileformats/netcdf/__init__.py @@ -10,10 +10,13 @@ Also : `CF Conventions `_. """ + +import logging + import iris.config # Note: *must* be done before importing from submodules, as they also use this ! -logger = iris.config.get_logger(__name__) +logger: logging.Logger = iris.config.get_logger(__name__) # Note: these probably shouldn't be public, but for now they are. from .._nc_load_rules.helpers import UnknownCellMethodWarning, parse_cell_methods diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index eb60afcf8a..b677f1af28 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -49,6 +49,7 @@ 'distributed.Lock', which requires a distributed scheduler to function. """ + import threading import dask.array @@ -126,14 +127,14 @@ def get_worker_lock(identity: str): """ scheduler_type = get_dask_array_scheduler_type() - if scheduler_type in ("threads", "single-threaded"): + if scheduler_type == "distributed": + from dask.distributed import Lock as DistributedLock + + lock: DistributedLock | threading.Lock = DistributedLock(identity) + elif scheduler_type in ("threads", "single-threaded"): # N.B. the "identity" string is never used in this case, as the same actual # lock object is used by all workers. lock = threading.Lock() - elif scheduler_type == "distributed": - from dask.distributed import Lock as DistributedLock - - lock = DistributedLock(identity) else: msg = ( "The configured dask array scheduler type is " diff --git a/lib/iris/fileformats/netcdf/_thread_safe_nc.py b/lib/iris/fileformats/netcdf/_thread_safe_nc.py index 9aafbf312d..3a556f5447 100644 --- a/lib/iris/fileformats/netcdf/_thread_safe_nc.py +++ b/lib/iris/fileformats/netcdf/_thread_safe_nc.py @@ -7,6 +7,7 @@ Intention is that no other Iris module should import the netCDF4 module. """ + from abc import ABC from threading import Lock import typing @@ -50,7 +51,7 @@ def is_contained_type(cls, instance): @classmethod def from_existing(cls, instance): - """Pass an existing instance to __init__, where it is contained.""" + """Routine to pass an existing instance to __init__, where it is contained.""" assert cls.is_contained_type(instance) return cls(instance) @@ -122,7 +123,7 @@ def setncattr(self, *args, **kwargs) -> None: @property def dimensions(self) -> typing.List[str]: - """Calls netCDF4.Variable.dimensions within _GLOBAL_NETCDF4_LOCK. + """Call netCDF4.Variable.dimensions within _GLOBAL_NETCDF4_LOCK. Only defined explicitly in order to get some mocks to work. """ @@ -162,7 +163,7 @@ class GroupWrapper(_ThreadSafeWrapper): @property def dimensions(self) -> typing.Dict[str, DimensionWrapper]: - """Calls dimensions of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. + """Call dimensions of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. Calls dimensions of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK, returning DimensionWrappers. The original returned netCDF4.Dimensions @@ -191,7 +192,7 @@ def createDimension(self, *args, **kwargs) -> DimensionWrapper: @property def variables(self) -> typing.Dict[str, VariableWrapper]: - """Calls variables of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. + """Call variables of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. Calls variables of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK, returning VariableWrappers. The original returned netCDF4.Variables @@ -238,7 +239,7 @@ def get_variables_by_attributes( @property def groups(self): - """Calls groups of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. + """Call groups of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. Calls groups of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK, returning GroupWrappers. @@ -253,7 +254,7 @@ def groups(self): @property def parent(self): - """Calls parent of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. + """Call parent of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK. Calls parent of netCDF4.Group/Dataset within _GLOBAL_NETCDF4_LOCK, returning a GroupWrapper. @@ -261,6 +262,7 @@ def parent(self): The original returned netCDF4.Group is simply replaced with its respective GroupWrapper, ensuring that downstream calls are also performed within _GLOBAL_NETCDF4_LOCK. + """ with _GLOBAL_NETCDF4_LOCK: parent_ = self._contained_instance.parent @@ -321,6 +323,10 @@ def ndim(self): # noqa: D102 return len(self.shape) + @property + def dask_meta(self): + return np.ma.array(np.empty((0,) * self.ndim, dtype=self.dtype), mask=True) + def __getitem__(self, keys): # Using a DatasetWrapper causes problems with invalid ID's and the # netCDF4 library, presumably because __getitem__ gets called so many diff --git a/lib/iris/fileformats/netcdf/loader.py b/lib/iris/fileformats/netcdf/loader.py index 4e205ad7f3..55d0a88b79 100644 --- a/lib/iris/fileformats/netcdf/loader.py +++ b/lib/iris/fileformats/netcdf/loader.py @@ -10,12 +10,12 @@ Also : `CF Conventions `_. """ -from collections.abc import Iterable, Mapping + +from collections.abc import Iterable, Iterator, Mapping from contextlib import contextmanager from copy import deepcopy from enum import Enum, auto import threading -from typing import Union import warnings import numpy as np @@ -239,9 +239,12 @@ def _get_cf_var_data(cf_var, filename): # Get the chunking specified for the variable : this is either a shape, or # maybe the string "contiguous". if CHUNK_CONTROL.mode is ChunkControl.Modes.AS_DASK: - result = as_lazy_data(proxy, chunks=None, dask_chunking=True) + result = as_lazy_data(proxy, meta=proxy.dask_meta, chunks="auto") else: chunks = cf_var.cf_data.chunking() + if chunks is None: + # Occurs for non-version-4 netcdf + chunks = "contiguous" # In the "contiguous" case, pass chunks=None to 'as_lazy_data'. if chunks == "contiguous": if ( @@ -281,7 +284,10 @@ def _get_cf_var_data(cf_var, filename): if dims_fixed is None: dims_fixed = [dims_fixed] result = as_lazy_data( - proxy, chunks=chunks, dims_fixed=tuple(dims_fixed) + proxy, + meta=proxy.dask_meta, + chunks=chunks, + dims_fixed=tuple(dims_fixed), ) return result @@ -515,9 +521,10 @@ def _translate_constraints_to_var_callback(constraints): Returns ------- - function : (cf_var:CFDataVariable) - bool, or None. + bool or None + Notes + ----- For now, ONLY handles a single NameConstraint with no 'STASH' component. """ @@ -571,16 +578,14 @@ def load_cubes(file_sources, callback=None, constraints=None): Generator of loaded NetCDF :class:`iris.cube.Cube`. """ - # TODO: rationalise UGRID/mesh handling once experimental.ugrid is folded - # into standard behaviour. # Deferred import to avoid circular imports. - from iris.experimental.ugrid.cf import CFUGridReader - from iris.experimental.ugrid.load import ( - PARSE_UGRID_ON_LOAD, + from iris.fileformats.cf import CFReader + from iris.io import run_callback + + from .ugrid_load import ( _build_mesh_coords, _meshes_from_cf, ) - from iris.io import run_callback # Create a low-level data-var filter from the original load constraints, if they are suitable. var_callback = _translate_constraints_to_var_callback(constraints) @@ -593,15 +598,8 @@ def load_cubes(file_sources, callback=None, constraints=None): for file_source in file_sources: # Ingest the file. At present may be a filepath or an open netCDF4.Dataset. - meshes = {} - if PARSE_UGRID_ON_LOAD: - cf_reader_class = CFUGridReader - else: - cf_reader_class = iris.fileformats.cf.CFReader - - with cf_reader_class(file_source) as cf: - if PARSE_UGRID_ON_LOAD: - meshes = _meshes_from_cf(cf) + with CFReader(file_source) as cf: + meshes = _meshes_from_cf(cf) # Process each CF data variable. data_variables = list(cf.cf_group.data_variables.values()) + list( @@ -619,8 +617,7 @@ def load_cubes(file_sources, callback=None, constraints=None): mesh_name = None mesh = None mesh_coords, mesh_dim = [], None - if PARSE_UGRID_ON_LOAD: - mesh_name = getattr(cf_var, "mesh", None) + mesh_name = getattr(cf_var, "mesh", None) if mesh_name is not None: try: mesh = meshes[mesh_name] @@ -685,8 +682,8 @@ def __init__(self, var_dim_chunksizes=None): :class:`~iris.coords.AncillaryVariable` etc. This can be overridden, if required, by variable-specific settings. - For this purpose, :class:`~iris.experimental.ugrid.mesh.MeshCoord` and - :class:`~iris.experimental.ugrid.mesh.Connectivity` are not + For this purpose, :class:`~iris.mesh.MeshCoord` and + :class:`~iris.mesh.Connectivity` are not :class:`~iris.cube.Cube` components, and chunk control on a :class:`~iris.cube.Cube` data-variable will not affect them. @@ -697,15 +694,15 @@ def __init__(self, var_dim_chunksizes=None): @contextmanager def set( self, - var_names: Union[str, Iterable[str]] = None, + var_names: str | Iterable[str] | None = None, **dimension_chunksizes: Mapping[str, int], - ) -> None: + ) -> Iterator[None]: r"""Control the Dask chunk sizes applied to NetCDF variables during loading. Parameters ---------- var_names : str or list of str, default=None - apply the `dimension_chunksizes` controls only to these variables, + Apply the `dimension_chunksizes` controls only to these variables, or when building :class:`~iris.cube.Cube` from these data variables. If ``None``, settings apply to all loaded variables. **dimension_chunksizes : dict of {str: int} @@ -750,7 +747,7 @@ def set( # A specific name match should override a '*' setting, but # that is implemented elsewhere. if not isinstance(var_name, str): - msg = ( + msg = ( # type: ignore[unreachable] "'var_names' should be an iterable of strings, " f"not {var_names!r}." ) @@ -770,7 +767,7 @@ def set( self.mode = old_mode @contextmanager - def from_file(self) -> None: + def from_file(self) -> Iterator[None]: r"""Ensure the chunk sizes are loaded in from NetCDF file variables. Raises @@ -793,8 +790,8 @@ def from_file(self) -> None: self.var_dim_chunksizes = old_var_dim_chunksizes @contextmanager - def as_dask(self) -> None: - """Relies on Dask :external+dask:doc:`array` to control chunk sizes. + def as_dask(self) -> Iterator[None]: + """Rely on Dask :external+dask:doc:`array` to control chunk sizes. Notes ----- diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 42616d7fd1..8aa551be57 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -13,13 +13,14 @@ Also : `CF Conventions `_. """ + import collections from itertools import repeat, zip_longest import os import os.path import re import string -from typing import List +import typing import warnings import cf_units @@ -161,15 +162,6 @@ } -class _WarnComboMaskSave( - iris.warnings.IrisMaskValueMatchWarning, - iris.warnings.IrisSaveWarning, -): - """One-off combination of warning classes - enhances user filtering.""" - - pass - - class CFNameCoordMap: """Provide a simple CF name to CF coordinate mapping.""" @@ -279,46 +271,11 @@ def _setncattr(variable, name, attribute): return variable.setncattr(name, attribute) -# NOTE : this matches :class:`iris.experimental.ugrid.mesh.Mesh.ELEMENTS`, +# NOTE : this matches :class:`iris.mesh.MeshXY.ELEMENTS`, # but in the preferred order for coord/connectivity variables in the file. MESH_ELEMENTS = ("node", "edge", "face") -_FillvalueCheckInfo = collections.namedtuple( - "_FillvalueCheckInfo", ["user_value", "check_value", "dtype", "varname"] -) - - -def _data_fillvalue_check(arraylib, data, check_value): - """Check whether an array is masked, and whether it contains a fill-value. - - Parameters - ---------- - arraylib : module - Either numpy or dask.array : When dask, results are lazy computations. - data : array-like - Array to check (numpy or dask) - check_value : number or None - If not None, fill-value to check for existence in the array. - If None, do not do value-in-array check - - Returns - ------- - is_masked : bool - True if array has any masked points. - contains_value : bool - True if array contains check_value. - Always False if check_value is None. - - """ - is_masked = arraylib.any(arraylib.ma.getmaskarray(data)) - if check_value is None: - contains_value = False - else: - contains_value = arraylib.any(data == check_value) - return is_masked, contains_value - - class SaverFillValueWarning(iris.warnings.IrisSaverFillValueWarning): """Backwards compatible form of :class:`iris.warnings.IrisSaverFillValueWarning`.""" @@ -326,59 +283,17 @@ class SaverFillValueWarning(iris.warnings.IrisSaverFillValueWarning): pass -def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): - """Work out whether there was a possible or actual fill-value collision. +class VariableEmulator(typing.Protocol): + """Duck-type-hinting for a ncdata object. - From the given information, work out whether there was a possible or actual - fill-value collision, and if so construct a warning. - - Parameters - ---------- - fill_info : _FillvalueCheckInfo - A named-tuple containing the context of the fill-value check - is_masked : bool - whether the data array was masked - contains_fill_value : bool - whether the data array contained the fill-value - warn : bool, default=False - if True, also issue any resulting warning immediately. + https://github.com/pp-mo/ncdata + """ - Returns - ------- - None or :class:`Warning` - If not None, indicates a known or possible problem with filling + _data_array: np.typing.ArrayLike + shape: tuple[int, ...] - """ - varname = fill_info.varname - user_value = fill_info.user_value - check_value = fill_info.check_value - is_byte_data = fill_info.dtype.itemsize == 1 - result = None - if is_byte_data and is_masked and user_value is None: - result = SaverFillValueWarning( - f"CF var '{varname}' contains byte data with masked points, but " - "no fill_value keyword was given. As saved, these " - "points will read back as valid values. To save as " - "masked byte data, `_FillValue` needs to be explicitly " - "set. For Cube data this can be done via the 'fill_value' " - "keyword during saving, otherwise use ncedit/equivalent." - ) - elif contains_fill_value: - result = SaverFillValueWarning( - f"CF var '{varname}' contains unmasked data points equal to the " - f"fill-value, {check_value}. As saved, these points will read back " - "as missing data. To save these as normal values, " - "`_FillValue` needs to be set to not equal any valid data " - "points. For Cube data this can be done via the 'fill_value' " - "keyword during saving, otherwise use ncedit/equivalent." - ) - if warn and result is not None: - warnings.warn( - result, - category=_WarnComboMaskSave, - ) - return result +CFVariable = typing.Union[_thread_safe_nc.VariableWrapper, VariableEmulator] class Saver: @@ -453,7 +368,7 @@ def __init__(self, filename, netcdf_format, compute=True): self._formula_terms_cache = {} #: Target filepath self.filepath = None # this line just for the API page -- value is set later - #: Whether to complete delayed saves on exit (and raise associated warnings). + #: Whether to complete delayed saves on exit. self.compute = compute # N.B. the file-write-lock *type* actually depends on the dask scheduler type. #: A per-file write lock to prevent dask attempting overlapping writes. @@ -462,7 +377,7 @@ def __init__(self, filename, netcdf_format, compute=True): ) # A list of delayed writes for lazy saving - # a list of triples (source, target, fill-info). + # a list of couples (source, target). self._delayed_writes = [] # Detect if we were passed a pre-opened dataset (or something like one) @@ -544,7 +459,7 @@ def write( cube : :class:`iris.cube.Cube` A :class:`iris.cube.Cube` to be saved to a netCDF file. local_keys : iterable of str, optional - An interable of cube attribute keys. Any cube attributes with + An iterable of cube attribute keys. Any cube attributes with matching keys will become attributes on the data variable rather than global attributes. @@ -844,21 +759,22 @@ def _add_mesh(self, cube_or_mesh): Add the cube's mesh, and all related variables to the dataset. Includes all the mesh-element coordinate and connectivity variables. - ..note:: + .. note:: Here, we do *not* add the relevant referencing attributes to the data-variable, because we want to create the data-variable later. Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube`or :class:`iris.experimental.ugrid.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.mesh.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns ------- - cf_mesh_name : str or None + str or None The name of the mesh variable created, or None if the cube does not have a mesh. + """ cf_mesh_name = None @@ -1021,15 +937,15 @@ def _add_aux_coords(self, cube, cf_var_cube, dimension_names): cube : :class:`iris.cube.Cube` A :class:`iris.cube.Cube` to be saved to a netCDF file. cf_var_cube : :class:`netcdf.netcdf_variable` - cf variable cube representation. + A cf variable cube representation. dimension_names : list Names associated with the dimensions of the cube. """ - from iris.experimental.ugrid.mesh import ( - Mesh, + from iris.mesh.components import ( MeshEdgeCoords, MeshFaceCoords, MeshNodeCoords, + MeshXY, ) # Exclude any mesh coords, which are bundled in with the aux-coords. @@ -1038,8 +954,8 @@ def _add_aux_coords(self, cube, cf_var_cube, dimension_names): ] # Include any relevant mesh location coordinates. - mesh: Mesh = getattr(cube, "mesh") - mesh_location: str = getattr(cube, "location") + mesh: MeshXY | None = getattr(cube, "mesh") + mesh_location: str | None = getattr(cube, "location") if mesh and mesh_location: location_coords: MeshNodeCoords | MeshEdgeCoords | MeshFaceCoords = getattr( mesh, f"{mesh_location}_coords" @@ -1061,7 +977,7 @@ def _add_cell_measures(self, cube, cf_var_cube, dimension_names): cube : :class:`iris.cube.Cube` A :class:`iris.cube.Cube` to be saved to a netCDF file. cf_var_cube : :class:`netcdf.netcdf_variable` - cf variable cube representation. + A cf variable cube representation. dimension_names : list Names associated with the dimensions of the cube. """ @@ -1080,7 +996,7 @@ def _add_ancillary_variables(self, cube, cf_var_cube, dimension_names): cube : :class:`iris.cube.Cube` A :class:`iris.cube.Cube` to be saved to a netCDF file. cf_var_cube : :class:`netcdf.netcdf_variable` - cf variable cube representation. + A cf variable cube representation. dimension_names : list Names associated with the dimensions of the cube. """ @@ -1122,7 +1038,7 @@ def _add_aux_factories(self, cube, cf_var_cube, dimension_names): ---------- cube : :class:`iris.cube.Cube` A :class:`iris.cube.Cube` to be saved to a netCDF file. - cf_var_cube: :class:`netcdf.netcdf_variable` + cf_var_cube : :class:`netcdf.netcdf_variable` CF variable cube representation. dimension_names : list Names associated with the dimensions of the cube. @@ -1204,7 +1120,7 @@ def _get_dim_names(self, cube_or_mesh): Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.mesh.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns @@ -1212,7 +1128,7 @@ def _get_dim_names(self, cube_or_mesh): mesh_dimensions : list of str A list of the mesh dimensions of the attached mesh, if any. cube_dimensions : list of str - A lists of dimension names for each dimension of the cube + A lists of dimension names for each dimension of the cube. Notes ----- @@ -1288,7 +1204,7 @@ def record_dimension(names_list, dim_name, length, matching_coords=None): if location == "node": # For nodes, identify the dim with a coordinate variable. # Selecting the X-axis one for definiteness. - dim_coords = mesh.coords(include_nodes=True, axis="x") + dim_coords = mesh.coords(location="node", axis="x") else: # For face/edge, use the relevant "optionally required" # connectivity variable. @@ -1301,13 +1217,6 @@ def record_dimension(names_list, dim_name, length, matching_coords=None): assert len(dim_coords) == 1 dim_element = dim_coords[0] dim_name = self._dim_names_and_coords.name(dim_element) - if dim_name is not None: - # For mesh-identifying coords, we require the *same* - # coord, not an identical one (i.e. "is" not "==") - stored_coord = self._dim_names_and_coords.coord(dim_name) - if dim_element is not stored_coord: - # This is *not* a proper match after all. - dim_name = None if dim_name is None: # No existing dim matches this, so assign a new name if location == "node": @@ -1319,7 +1228,7 @@ def record_dimension(names_list, dim_name, length, matching_coords=None): # Name it for the relevant mesh dimension location_dim_attr = f"{location}_dimension" dim_name = getattr(mesh, location_dim_attr) - # NOTE: This cannot currently be empty, as a Mesh + # NOTE: This cannot currently be empty, as a MeshXY # "invents" dimension names which were not given. assert dim_name is not None # Ensure it is a valid variable name. @@ -1418,12 +1327,12 @@ def cf_valid_var_name(var_name): Parameters ---------- var_name : str - The var_name to normalise + The var_name to normalise. Returns ------- str - var_name suitable for passing through for variable creation. + The var_name suitable for passing through for variable creation. """ # Replace invalid characters with an underscore ("_"). @@ -1478,9 +1387,13 @@ def _ensure_valid_dtype(self, values, src_name, src_object): val_min, val_max = (values.min(), values.max()) if is_lazy_data(values): val_min, val_max = _co_realise_lazy_arrays([val_min, val_max]) + # NumPy will inherit values.dtype even if the scalar numbers work + # with a smaller type. + min_dtype = np.promote_types( + *[np.min_scalar_type(m) for m in (val_min, val_max)] + ) # Cast to an integer type supported by netCDF3. - can_cast = all([np.can_cast(m, np.int32) for m in (val_min, val_max)]) - if not can_cast: + if not np.can_cast(min_dtype, np.int32): msg = ( "The data type of {} {!r} is not supported by {} and" " its values cannot be safely cast to a supported" @@ -1499,9 +1412,9 @@ def _create_cf_bounds(self, coord, cf_var, cf_name): coord : :class:`iris.coords.Coord` A coordinate of a cube. cf_var : - CF-netCDF variable + CF-netCDF variable. cf_name : str - name of the CF-NetCDF variable. + Name of the CF-NetCDF variable. Returns ------- @@ -1542,12 +1455,7 @@ def _create_cf_bounds(self, coord, cf_var, cf_name): bounds.dtype.newbyteorder("="), cf_var.dimensions + (bounds_dimension_name,), ) - self._lazy_stream_data( - data=bounds, - fill_value=None, - fill_warn=True, - cf_var=cf_var_bounds, - ) + self._lazy_stream_data(data=bounds, cf_var=cf_var_bounds) def _get_cube_variable_name(self, cube): """Return a CF-netCDF variable name for the given cube. @@ -1578,7 +1486,7 @@ def _get_coord_variable_name(self, cube_or_mesh, coord): Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.mesh.MeshXY` The Cube or Mesh being saved to the netCDF file. coord : :class:`iris.coords._DimensionalMetadata` An instance of a coordinate (or similar), for which a CF-netCDF @@ -1620,10 +1528,10 @@ def _get_coord_variable_name(self, cube_or_mesh, coord): # element-coordinate of the mesh. # Name it for it's first dim, i.e. mesh-dim of its location. - from iris.experimental.ugrid.mesh import Connectivity + from iris.mesh import Connectivity # At present, a location-coord cannot be nameless, as the - # Mesh code relies on guess_coord_axis. + # MeshXY code relies on guess_coord_axis. assert isinstance(coord, Connectivity) location = coord.cf_role.split("_")[0] location_dim_attr = f"{location}_dimension" @@ -1640,7 +1548,7 @@ def _get_mesh_variable_name(self, mesh): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` + mesh : :class:`iris.mesh.MeshXY` An instance of a Mesh for which a CF-netCDF variable name is required. @@ -1666,7 +1574,7 @@ def _create_mesh(self, mesh): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` + mesh : :class:`iris.mesh.MeshXY` The Mesh to be saved to CF-netCDF file. Returns @@ -1750,13 +1658,13 @@ def _create_generic_cf_array_var( Create the associated CF-netCDF variable in the netCDF dataset for the given dimensional_metadata. - ..note:: + .. note:: If the metadata element is a coord, it may also contain bounds. In which case, an additional var is created and linked to it. Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.mesh.MeshXY` The Cube or Mesh being saved to the netCDF file. cube_dim_names : list of str The name of each dimension of the cube. @@ -1880,9 +1788,7 @@ def _create_generic_cf_array_var( self._create_cf_bounds(element, cf_var, cf_name) # Add the data to the CF-netCDF variable. - self._lazy_stream_data( - data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var - ) + self._lazy_stream_data(data=data, cf_var=cf_var) # Add names + units self._set_cf_var_attributes(cf_var, element) @@ -1952,7 +1858,7 @@ def _create_cf_grid_mapping(self, cube, cf_var_cube): A :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or list of cubes to be saved to a netCDF file. cf_var_cube : :class:`netcdf.netcdf_variable` - cf variable cube representation. + A cf variable cube representation. Returns ------- @@ -2202,11 +2108,11 @@ def _create_cf_data_variable( dimension_names : list String names for each dimension of the cube. local_keys : iterable of str, optional - See :func:`iris.fileformats.netcdf.Saver.write` + See :func:`iris.fileformats.netcdf.Saver.write`. packing : type or str or dict or list, optional - See :func:`iris.fileformats.netcdf.Saver.write` + See :func:`iris.fileformats.netcdf.Saver.write`. fill_value : optional - See :func:`iris.fileformats.netcdf.Saver.write` + See :func:`iris.fileformats.netcdf.Saver.write`. Notes ----- @@ -2287,12 +2193,7 @@ def set_packing_ncattrs(cfvar): ) set_packing_ncattrs(cf_var) - self._lazy_stream_data( - data=data, - fill_value=fill_value, - fill_warn=(not packing), - cf_var=cf_var, - ) + self._lazy_stream_data(data=data, cf_var=cf_var) if cube.standard_name: _setncattr(cf_var, "standard_name", cube.standard_name) @@ -2385,7 +2286,11 @@ def _increment_name(self, varname): return "{}_{}".format(varname, num) - def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): + def _lazy_stream_data( + self, + data: np.typing.ArrayLike, + cf_var: CFVariable, + ) -> None: if hasattr(data, "shape") and data.shape == (1,) + cf_var.shape: # (Don't do this check for string data). # Reduce dimensionality where the data array has an extra dimension @@ -2401,72 +2306,36 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): # data to/from netcdf data container objects in other packages, such as # xarray. # See https://github.com/SciTools/iris/issues/4994 "Xarray bridge". - # N.B. also, in this case there is no need for fill-value checking as the - # data is not being translated to an in-file representation. cf_var._data_array = data - else: - # Decide whether we are checking for fill-value collisions. - dtype = cf_var.dtype - # fill_warn allows us to skip warning if packing attributes have been - # specified. It would require much more complex operations to work out - # what the values and fill_value _would_ be in such a case. - if fill_warn: - if fill_value is not None: - fill_value_to_check = fill_value - else: - # Retain 'fill_value == None', to show that no specific value was given. - # But set 'fill_value_to_check' to a calculated value - fill_value_to_check = _thread_safe_nc.default_fillvals[ - dtype.str[1:] - ] - # Cast the check-value to the correct dtype. - # NOTE: In the case of 'S1' dtype (at least), the default (Python) value - # does not have a compatible type. This causes a deprecation warning at - # numpy 1.24, *and* was preventing correct fill-value checking of character - # data, since they are actually bytes (dtype 'S1'). - fill_value_to_check = np.array(fill_value_to_check, dtype=dtype) - else: - # A None means we will NOT check for collisions. - fill_value_to_check = None - - fill_info = _FillvalueCheckInfo( - user_value=fill_value, - check_value=fill_value_to_check, - dtype=dtype, - varname=cf_var.name, - ) + else: doing_delayed_save = is_lazy_data(data) if doing_delayed_save: # save lazy data with a delayed operation. For now, we just record the # necessary information -- a single, complete delayed action is constructed # later by a call to delayed_completion(). - def store(data, cf_var, fill_info): + def store( + data: np.typing.ArrayLike, + cf_var: CFVariable, + ) -> None: # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. write_wrapper = _thread_safe_nc.NetCDFWriteProxy( self.filepath, cf_var, self.file_write_lock ) # Add to the list of delayed writes, used in delayed_completion(). - self._delayed_writes.append((data, write_wrapper, fill_info)) - # In this case, fill-value checking is done later. But return 2 dummy - # values, to be consistent with the non-streamed "store" signature. - is_masked, contains_value = False, False - return is_masked, contains_value + self._delayed_writes.append((data, write_wrapper)) else: # Real data is always written directly, i.e. not via lazy save. - # We also check it immediately for any fill-value problems. - def store(data, cf_var, fill_info): - cf_var[:] = data - return _data_fillvalue_check(np, data, fill_info.check_value) - - # Store the data and check if it is masked and contains the fill value. - is_masked, contains_fill_value = store(data, cf_var, fill_info) + def store( + data: np.typing.ArrayLike, + cf_var: CFVariable, + ) -> None: + cf_var[:] = data # type: ignore[index] - if not doing_delayed_save: - # Issue a fill-value warning immediately, if appropriate. - _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=True) + # Store the data. + store(data, cf_var) def delayed_completion(self) -> Delayed: """Perform file completion for delayed saves. @@ -2474,11 +2343,6 @@ def delayed_completion(self) -> Delayed: Create and return a :class:`dask.delayed.Delayed` to perform file completion for delayed saves. - This contains all the delayed writes, which complete the file by - filling out the data of variables initially created empty, and also the - checks for potential fill-value collisions. When computed, it returns - a list of any warnings which were generated in the save operation. - Returns ------- :class:`dask.delayed.Delayed` @@ -2490,68 +2354,24 @@ def delayed_completion(self) -> Delayed: """ if self._delayed_writes: # Create a single delayed da.store operation to complete the file. - sources, targets, fill_infos = zip(*self._delayed_writes) - store_op = da.store(sources, targets, compute=False, lock=False) - - # Construct a delayed fill-check operation for each (lazy) source array. - delayed_fillvalue_checks = [ - # NB with arraylib=dask.array, this routine does lazy array computation - _data_fillvalue_check(da, source, fillinfo.check_value) - for source, fillinfo in zip(sources, fill_infos) - ] - - # Return a single delayed object which completes the delayed saves and - # returns a list of any fill-value warnings. - @dask.delayed - def compute_and_return_warnings(store_op, fv_infos, fv_checks): - # Note: we don't actually *do* anything with the 'store_op' argument, - # but including it here ensures that dask will compute it (thus - # performing all the delayed saves), before calling this function. - results = [] - # Pair each fill_check result (is_masked, contains_value) with its - # fillinfo and construct a suitable Warning if needed. - for fillinfo, (is_masked, contains_value) in zip(fv_infos, fv_checks): - fv_warning = _fillvalue_report( - fill_info=fillinfo, - is_masked=is_masked, - contains_fill_value=contains_value, - ) - if fv_warning is not None: - # Collect the warnings and return them. - results.append(fv_warning) - return results - - result = compute_and_return_warnings( - store_op, - fv_infos=fill_infos, - fv_checks=delayed_fillvalue_checks, - ) + sources, targets = zip(*self._delayed_writes) + result = da.store(sources, targets, compute=False, lock=False) else: - # Return a delayed, which returns an empty list, for usage consistency. + # Return a do-nothing delayed, for usage consistency. @dask.delayed def no_op(): - return [] + return None result = no_op() return result - def complete(self, issue_warnings=True) -> List[Warning]: + def complete(self) -> None: """Complete file by computing any delayed variable saves. This requires that the Saver has closed the dataset (exited its context). - Parameters - ---------- - issue_warnings : bool, default = True - If true, issue all the resulting warnings with :func:`warnings.warn`. - - Returns - ------- - warnings : list of Warning - Any warnings that were raised while writing delayed data. - """ if self._dataset.isopen(): msg = ( @@ -2560,15 +2380,8 @@ def complete(self, issue_warnings=True) -> List[Warning]: ) raise ValueError(msg) - delayed_write = self.delayed_completion() - # Complete the saves now, and handle any delayed warnings that occurred - result_warnings = delayed_write.compute() - if issue_warnings: - # Issue any delayed warnings from the compute. - for delayed_warning in result_warnings: - warnings.warn(delayed_warning, category=iris.warnings.IrisSaveWarning) - - return result_warnings + # Complete the saves now + self.delayed_completion().compute() def save( @@ -2618,7 +2431,7 @@ def save( Name of the netCDF file to save the cube(s). **Or** an open, writeable :class:`netCDF4.Dataset`, or compatible object. - .. Note:: + .. note:: When saving to a dataset, ``compute`` **must** be ``False`` : See the ``compute`` parameter. @@ -2626,7 +2439,7 @@ def save( Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. local_keys : iterable of str, optional - An interable of cube attribute keys. Any cube attributes with + An iterable of cube attribute keys. Any cube attributes with matching keys will become attributes on the data variable rather than global attributes. @@ -2720,11 +2533,6 @@ def save( Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. - .. note:: - when computed, the returned :class:`dask.delayed.Delayed` object returns - a list of :class:`Warning` : These are any warnings which *would* have - been issued in the save call, if ``compute`` had been ``True``. - .. note:: If saving to an open dataset instead of a filepath, then the caller **must** specify ``compute=False``, and complete delayed saves **after @@ -2735,7 +2543,7 @@ def save( Returns ------- - result : None or dask.delayed.Delayed + None or dask.delayed.Delayed If `compute=True`, returns `None`. Otherwise returns a :class:`dask.delayed.Delayed`, which implements delayed writing to fill in the variables data. @@ -2992,3 +2800,40 @@ def is_valid_packspec(p): result = sman.delayed_completion() return result + + +def save_mesh(mesh, filename, netcdf_format="NETCDF4"): + """Save mesh(es) to a netCDF file. + + Parameters + ---------- + mesh : :class:`iris.mesh.MeshXY` or iterable + Mesh(es) to save. + filename : str + Name of the netCDF file to create. + netcdf_format : str, default="NETCDF4" + Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', + 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. + + """ + if isinstance(mesh, typing.Iterable): + meshes = mesh + else: + meshes = [mesh] + + # Initialise Manager for saving + with Saver(filename, netcdf_format) as sman: + # Iterate through the list. + for mesh in meshes: + # Get suitable dimension names. + mesh_dimensions, _ = sman._get_dim_names(mesh) + + # Create dimensions. + sman._create_cf_dimensions(cube=None, dimension_names=mesh_dimensions) + + # Create the mesh components. + sman._add_mesh(mesh) + + # Add a conventions attribute. + # TODO: add 'UGRID' to conventions, when this is agreed with CF ? + sman.update_global_attributes(Conventions=CF_CONVENTIONS_VERSION) diff --git a/lib/iris/experimental/ugrid/load.py b/lib/iris/fileformats/netcdf/ugrid_load.py similarity index 68% rename from lib/iris/experimental/ugrid/load.py rename to lib/iris/fileformats/netcdf/ugrid_load.py index 630c179fd9..0a70567f16 100644 --- a/lib/iris/experimental/ugrid/load.py +++ b/lib/iris/fileformats/netcdf/ugrid_load.py @@ -3,34 +3,33 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -r"""Allow the construction of :class:`~iris.experimental.ugrid.mesh.Mesh`. +r"""Allow the construction of :class:`~iris.mesh.MeshXY`. -Extensions to Iris' NetCDF loading to allow the construction of -:class:`~iris.experimental.ugrid.mesh.Mesh` from UGRID data in the file. +Extension functions for Iris NetCDF loading, to construct +:class:`~iris.mesh.MeshXY` from UGRID data in files. -Eventual destination: :mod:`iris.fileformats.netcdf`. +.. seealso:: + + The UGRID Conventions, + https://ugrid-conventions.github.io/ugrid-conventions/ """ -from contextlib import contextmanager + from itertools import groupby from pathlib import Path -import threading import warnings -from ...config import get_logger -from ...coords import AuxCoord -from ...fileformats._nc_load_rules.helpers import get_attr_units, get_names -from ...fileformats.netcdf import loader as nc_loader -from ...io import decode_uri, expand_filespecs -from ...util import guess_coord_axis -from ...warnings import IrisCfWarning, IrisDefaultingWarning, IrisIgnoringWarning -from .cf import ( - CFUGridAuxiliaryCoordinateVariable, - CFUGridConnectivityVariable, - CFUGridMeshVariable, - CFUGridReader, -) -from .mesh import Connectivity, Mesh +from iris.config import get_logger +from iris.coords import AuxCoord +from iris.io import decode_uri, expand_filespecs +from iris.mesh.components import Connectivity, MeshXY +from iris.util import guess_coord_axis +from iris.warnings import IrisCfWarning, IrisDefaultingWarning, IrisIgnoringWarning + +# NOTE: all imports from iris.fileformats.netcdf must be deferred, to avoid circular +# imports. +# This is needed so that load_mesh/load_meshes can be included in the iris.mesh API. + # Configure the logger. logger = get_logger(__name__, propagate=True, handler=False) @@ -48,58 +47,6 @@ class _WarnComboCfDefaultingIgnoring(_WarnComboCfDefaulting, IrisIgnoringWarning pass -class ParseUGridOnLoad(threading.local): - def __init__(self): - """Thead-safe state to enable UGRID-aware NetCDF loading. - - A flag for dictating whether to use the experimental UGRID-aware - version of Iris NetCDF loading. Object is thread-safe. - - Use via the run-time switch - :const:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. - Use :meth:`context` to temporarily activate. - - .. seealso:: - - The UGRID Conventions, - https://ugrid-conventions.github.io/ugrid-conventions/ - - """ - self._state = False - - def __bool__(self): - return self._state - - @contextmanager - def context(self): - """Temporarily activate experimental UGRID-aware NetCDF loading. - - Use the standard Iris loading API while within the context manager. If - the loaded file(s) include any UGRID content, this will be parsed and - attached to the resultant cube(s) accordingly. - - Use via the run-time switch - :const:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. - - For example:: - - with PARSE_UGRID_ON_LOAD.context(): - my_cube_list = iris.load([my_file_path, my_file_path2], - constraint=my_constraint, - callback=my_callback) - - """ - try: - self._state = True - yield - finally: - self._state = False - - -#: Run-time switch for experimental UGRID-aware NetCDF loading. See :class:`~iris.experimental.ugrid.load.ParseUGridOnLoad`. -PARSE_UGRID_ON_LOAD = ParseUGridOnLoad() - - def _meshes_from_cf(cf_reader): """Mesh from cf, common behaviour for extracting meshes from a CFReader. @@ -109,19 +56,21 @@ def _meshes_from_cf(cf_reader): # Mesh instances are shared between file phenomena. # TODO: more sophisticated Mesh sharing between files. # TODO: access external Mesh cache? - mesh_vars = cf_reader.cf_group.meshes - meshes = { - name: _build_mesh(cf_reader, var, cf_reader.filename) - for name, var in mesh_vars.items() - } + meshes = {} + if cf_reader._with_ugrid: + mesh_vars = cf_reader.cf_group.meshes + meshes = { + name: _build_mesh(cf_reader, var, cf_reader.filename) + for name, var in mesh_vars.items() + } return meshes def load_mesh(uris, var_name=None): - """Load a single :class:`~iris.experimental.ugrid.mesh.Mesh` object from one or more NetCDF files. + """Load a single :class:`~iris.mesh.MeshXY` object from one or more NetCDF files. Raises an error if more/less than one - :class:`~iris.experimental.ugrid.mesh.Mesh` is found. + :class:`~iris.mesh.MeshXY` is found. Parameters ---------- @@ -129,12 +78,12 @@ def load_mesh(uris, var_name=None): One or more filenames/URI's. Filenames can include wildcards. Any URI's must support OpenDAP. var_name : str, optional - Only return a :class:`~iris.experimental.ugrid.mesh.Mesh` if its + Only return a :class:`~iris.mesh.MeshXY` if its var_name matches this value. Returns ------- - :class:`iris.experimental.ugrid.mesh.Mesh` + :class:`iris.mesh.MeshXY` """ meshes_result = load_meshes(uris, var_name) @@ -147,7 +96,7 @@ def load_mesh(uris, var_name=None): def load_meshes(uris, var_name=None): - r"""Load :class:`~iris.experimental.ugrid.mesh.Mesh` objects from one or more NetCDF files. + r"""Load :class:`~iris.mesh.MeshXY` objects from one or more NetCDF files. Parameters ---------- @@ -155,7 +104,7 @@ def load_meshes(uris, var_name=None): One or more filenames/URI's. Filenames can include wildcards. Any URI's must support OpenDAP. var_name : str, optional - Only return :class:`~iris.experimental.ugrid.mesh.Mesh` that have + Only return :class:`~iris.mesh.MeshXY` that have var_names matching this value. Returns @@ -163,24 +112,15 @@ def load_meshes(uris, var_name=None): dict A dictionary mapping each mesh-containing file path/URL in the input ``uris`` to a list of the - :class:`~iris.experimental.ugrid.mesh.Mesh` returned from each. + :class:`~iris.mesh.MeshXY` returned from each. """ - # TODO: rationalise UGRID/mesh handling once experimental.ugrid is folded - # into standard behaviour. - # No constraints or callbacks supported - these assume they are operating + # NOTE: no constraints or callbacks supported - these assume they are operating # on a Cube. - - from ...fileformats import FORMAT_AGENT - - if not PARSE_UGRID_ON_LOAD: - # Explicit behaviour, consistent with netcdf.load_cubes(), rather than - # an invisible assumption. - message = ( - f"PARSE_UGRID_ON_LOAD is {bool(PARSE_UGRID_ON_LOAD)}. Must be " - f"True to enable mesh loading." - ) - raise ValueError(message) + # NOTE: dynamic imports avoid circularity : see note with module imports + from iris.fileformats import FORMAT_AGENT + from iris.fileformats.cf import CFReader + import iris.fileformats.netcdf.loader as nc_loader if isinstance(uris, str): uris = [uris] @@ -216,7 +156,7 @@ def load_meshes(uris, var_name=None): result = {} for source in valid_sources: - with CFUGridReader(source) as cf_reader: + with CFReader(source) as cf_reader: meshes_dict = _meshes_from_cf(cf_reader) meshes = list(meshes_dict.values()) if var_name is not None: @@ -227,23 +167,19 @@ def load_meshes(uris, var_name=None): return result -############ -# Object construction. -# Helper functions, supporting netcdf.load_cubes ONLY, expected to -# altered/moved when pyke is removed. - - def _build_aux_coord(coord_var, file_path): """Construct a :class:`~iris.coords.AuxCoord`. Construct a :class:`~iris.coords.AuxCoord` from a given - :class:`~iris.experimental.ugrid.cf.CFUGridAuxiliaryCoordinateVariable`, + :class:`~iris.fileformats.cf.CFUGridAuxiliaryCoordinateVariable`, and guess its mesh axis. - todo: integrate with standard loading API post-pyke. - """ - # TODO: integrate with standard saving API when no longer 'experimental'. + # NOTE: dynamic imports avoid circularity : see note with module imports + from iris.fileformats._nc_load_rules.helpers import get_attr_units, get_names + from iris.fileformats.cf import CFUGridAuxiliaryCoordinateVariable + from iris.fileformats.netcdf import loader as nc_loader + assert isinstance(coord_var, CFUGridAuxiliaryCoordinateVariable) attributes = {} attr_units = get_attr_units(coord_var, attributes) @@ -289,16 +225,18 @@ def _build_aux_coord(coord_var, file_path): def _build_connectivity(connectivity_var, file_path, element_dims): - """Construct a :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Construct a :class:`~iris.mesh.Connectivity`. - Construct a :class:`~iris.experimental.ugrid.mesh.Connectivity` from a - given :class:`~iris.experimental.ugrid.cf.CFUGridConnectivityVariable`, + Construct a :class:`~iris.mesh.Connectivity` from a + given :class:`~iris.fileformats.cf.CFUGridConnectivityVariable`, and identify the name of its first dimension. - todo: integrate with standard loading API post-pyke. - """ - # TODO: integrate with standard saving API when no longer 'experimental'. + # NOTE: dynamic imports avoid circularity : see note with module imports + from iris.fileformats._nc_load_rules.helpers import get_attr_units, get_names + from iris.fileformats.cf import CFUGridConnectivityVariable + from iris.fileformats.netcdf import loader as nc_loader + assert isinstance(connectivity_var, CFUGridConnectivityVariable) attributes = {} attr_units = get_attr_units(connectivity_var, attributes) @@ -333,15 +271,17 @@ def _build_connectivity(connectivity_var, file_path, element_dims): def _build_mesh(cf, mesh_var, file_path): - """Construct a :class:`~iris.experimental.ugrid.mesh.Mesh`. - - Construct a :class:`~iris.experimental.ugrid.mesh.Mesh` from a given - :class:`~iris.experimental.ugrid.cf.CFUGridMeshVariable`. + """Construct a :class:`~iris.mesh.MeshXY`. - TODO: integrate with standard loading API post-pyke. + Construct a :class:`~iris.mesh.MeshXY` from a given + :class:`~iris.fileformats.cf.CFUGridMeshVariable`. """ - # TODO: integrate with standard saving API when no longer 'experimental'. + # NOTE: dynamic imports avoid circularity : see note with module imports + from iris.fileformats._nc_load_rules.helpers import get_attr_units, get_names + from iris.fileformats.cf import CFUGridMeshVariable + from iris.fileformats.netcdf import loader as nc_loader + assert isinstance(mesh_var, CFUGridMeshVariable) attributes = {} attr_units = get_attr_units(mesh_var, attributes) @@ -373,7 +313,7 @@ def _build_mesh(cf, mesh_var, file_path): if not hasattr(mesh_var, "topology_dimension"): msg = ( - f"Mesh variable {mesh_var.cf_name} has no 'topology_dimension'" + f"MeshXY variable {mesh_var.cf_name} has no 'topology_dimension'" f" : *Assuming* topology_dimension={topology_dimension}" ", consistent with the attached connectivities." ) @@ -443,7 +383,7 @@ def _build_mesh(cf, mesh_var, file_path): standard_name, long_name, var_name = get_names(mesh_var, None, attributes) - mesh = Mesh( + mesh = MeshXY( topology_dimension=topology_dimension, node_coords_and_axes=node_coord_args, connectivities=connectivity_args, @@ -468,25 +408,40 @@ def _build_mesh(cf, mesh_var, file_path): def _build_mesh_coords(mesh, cf_var): - """Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + """Construct a tuple of :class:`~iris.mesh.MeshCoord`. - Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` using - from a given :class:`~iris.experimental.ugrid.mesh.Mesh` + Construct a tuple of :class:`~iris.mesh.MeshCoord` using + from a given :class:`~iris.mesh.MeshXY` and :class:`~iris.fileformats.cf.CFVariable`. - TODO: integrate with standard loading API post-pyke. - """ - # TODO: integrate with standard saving API when no longer 'experimental'. # Identify the cube's mesh dimension, for attaching MeshCoords. element_dimensions = { "node": mesh.node_dimension, "edge": mesh.edge_dimension, "face": mesh.face_dimension, } - mesh_dim_name = element_dimensions[cf_var.location] - # (Only expecting 1 mesh dimension per cf_var). - mesh_dim = cf_var.dimensions.index(mesh_dim_name) + location = getattr(cf_var, "location", "") + if location is None or location not in element_dimensions: + # We should probably issue warnings and recover, but that is too much + # work. Raising a more intelligible error is easy to do though. + msg = ( + f"mesh data variable {cf_var.name!r} has an invalid " + f"location={location!r}." + ) + raise ValueError(msg) + mesh_dim_name = element_dimensions.get(location) + if mesh_dim_name is None: + msg = f"mesh {mesh.name!r} has no {location} dimension." + raise ValueError(msg) + if mesh_dim_name in cf_var.dimensions: + mesh_dim = cf_var.dimensions.index(mesh_dim_name) + else: + msg = ( + f"mesh data variable {cf_var.name!r} does not have the " + f"{location} mesh dimension {mesh_dim_name!r}, in its dimensions." + ) + raise ValueError(msg) mesh_coords = mesh.to_MeshCoords(location=cf_var.location) return mesh_coords, mesh_dim diff --git a/lib/iris/fileformats/nimrod.py b/lib/iris/fileformats/nimrod.py index 55927df3ef..d318c94882 100644 --- a/lib/iris/fileformats/nimrod.py +++ b/lib/iris/fileformats/nimrod.py @@ -295,15 +295,13 @@ def load_cubes(filenames, callback=None): Parameters ---------- filenames : - List of NIMROD filenames to load + List of NIMROD filenames to load. callback : optional - A function which can be passed on to :func:`iris.io.run_callback` + A function which can be passed on to :func:`iris.io.run_callback`. Notes ----- - .. note:: - - The resultant cubes may not be in the same order as in the files. + The resultant cubes may not be in the same order as in the files. """ if isinstance(filenames, str): diff --git a/lib/iris/fileformats/nimrod_load_rules.py b/lib/iris/fileformats/nimrod_load_rules.py index 16f23c8a6f..4b3987003a 100644 --- a/lib/iris/fileformats/nimrod_load_rules.py +++ b/lib/iris/fileformats/nimrod_load_rules.py @@ -126,10 +126,11 @@ def units(cube, field): "n/a": "1", } + dtype_original = cube.dtype field_units = remove_unprintable_chars(field.units) if field_units == "m/2-25k": # Handle strange visibility units - cube.data = (cube.data.astype(np.float32) + 25000.0) * 2 + cube.data = (cube.data + 25000.0) * 2 field_units = "m" if "*" in field_units: # Split into unit string and integer @@ -137,31 +138,29 @@ def units(cube, field): if "^" in unit_list[1]: # Split out magnitude unit_sublist = unit_list[1].split("^") - cube.data = cube.data.astype(np.float32) / float(unit_sublist[0]) ** float( - unit_sublist[1] - ) + cube.data = cube.data / float(unit_sublist[0]) ** float(unit_sublist[1]) else: - cube.data = cube.data.astype(np.float32) / float(unit_list[1]) + cube.data = cube.data / float(unit_list[1]) field_units = unit_list[0] if "ug/m3E1" in field_units: # Split into unit string and integer unit_list = field_units.split("E") - cube.data = cube.data.astype(np.float32) / 10.0 + cube.data = cube.data / 10.0 field_units = unit_list[0] if field_units == "%": # Convert any percentages into fraction field_units = "1" - cube.data = cube.data.astype(np.float32) / 100.0 + cube.data = cube.data / 100.0 if field_units == "oktas": field_units = "1" - cube.data = cube.data.astype(np.float32) / 8.0 + cube.data = cube.data / 8.0 if field_units == "dBZ": # cf_units doesn't recognise decibels (dBZ), but does know BZ field_units = "BZ" - cube.data = cube.data.astype(np.float32) / 10.0 + cube.data = cube.data / 10.0 if field_units == "g/Kg": field_units = "kg/kg" - cube.data = cube.data.astype(np.float32) / 1000.0 + cube.data = cube.data / 1000.0 if not field_units: if field.field_code == 8: # Relative Humidity data are unitless, but not "unknown" @@ -175,6 +174,14 @@ def units(cube, field): # Deal with the case where the units are of the form '/unit' eg # '/second' in the Nimrod file. This converts to the form unit^-1 field_units = field_units[1:] + "^-1" + + if cube.dtype != dtype_original: + # Original development logic: if any arithmetic takes place, ensure + # the data type is float32 (starts as an int). Unknown why. + # Automatic casting is returning inconsistent types when masks are + # involved, so the new logic is to do the casting as the final step. + cube.data = cube.data.astype(np.float32) + try: cube.units = field_units except ValueError: @@ -654,7 +661,7 @@ def add_attr(item): def known_threshold_coord(field): - """Supplies known threshold coord meta-data for known use cases. + """Supply known threshold coord meta-data for known use cases. threshold_value_alt exists because some meta-data are mis-assigned in the Nimrod data. @@ -895,7 +902,7 @@ def run(field, handle_metadata_errors=True): field : :class:`~iris.fileformats.nimrod.NimrodField` handle_metadata_errors : bool, default=True Set to False to omit handling of known meta-data deficiencies - in Nimrod-format data + in Nimrod-format data. Returns ------- diff --git a/lib/iris/fileformats/pp.py b/lib/iris/fileformats/pp.py index c39c1a53a7..3b38304f00 100644 --- a/lib/iris/fileformats/pp.py +++ b/lib/iris/fileformats/pp.py @@ -11,6 +11,7 @@ import os import re import struct +from typing import Any import warnings import cf_units @@ -382,8 +383,10 @@ def __init__(self, value, name_mapping_dict=None): ---------- name_mapping_dict : dict A special mapping to provide name based access to specific - integer positions: + integer positions. + Examples + -------- >>> a = SplittableInt(1234, {'hundreds': 2}) >>> print(a.hundreds) 2 @@ -604,6 +607,10 @@ def fill_value(self): def ndim(self): return len(self.shape) + @property + def dask_meta(self): + return np.empty((0,) * self.ndim, dtype=self.dtype) + def __getitem__(self, keys): with open(self.path, "rb") as pp_file: pp_file.seek(self.offset, os.SEEK_SET) @@ -944,6 +951,21 @@ def t2(self): def __repr__(self): """Return a string representation of the PP field.""" + + def _str_tuple(to_print: Any): + """Print NumPy scalars within tuples as numbers, not np objects. + + E.g. ``lbuser`` is a tuple of NumPy scalars. + + NumPy v2 by default prints ``np.int32(1)`` instead of ``1`` when + printing an iterable of scalars. + """ + if isinstance(to_print, tuple): + result = "(" + ", ".join([str(i) for i in to_print]) + ")" + else: + result = str(to_print) + return result + # Define an ordering on the basic header names attribute_priority_lookup = {name: loc[0] for name, loc in self.HEADER_DEFN} @@ -969,9 +991,8 @@ def __repr__(self): ), ) - return ( - "PP Field" + "".join(["\n %s: %s" % (k, v) for k, v in attributes]) + "\n" - ) + contents = "".join([f"\n {k}: {_str_tuple(v)}" for k, v in attributes]) + return f"PP Field{contents}\n" @property def stash(self): @@ -1172,7 +1193,7 @@ def save(self, file_handle): data.dtype = data.dtype.newbyteorder(">") # Create the arrays which will hold the header information - lb = np.empty(shape=NUM_LONG_HEADERS, dtype=np.dtype(">u%d" % PP_WORD_DEPTH)) + lb = np.empty(shape=NUM_LONG_HEADERS, dtype=np.dtype(">i%d" % PP_WORD_DEPTH)) b = np.empty(shape=NUM_FLOAT_HEADERS, dtype=np.dtype(">f%d" % PP_WORD_DEPTH)) # Fill in the header elements from the PPField @@ -1457,7 +1478,7 @@ class PPField2(PPField): @property def t1(self): - """cftime.datetime object. + """A cftime.datetime object. cftime.datetime object consisting of the lbyr, lbmon, lbdat, lbhr, and lbmin attributes. @@ -1490,7 +1511,7 @@ def t1(self, dt): @property def t2(self): - """cftime.datetime object. + """A cftime.datetime object. cftime.datetime object consisting of the lbyrd, lbmond, lbdatd, lbhrd, and lbmind attributes. @@ -1532,7 +1553,7 @@ class PPField3(PPField): @property def t1(self): - """cftime.datetime object. + """A cftime.datetime object. cftime.datetime object consisting of the lbyr, lbmon, lbdat, lbhr, lbmin, and lbsec attributes. @@ -1566,7 +1587,7 @@ def t1(self, dt): @property def t2(self): - """cftime.datetime object. + """A cftime.datetime object. cftime.datetime object consisting of the lbyrd, lbmond, lbdatd, lbhrd, lbmind, and lbsecd attributes. @@ -1620,7 +1641,7 @@ def load(filename, read_data=False, little_ended=False): Parameters ---------- filename : str - string of the filename to load. + String of the filename to load. read_data : bool, default=False Flag whether or not the data should be read, if False an empty data manager will be provided which can subsequently load the data @@ -1754,7 +1775,7 @@ def _create_field_data(field, data_shape, land_mask_field=None): if land_mask_field is None: # For a "normal" (non-landsea-masked) field, the proxy can be # wrapped directly as a deferred array. - field.data = as_lazy_data(proxy, chunks=block_shape) + field.data = as_lazy_data(proxy, meta=proxy.dask_meta, chunks=block_shape) else: # This is a landsea-masked field, and its data must be handled in # a different way : Because data shape/size is not known in @@ -1805,8 +1826,12 @@ def calc_array(mask, values): return result delayed_result = calc_array(mask_field_array, delayed_valid_values) + meta = np.ma.array(np.empty((0,) * proxy.ndim, dtype=dtype), mask=True) lazy_result_array = da.from_delayed( - delayed_result, shape=block_shape, dtype=dtype + delayed_result, + shape=block_shape, + dtype=dtype, + meta=meta, ) field.data = lazy_result_array @@ -2005,11 +2030,11 @@ def load_cubes(filenames, callback=None, constraints=None): Parameters ---------- filenames : - list of pp filenames to load - constraints : optional - A list of Iris constraints + List of pp filenames to load. callback : optional - A function which can be passed on to :func:`iris.io.run_callback` + A function which can be passed on to :func:`iris.io.run_callback`. + constraints : optional + A list of Iris constraints. Notes ----- @@ -2029,11 +2054,11 @@ def load_cubes_little_endian(filenames, callback=None, constraints=None): Parameters ---------- filenames : - list of pp filenames to load - constraints : optional - a list of Iris constraints + List of pp filenames to load. callback : optional - a function which can be passed on to :func:`iris.io.run_callback` + A function which can be passed on to :func:`iris.io.run_callback`. + constraints : optional + A list of Iris constraints. Notes ----- @@ -2146,7 +2171,7 @@ def _load_cubes_variable_loader( return result -def save(cube, target, append=False, field_coords=None): +def save(cube, target, append=False, field_coords=None, label_surface_fields=False): """Use the PP saving rules (and any user rules) to save a cube to a PP file. Parameters @@ -2161,12 +2186,17 @@ def save(cube, target, append=False, field_coords=None): handle. Default is False. field_coords : optional - list of 2 coords or coord names which are to be used + List of 2 coords or coord names which are to be used for reducing the given cube into 2d slices, which will ultimately determine the x and y coordinates of the resulting fields. If None, the final two dimensions are chosen for slicing. + label_surface_fields : bool, default=False + Whether you wish pp_save_rules to recognise surface fields or not. + When true, if surface fields are encountered, LBLEV will be set to 9999 + and LBVC to 129. + Default is False. Notes ----- @@ -2175,27 +2205,27 @@ def save(cube, target, append=False, field_coords=None): of cubes to be saved to a PP file. """ - fields = as_fields(cube, field_coords, target) + fields = as_fields(cube, field_coords, label_surface_fields=label_surface_fields) save_fields(fields, target, append=append) -def save_pairs_from_cube(cube, field_coords=None, target=None): - """Use the PP saving rules to convert a cube. - - Use the PP saving rules to convert a cube or - iterable of cubes to an iterable of (2D cube, PP field) pairs. +def save_pairs_from_cube(cube, field_coords=None, label_surface_fields=False): + """Use the PP saving rules to generate (2D cube, PP field) pairs from a cube. Parameters ---------- cube : - A :class:`iris.cube.Cube` + A :class:`iris.cube.Cube`. field_coords : optional List of 2 coords or coord names which are to be used for reducing the given cube into 2d slices, which will ultimately determine the x and y coordinates of the resulting fields. If None, the final two dimensions are chosen for slicing. - target : optional - A filename or open file handle. + + Yields + ------ + :class:`iris.cube.Cube`, :class:`iris.fileformats.pp.PPField`. + 2-dimensional slices of the input cube together with their associated pp-fields. """ # Open issues @@ -2291,12 +2321,12 @@ def save_pairs_from_cube(cube, field_coords=None, target=None): # Run the PP save rules on the slice2D, to fill the PPField, # recording the rules that were used - pp_field = verify(slice2D, pp_field) + pp_field = verify(slice2D, pp_field, label_surface_fields=label_surface_fields) yield (slice2D, pp_field) -def as_fields(cube, field_coords=None, target=None): +def as_fields(cube, field_coords=None, label_surface_fields=False): """Use the PP saving rules to convert a cube to an iterable of PP fields. Use the PP saving rules (and any user rules) to convert a cube to @@ -2310,14 +2340,17 @@ def as_fields(cube, field_coords=None, target=None): reducing the given cube into 2d slices, which will ultimately determine the x and y coordinates of the resulting fields. If None, the final two dimensions are chosen for slicing. - target : optional - A filename or open file handle. + label_surface_fields : bool, default=False + Whether you wish pp_save_rules to recognise surface fields or not. + When true, if surface fields are encountered, LBLEV will be set to 9999 + and LBVC to 129. + Default is False. """ return ( field - for cube, field in save_pairs_from_cube( - cube, field_coords=field_coords, target=target + for _, field in save_pairs_from_cube( + cube, field_coords=field_coords, label_surface_fields=label_surface_fields ) ) @@ -2339,7 +2372,8 @@ def save_fields(fields, target, append: bool = False): See Also -------- - :func:`iris.io.save`. + iris.io.save : + Save one or more Cubes to file (or other writeable). """ # Open issues diff --git a/lib/iris/fileformats/pp_load_rules.py b/lib/iris/fileformats/pp_load_rules.py index 8343afab40..71540fe74a 100644 --- a/lib/iris/fileformats/pp_load_rules.py +++ b/lib/iris/fileformats/pp_load_rules.py @@ -308,7 +308,7 @@ def _reshape_vector_args(values_and_dims): Returns ------- - reshaped_arrays : iterable of arrays + iterable object of arrays The inputs, transposed and reshaped onto common target dimensions. """ @@ -357,7 +357,7 @@ def _collapse_degenerate_points_and_bounds(points, bounds=None, rtol=1.0e-7): bounds : :class:`numpy.ndarray`, optional Array of bounds values. This array should have an additional vertex dimension (typically of length 2) when compared to the points array - i.e. bounds.shape = points.shape + (nvertex,) + i.e. bounds.shape = points.shape + (nvertex,). rtol : optional, default=1.0e-7 Returns @@ -451,18 +451,18 @@ def _new_coord_and_dims( * dimensions with all points and bounds values the same are removed. * the result coordinate may be an AuxCoord if a DimCoord cannot be made - (e.g. if values are non-monotonic). + (e.g. if values are non-monotonic). Parameters ---------- is_vector_operation : bool If True, perform 'vector' style operation. - points : array-like - Coordinate point values. name : str Standard name of coordinate. units : str or cf_unit.Unit Units of coordinate. + points : array-like + Coordinate point values. lower_and_upper_bounds : pair of array-like or None, optional Corresponding bounds values (lower, upper), if any. @@ -932,7 +932,7 @@ def convert(f): def _all_other_rules(f): - """Deals with all the other rules. + """Deal with all the other rules. Deals with all the other rules that have not been factored into any of the other convert_scalar_coordinate functions above. diff --git a/lib/iris/fileformats/pp_save_rules.py b/lib/iris/fileformats/pp_save_rules.py index 73331268e4..b156260f72 100644 --- a/lib/iris/fileformats/pp_save_rules.py +++ b/lib/iris/fileformats/pp_save_rules.py @@ -26,7 +26,7 @@ def _basic_coord_system_rules(cube, pp): - """Rules for setting the coord system of the PP field. + """Rule for setting the coord system of the PP field. Parameters ---------- @@ -80,7 +80,7 @@ def _um_version_rules(cube, pp): def _stash_rules(cube, pp): - """Attributes rules for setting the STASH attribute of the PP field. + """Attribute rules for setting the STASH attribute of the PP field. Parameters ---------- @@ -103,7 +103,7 @@ def _stash_rules(cube, pp): def _general_time_rules(cube, pp): - """Rules for setting time metadata of the PP field. + """Rule for setting time metadata of the PP field. Parameters ---------- @@ -377,7 +377,7 @@ def _general_time_rules(cube, pp): def _calendar_rules(cube, pp): - """Rules for setting the calendar of the PP field. + """Rule for setting the calendar of the PP field. Parameters ---------- @@ -403,7 +403,7 @@ def _calendar_rules(cube, pp): def _grid_and_pole_rules(cube, pp): - """Rules for setting the horizontal grid and pole location of the PP field. + """Rule for setting the horizontal grid and pole location of the PP field. Parameters ---------- @@ -485,7 +485,7 @@ def _grid_and_pole_rules(cube, pp): def _non_std_cross_section_rules(cube, pp): - """Rules for applying non-standard cross-sections to the PP field. + """Rule for applying non-standard cross-sections to the PP field. Parameters ---------- @@ -616,7 +616,7 @@ def _non_std_cross_section_rules(cube, pp): def _lbproc_rules(cube, pp): - """Rules for setting the processing code of the PP field. + """Rule for setting the processing code of the PP field. Note: `pp.lbproc` must be set to 0 before these rules are run. @@ -663,8 +663,8 @@ def _lbproc_rules(cube, pp): return pp -def _vertical_rules(cube, pp): - """Rules for setting vertical levels for the PP field. +def _vertical_rules(cube, pp, label_surface_fields=False): + """Rule for setting vertical levels for the PP field. Parameters ---------- @@ -773,6 +773,22 @@ def _vertical_rules(cube, pp): pp.brsvd[0] = depth_coord.bounds[0, 0] pp.brlev = depth_coord.bounds[0, 1] + # Surface field. + if ( + height_coord is None + and depth_coord is None + and pressure_coord is None + and soil_mln_coord is None + and apt_coord is None + and air_pres_coord is None + and level_height_coord is None + and mln_coord is None + and sigma_coord is None + and label_surface_fields + ): + pp.lbvc = 129 + pp.lblev = 9999 + # Single potential-temperature level. if ( apt_coord is not None @@ -849,7 +865,7 @@ def _vertical_rules(cube, pp): def _all_other_rules(cube, pp): - """Fields currently managed by these rules. + """Field currently managed by these rules. * lbfc (field code) * lbrsvd[3] (ensemble member number) @@ -883,7 +899,7 @@ def _all_other_rules(cube, pp): return pp -def verify(cube, field): +def verify(cube, field, label_surface_fields=False): # Rules functions. field = _basic_coord_system_rules(cube, field) field = _um_version_rules(cube, field) @@ -893,7 +909,7 @@ def verify(cube, field): field = _grid_and_pole_rules(cube, field) field = _non_std_cross_section_rules(cube, field) field = _lbproc_rules(cube, field) - field = _vertical_rules(cube, field) + field = _vertical_rules(cube, field, label_surface_fields=label_surface_fields) field = _all_other_rules(cube, field) return field diff --git a/lib/iris/fileformats/rules.py b/lib/iris/fileformats/rules.py index be04f0bb5d..2a1a74f374 100644 --- a/lib/iris/fileformats/rules.py +++ b/lib/iris/fileformats/rules.py @@ -5,6 +5,7 @@ """Generalised mechanisms for metadata translation and cube construction.""" import collections +import threading import warnings import cf_units @@ -143,7 +144,11 @@ class _ReferenceError(Exception): def _dereference_args(factory, reference_targets, regrid_cache, cube): - """Convert all the arguments for a factory into concrete coordinates.""" + """Convert all the arguments for a factory into concrete coordinates. + + Note: where multiple reference fields define an additional dimension, this routine + returns a modified 'cube', with the necessary additional dimensions. + """ args = [] for arg in factory.args: if isinstance(arg, Reference): @@ -151,7 +156,7 @@ def _dereference_args(factory, reference_targets, regrid_cache, cube): src = reference_targets[arg.name].as_cube() # If necessary, regrid the reference cube to # match the grid of this cube. - src = _ensure_aligned(regrid_cache, src, cube) + src, cube = _ensure_aligned(regrid_cache, src, cube) if src is not None: new_coord = iris.coords.AuxCoord( src.data, @@ -178,7 +183,8 @@ def _dereference_args(factory, reference_targets, regrid_cache, cube): # If it wasn't a Reference, then arg is a dictionary # of keyword arguments for cube.coord(...). args.append(cube.coord(**arg)) - return args + + return args, cube def _regrid_to_target(src_cube, target_coords, target_cube): @@ -211,9 +217,9 @@ def _ensure_aligned(regrid_cache, src_cube, target_cube): # Check that each of src_cube's dim_coords matches up with a single # coord on target_cube. try: - target_coords = [] + target_dimcoords = [] for dim_coord in src_cube.dim_coords: - target_coords.append(target_cube.coord(dim_coord)) + target_dimcoords.append(target_cube.coord(dim_coord)) except iris.exceptions.CoordinateNotFoundError: # One of the src_cube's dim_coords didn't exist on the # target_cube... so we can't regrid (i.e. just return None). @@ -222,7 +228,32 @@ def _ensure_aligned(regrid_cache, src_cube, target_cube): # So we can use `iris.analysis.interpolate.linear()` later, # ensure each target coord is either a scalar or maps to a # single, distinct dimension. - target_dims = [target_cube.coord_dims(coord) for coord in target_coords] + # PP-MOD: first promote any scalar coords when needed as dims + for target_coord in target_dimcoords: + from iris import LOAD_POLICY + + if ( + not target_cube.coord_dims(target_coord) + and LOAD_POLICY.support_multiple_references + ): + # The chosen coord is not a dimcoord in the target (yet) + # Make it one with 'new_axis' + from iris.util import new_axis + + _MULTIREF_DETECTION.found_multiple_refs = True + # Include the other coords on that dim in the src : this means the + # src merge identifies which belong on that dim + # (e.g. 'forecast_period' along with 'time') + (src_dim,) = src_cube.coord_dims(target_coord) # should have 1 dim + promote_other_coords = [ + target_cube.coord(src_coord) + for src_coord in src_cube.coords(contains_dimension=src_dim) + if src_coord.name() != target_coord.name() + ] + target_cube = new_axis( + target_cube, target_coord, expand_extras=promote_other_coords + ) + target_dims = [target_cube.coord_dims(coord) for coord in target_dimcoords] target_dims = list(filter(None, target_dims)) unique_dims = set() for dims in target_dims: @@ -236,25 +267,27 @@ def _ensure_aligned(regrid_cache, src_cube, target_cube): grids, cubes = regrid_cache[cache_key] # 'grids' is a list of tuples of coordinates, so convert # the 'target_coords' list into a tuple to be consistent. - target_coords = tuple(target_coords) + target_dimcoords = tuple(target_dimcoords) try: # Look for this set of target coordinates in the cache. - i = grids.index(target_coords) + i = grids.index(target_dimcoords) result_cube = cubes[i] except ValueError: # Not already cached, so do the hard work of interpolating. - result_cube = _regrid_to_target(src_cube, target_coords, target_cube) + result_cube = _regrid_to_target(src_cube, target_dimcoords, target_cube) # Add it to the cache. - grids.append(target_coords) + grids.append(target_dimcoords) cubes.append(result_cube) - return result_cube - + return result_cube, target_cube -_loader_attrs = ("field_generator", "field_generator_kwargs", "converter") - -class Loader(collections.namedtuple("Loader", _loader_attrs)): +class Loader( + collections.namedtuple( + "Loader", + ("field_generator", "field_generator_kwargs", "converter"), + ) +): def __new__(cls, field_generator, field_generator_kwargs, converter): """Create a definition of a field-based Cube loader. @@ -329,7 +362,7 @@ def _resolve_factory_references( # across multiple result cubes. for factory in factories: try: - args = _dereference_args( + args, cube = _dereference_args( factory, concrete_reference_targets, regrid_cache, cube ) except _ReferenceError as e: @@ -343,6 +376,34 @@ def _resolve_factory_references( aux_factory = factory.factory_class(*args) cube.add_aux_factory(aux_factory) + # In the case of multiple references which vary on a new dimension + # (such as time-dependent orography or surface-pressure), the cube may get replaced + # by one with a new dimension. + # In that case we must update the factory so its dependencies are coords of the + # new cube. + cube_coord_ids = [ + id(coord) for coord, _ in cube._dim_coords_and_dims + cube._aux_coords_and_dims + ] + for factory in cube.aux_factories: + for name, dep in list(factory.dependencies.items()): + if dep and id(dep) not in cube_coord_ids: + factory.update(dep, cube.coord(dep)) + + return cube + + +class MultipleReferenceFieldDetector(threading.local): + def __init__(self): + self.found_multiple_refs = False + + +# A single global object (per thread) to record whether multiple reference fields +# (e.g. time-dependent orography, or surface pressure fields) have been detected during +# the latest load operation. +# This is used purely to implement the iris.LOAD_POLICY.multiref_triggers_concatenate +# functionality. +_MULTIREF_DETECTION = MultipleReferenceFieldDetector() + def _load_pairs_from_fields_and_filenames( fields_and_filenames, converter, user_callback_wrapper=None @@ -353,6 +414,7 @@ def _load_pairs_from_fields_and_filenames( # needs a filename associated with each field to support the load callback. concrete_reference_targets = {} results_needing_reference = [] + for field, filename in fields_and_filenames: # Convert the field to a Cube, passing down the 'converter' function. cube, factories, references = _make_cube(field, converter) @@ -381,7 +443,7 @@ def _load_pairs_from_fields_and_filenames( regrid_cache = {} for cube, factories, field in results_needing_reference: - _resolve_factory_references( + cube = _resolve_factory_references( cube, factories, concrete_reference_targets, regrid_cache ) yield (cube, field) diff --git a/lib/iris/fileformats/um/_ff_replacement.py b/lib/iris/fileformats/um/_ff_replacement.py index 52afe343c3..e36260a335 100644 --- a/lib/iris/fileformats/um/_ff_replacement.py +++ b/lib/iris/fileformats/um/_ff_replacement.py @@ -56,9 +56,9 @@ def load_cubes(filenames, callback, constraints=None, _loader_kwargs=None): Parameters ---------- filenames : - list of filenames to load + List of filenames to load. callback : optional - A function which can be passed on to :func:`iris.io.run_callback` + A function which can be passed on to :func:`iris.io.run_callback`. constraints : optional _loader_kwargs : optional @@ -86,7 +86,7 @@ def load_cubes_32bit_ieee(filenames, callback, constraints=None): See Also -------- :func:`load_cubes` - For keyword details + For keyword details. """ return load_cubes( diff --git a/lib/iris/fileformats/um/_optimal_array_structuring.py b/lib/iris/fileformats/um/_optimal_array_structuring.py index 7d006ebeff..f4e0328a42 100644 --- a/lib/iris/fileformats/um/_optimal_array_structuring.py +++ b/lib/iris/fileformats/um/_optimal_array_structuring.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """A module to provide an optimal array structure calculation.""" - from iris.fileformats._structured_array_identification import GroupStructure diff --git a/lib/iris/io/__init__.py b/lib/iris/io/__init__.py index d5896f25a4..50f0f3c4e6 100644 --- a/lib/iris/io/__init__.py +++ b/lib/iris/io/__init__.py @@ -153,11 +153,11 @@ def expand_filespecs(file_specs, files_expected=True): Returns ------- list of str - if files_expected is ``True``: + If files_expected is ``True``: A well-ordered list of matching absolute file paths. If any of the file-specs match no existing files, an exception is raised. - if files_expected is ``False``: + If files_expected is ``False``: A list of expanded file paths. """ # Remove any hostname component - currently unused @@ -334,7 +334,8 @@ def add_saver(file_extension, new_saver): See Also -------- - :func:`iris.io.save` + iris.io.save : + Save one or more Cubes to file (or other writeable). """ # Make sure it's a func with 2+ args diff --git a/lib/iris/io/format_picker.py b/lib/iris/io/format_picker.py index d5e54d231a..c885a55074 100644 --- a/lib/iris/io/format_picker.py +++ b/lib/iris/io/format_picker.py @@ -84,6 +84,19 @@ def __str__(self): ["%s" % format_spec for format_spec in self._format_specs] ) + def __eq__(self, other): + return self._format_specs == other._format_specs + + def copy(self): + """Return a copy of the format agent. + + Returns + ------- + FormatAgent + A copy of the format agent. + """ + return FormatAgent(self._format_specs.copy()) + def get_spec(self, basename, buffer_obj): """Pick the first FormatSpecification. @@ -175,21 +188,22 @@ def __init__( Parameters ---------- format_name : str - string name of fileformat being described + String name of fileformat being described. file_element : FileElement instance of the element which identifies this - FormatSpecification + FormatSpecification. file_element_value : The value that the file_element should take if a file matches this - FormatSpecification + FormatSpecification. handler : optional - function which will be called when the specification has been + Function which will be called when the specification has been identified and is required to handler a format. If None, then the file can still be identified but no handling can be done. - priority: int + priority : int Integer giving a priority for considering this specification where higher priority means sooner consideration. - constraint_aware_handler: default=False + constraint_aware_handler : default=False + """ if not isinstance(file_element, FileElement): raise ValueError( diff --git a/lib/iris/experimental/ugrid/__init__.py b/lib/iris/mesh/__init__.py similarity index 62% rename from lib/iris/experimental/ugrid/__init__.py rename to lib/iris/mesh/__init__.py index ccdf05a387..9a2c10b7ca 100644 --- a/lib/iris/experimental/ugrid/__init__.py +++ b/lib/iris/mesh/__init__.py @@ -6,24 +6,19 @@ """Infra-structure for unstructured mesh support. Based on CF UGRID Conventions (v1.0), https://ugrid-conventions.github.io/ugrid-conventions/. +""" -.. note:: - - For the docstring of :const:`PARSE_UGRID_ON_LOAD`: see the original - definition at :const:`iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. +from iris.config import get_logger +from iris.fileformats.netcdf.saver import save_mesh +from iris.fileformats.netcdf.ugrid_load import load_mesh, load_meshes -""" -from ...config import get_logger -from .load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes -from .mesh import Connectivity, Mesh, MeshCoord -from .save import save_mesh +from .components import Connectivity, MeshCoord, MeshXY from .utils import recombine_submeshes __all__ = [ "Connectivity", - "Mesh", "MeshCoord", - "PARSE_UGRID_ON_LOAD", + "MeshXY", "load_mesh", "load_meshes", "recombine_submeshes", diff --git a/lib/iris/experimental/ugrid/mesh.py b/lib/iris/mesh/components.py similarity index 85% rename from lib/iris/experimental/ugrid/mesh.py rename to lib/iris/mesh/components.py index a2519f250b..ef7b7c3575 100644 --- a/lib/iris/experimental/ugrid/mesh.py +++ b/lib/iris/mesh/components.py @@ -8,23 +8,28 @@ Eventual destination: dedicated module in :mod:`iris` root. """ + from abc import ABC, abstractmethod from collections import namedtuple from collections.abc import Container -from typing import Iterable +from contextlib import contextmanager +from typing import Iterable, Literal +import warnings from cf_units import Unit from dask import array as da import numpy as np -from ... import _lazy_data as _lazy -from ...common import CFVariableMixin, metadata_filter, metadata_manager_factory -from ...common.metadata import BaseMetadata -from ...config import get_logger -from ...coords import AuxCoord, _DimensionalMetadata -from ...exceptions import ConnectivityNotFoundError, CoordinateNotFoundError -from ...util import array_equal, clip_string, guess_coord_axis -from .metadata import ConnectivityMetadata, MeshCoordMetadata, MeshMetadata +from iris.common.metadata import ConnectivityMetadata, MeshCoordMetadata, MeshMetadata + +from .. import _lazy_data as _lazy +from ..common import CFVariableMixin, metadata_filter, metadata_manager_factory +from ..common.metadata import BaseMetadata +from ..config import get_logger +from ..coords import AuxCoord, _DimensionalMetadata +from ..exceptions import ConnectivityNotFoundError, CoordinateNotFoundError +from ..util import array_equal, clip_string, guess_coord_axis +from ..warnings import IrisVagueMetadataWarning # Configure the logger. logger = get_logger(__name__, propagate=True, handler=False) @@ -35,7 +40,7 @@ NP_PRINTOPTIONS_EDGEITEMS = 2 # -# Mesh dimension names namedtuples. +# MeshXY dimension names namedtuples. # #: Namedtuple for 1D mesh topology NetCDF variable dimension names. @@ -46,7 +51,7 @@ ) # -# Mesh coordinate manager namedtuples. +# MeshXY coordinate manager namedtuples. # #: Namedtuple for 1D mesh :class:`~iris.coords.AuxCoord` coordinates. @@ -64,12 +69,12 @@ MeshFaceCoords = namedtuple("MeshFaceCoords", ["face_x", "face_y"]) # -# Mesh connectivity manager namedtuples. +# MeshXY connectivity manager namedtuples. # -#: Namedtuple for 1D mesh :class:`~iris.experimental.ugrid.mesh.Connectivity` instances. +#: Namedtuple for 1D mesh :class:`~iris.mesh.Connectivity` instances. Mesh1DConnectivities = namedtuple("Mesh1DConnectivities", ["edge_node"]) -#: Namedtuple for 2D mesh :class:`~iris.experimental.ugrid.mesh.Connectivity` instances. +#: Namedtuple for 2D mesh :class:`~iris.mesh.Connectivity` instances. Mesh2DConnectivities = namedtuple( "Mesh2DConnectivities", [ @@ -575,20 +580,60 @@ def xml_element(self, doc): return element -class Mesh(CFVariableMixin): +class Mesh(CFVariableMixin, ABC): """A container representing the UGRID ``cf_role`` ``mesh_topology``. - A container representing the UGRID ``cf_role`` ``mesh_topology``, supporting - 1D network, 2D triangular, and 2D flexible mesh topologies. + Warnings + -------- + This class is not yet implemented. It is a placeholder for a future + implementation of the UGRID mesh with the minimum possible assumptions. For + instance: it is in theory possible for mesh node coordinates to be ANY + combination of ANY coordinate type, e.g. spherical coordinates or an S2 + coordinate; the current :class:`MeshXY` subclass is based on the assumption + of an X and a Y coordinate (e.g. longitude and latitude). + + .. todo:: + If SciTools/iris#5994 is agreed upon: implement this class. + - Move whatever is appropriate from :class:`MeshXY` into this class, + leaving behind only those elements specific to the assumption of + X and Y node coordinates. + - Remove the docstring warning, the NotImplementedError, and the uses + of ABC/abstractmethod. + - Add a cross-reference in the docstring for :class:`MeshXY`. + - Search the Iris codebase for uses of :class:`MeshXY` and work out + if/how they can be refactored to work with the more flexible + :class:`Mesh`. + + """ + + @abstractmethod + def __init__(self): + message = ( + f"The {self.__class__.__name__} class is not yet implemented. " + "Use the MeshXY class instead." + ) + raise NotImplementedError(message) - .. note:: - The 3D layered and fully 3D unstructured mesh topologies are not supported - at this time. +class MeshXY(Mesh): + """A container representing the UGRID ``cf_role`` ``mesh_topology``. - .. seealso:: + A container representing the UGRID [1]_ ``cf_role`` ``mesh_topology``, supporting + 1D network, 2D triangular, and 2D flexible mesh topologies. - The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ + Based on the assumption of 2 :attr:`node_coords` - one associated with the + X-axis (e.g. longitude) and 1 with the Y-axis (e.g. latitude). UGRID + describing alternative node coordinates (e.g. spherical) cannot be + represented. + + Notes + ----- + The 3D layered and fully 3D unstructured mesh topologies are not supported + at this time. + + References + ---------- + .. [1] The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ """ @@ -616,7 +661,7 @@ def __init__( edge_dimension=None, face_dimension=None, ): - """Mesh initialise. + """MeshXY initialise. .. note:: @@ -693,38 +738,38 @@ def normalise(element, axis): @classmethod def from_coords(cls, *coords): - r"""Construct a :class:`Mesh` by derivation from one or more :class:`~iris.coords.Coord`. + r"""Construct a :class:`MeshXY` by derivation from 1/more :class:`~iris.coords.Coord`. - The :attr:`~Mesh.topology_dimension`, :class:`~iris.coords.Coord` + The :attr:`~MeshXY.topology_dimension`, :class:`~iris.coords.Coord` membership and :class:`Connectivity` membership are all determined based on the shape of the first :attr:`~iris.coords.Coord.bounds`: * ``None`` or ``(n, <2)``: Not supported * ``(n, 2)``: - :attr:`~Mesh.topology_dimension` = ``1``. - :attr:`~Mesh.node_coords` and :attr:`~Mesh.edge_node_connectivity` + :attr:`~MeshXY.topology_dimension` = ``1``. + :attr:`~MeshXY.node_coords` and :attr:`~MeshXY.edge_node_connectivity` constructed from :attr:`~iris.coords.Coord.bounds`. - :attr:`~Mesh.edge_coords` constructed from + :attr:`~MeshXY.edge_coords` constructed from :attr:`~iris.coords.Coord.points`. * ``(n, >=3)``: - :attr:`~Mesh.topology_dimension` = ``2``. - :attr:`~Mesh.node_coords` and :attr:`~Mesh.face_node_connectivity` + :attr:`~MeshXY.topology_dimension` = ``2``. + :attr:`~MeshXY.node_coords` and :attr:`~MeshXY.face_node_connectivity` constructed from :attr:`~iris.coords.Coord.bounds`. - :attr:`~Mesh.face_coords` constructed from + :attr:`~MeshXY.face_coords` constructed from :attr:`~iris.coords.Coord.points`. Parameters ---------- *coords : Iterable of :class:`~iris.coords.Coord` - Coordinates to pass into the :class:`Mesh`. + Coordinates to pass into the :class:`MeshXY`. All :attr:`~iris.coords.Coord.points` must have the same shapes; all :attr:`~iris.coords.Coord.bounds` must have the same shapes, and must not be ``None``. Returns ------- - :class:`Mesh` + :class:`MeshXY` Notes ----- @@ -733,7 +778,7 @@ def from_coords(cls, *coords): computational intensity. .. note:: - :class:`Mesh` currently requires ``X`` and ``Y`` + :class:`MeshXY` currently requires ``X`` and ``Y`` :class:`~iris.coords.Coord` specifically. :meth:`iris.util.guess_coord_axis` is therefore attempted, else the first two :class:`~iris.coords.Coord` are taken. @@ -741,15 +786,13 @@ def from_coords(cls, *coords): .. testsetup:: from iris import load_cube, sample_data_path - from iris.experimental.ugrid import ( - PARSE_UGRID_ON_LOAD, - Mesh, + from iris.mesh import ( + MeshXY, MeshCoord, ) file_path = sample_data_path("mesh_C4_synthetic_float.nc") - with PARSE_UGRID_ON_LOAD.context(): - cube_w_mesh = load_cube(file_path) + cube_w_mesh = load_cube(file_path) Examples -------- @@ -777,7 +820,7 @@ def from_coords(cls, *coords): latitude: AuxCoord longitude: AuxCoord - >>> new_mesh = Mesh.from_coords(*orig_coords) + >>> new_mesh = MeshXY.from_coords(*orig_coords) >>> new_coords = new_mesh.to_MeshCoords(location=cube_w_mesh.location) # Replace the AuxCoords with MeshCoords. @@ -862,6 +905,7 @@ def check_shape(array_name): ##### # TODO: remove axis assignment once Mesh supports arbitrary coords. + # TODO: consider filtering coords as the first action in this method. axes_present = [guess_coord_axis(coord) for coord in coords] axes_required = ("X", "Y") if all([req in axes_present for req in axes_required]): @@ -895,7 +939,7 @@ def axes_assign(coord_list): def __eq__(self, other): result = NotImplemented - if isinstance(other, Mesh): + if isinstance(other, MeshXY): result = self.metadata == other.metadata if result: result = self.all_coords == other.all_coords @@ -923,17 +967,17 @@ def __ne__(self, other): return result def summary(self, shorten=False): - """Return a string representation of the Mesh. + """Return a string representation of the MeshXY. Parameters ---------- shorten : bool, default=False - If True, produce a oneline string form of the form . + If True, produce a oneline string form of the form . If False, produce a multi-line detailed print output. Returns ------- - result : str + str """ if shorten: @@ -958,11 +1002,11 @@ def _summary_oneline(self): mesh_name = None if mesh_name: # Use a more human-readable form - mesh_string = f"" + mesh_string = f"" else: # Mimic the generic object.__str__ style. mesh_id = id(self) - mesh_string = f"" + mesh_string = f"" return mesh_string @@ -976,7 +1020,7 @@ def line(text, i_indent=0): indent = indent_str * i_indent lines.append(f"{indent}{text}") - line(f"Mesh : '{self.name()}'") + line(f"MeshXY : '{self.name()}'") line(f"topology_dimension: {self.topology_dimension}", 1) for element in ("node", "edge", "face"): if element == "node": @@ -997,8 +1041,7 @@ def line(text, i_indent=0): main_conn_string = main_conn.summary(shorten=True, linewidth=0) line(f"{main_conn_name}: {main_conn_string}", 2) # Print coords - include_key = f"include_{element}s" - coords = self.coords(**{include_key: True}) + coords = self.coords(location=element) if coords: line(f"{element} coordinates", 2) for coord in coords: @@ -1092,28 +1135,28 @@ def _set_dimension_names(self, node, edge, face, reset=False): @property def all_connectivities(self): - """All the :class:`~iris.experimental.ugrid.mesh.Connectivity` instances of the :class:`Mesh`.""" + """All the :class:`~iris.mesh.Connectivity` instances of the :class:`MeshXY`.""" return self._connectivity_manager.all_members @property def all_coords(self): - """All the :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """All the :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.all_members @property def boundary_node_connectivity(self): - """The *optional* UGRID ``boundary_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``boundary_node_connectivity`` :class:`~iris.mesh.Connectivity`. The *optional* UGRID ``boundary_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`. """ return self._connectivity_manager.boundary_node @property def edge_coords(self): - """The *optional* UGRID ``edge`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The *optional* UGRID ``edge`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.edge_coords @property @@ -1131,31 +1174,31 @@ def edge_dimension(self, name): @property def edge_face_connectivity(self): - """The *optional* UGRID ``edge_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``edge_face_connectivity`` :class:`~iris.mesh.Connectivity`. The *optional* UGRID ``edge_face_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`. """ return self._connectivity_manager.edge_face @property def edge_node_connectivity(self): - """The UGRID ``edge_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The UGRID ``edge_node_connectivity`` :class:`~iris.mesh.Connectivity`. The UGRID ``edge_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`, which is **required** for :attr:`Mesh.topology_dimension` + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` of ``1``, and *optionally required* for - :attr:`Mesh.topology_dimension` ``>=2``. + :attr:`MeshXY.topology_dimension` ``>=2``. """ return self._connectivity_manager.edge_node @property def face_coords(self): - """The *optional* UGRID ``face`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The *optional* UGRID ``face`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.face_coords @property @@ -1182,11 +1225,11 @@ def face_dimension(self, name): @property def face_edge_connectivity(self): - """The *optional* UGRID ``face_edge_connectivity``:class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``face_edge_connectivity``:class:`~iris.mesh.Connectivity`. The *optional* UGRID ``face_edge_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`. """ # optional @@ -1194,23 +1237,23 @@ def face_edge_connectivity(self): @property def face_face_connectivity(self): - """The *optional* UGRID ``face_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``face_face_connectivity`` :class:`~iris.mesh.Connectivity`. The *optional* UGRID ``face_face_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`. """ return self._connectivity_manager.face_face @property def face_node_connectivity(self): - """Return ``face_node_connectivity``:class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Return ``face_node_connectivity``:class:`~iris.mesh.Connectivity`. The UGRID ``face_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`, which is **required** for :attr:`Mesh.topology_dimension` - of ``2``, and *optionally required* for :attr:`Mesh.topology_dimension` + :class:`~iris.mesh.Connectivity` of the + :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` + of ``2``, and *optionally required* for :attr:`MeshXY.topology_dimension` of ``3``. """ @@ -1218,7 +1261,7 @@ def face_node_connectivity(self): @property def node_coords(self): - """The **required** UGRID ``node`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The **required** UGRID ``node`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.node_coords @property @@ -1235,14 +1278,14 @@ def node_dimension(self, name): self._metadata_manager.node_dimension = node_dimension def add_connectivities(self, *connectivities): - """Add one or more :class:`~iris.experimental.ugrid.mesh.Connectivity` instances to the :class:`Mesh`. + """Add one or more :class:`~iris.mesh.Connectivity` instances to the :class:`MeshXY`. Parameters ---------- *connectivities : iterable of object A collection of one or more - :class:`~iris.experimental.ugrid.mesh.Connectivity` instances to - add to the :class:`Mesh`. + :class:`~iris.mesh.Connectivity` instances to + add to the :class:`MeshXY`. """ self._connectivity_manager.add(*connectivities) @@ -1256,7 +1299,7 @@ def add_coords( face_x=None, face_y=None, ): - """Add one or more :class:`~iris.coords.AuxCoord` coordinates to the :class:`Mesh`. + """Add one or more :class:`~iris.coords.AuxCoord` coordinates to the :class:`MeshXY`. Parameters ---------- @@ -1300,17 +1343,17 @@ def connectivities( contains_edge=None, contains_face=None, ): - """Return all :class:`~iris.experimental.ugrid.mesh.Connectivity`. + r"""Return all :class:`~iris.mesh.Connectivity`\s. - Return all :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances from the :class:`Mesh` that match the provided criteria. + Return all :class:`~iris.mesh.Connectivity` + instances from the :class:`~iris.mesh.MeshXY` which match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. .. seealso:: - :meth:`Mesh.connectivity` for matching exactly one connectivity. + :meth:`MeshXY.connectivity` for matching exactly one connectivity. Parameters ---------- @@ -1324,45 +1367,45 @@ def connectivities( * a connectivity or metadata instance equal to that of the desired objects e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.mesh.Connectivity` or + :class:`~iris.common.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. Returns ------- - list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances from the :class:`Mesh` that matched the given criteria. + list of :class:`~iris.mesh.Connectivity` + A list of :class:`~iris.mesh.Connectivity` + instances from the :class:`MeshXY` that matched the given criteria. """ result = self._connectivity_manager.filters( @@ -1390,10 +1433,10 @@ def connectivity( contains_edge=None, contains_face=None, ): - """Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Return a single :class:`~iris.mesh.Connectivity`. - Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity` - from the :class:`Mesh` that matches the provided criteria. + Return a single :class:`~iris.mesh.Connectivity` + from the :class:`MeshXY` that matches the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1401,12 +1444,12 @@ def connectivity( .. note:: If the given criteria do not return **precisely one** - :class:`~iris.experimental.ugrid.mesh.Connectivity`, then a + :class:`~iris.mesh.Connectivity`, then a :class:`~iris.exceptions.ConnectivityNotFoundError` is raised. .. seealso:: - :meth:`Mesh.connectivities` for matching zero or more connectivities. + :meth:`MeshXY.connectivities` for matching zero or more connectivities. Parameters ---------- @@ -1420,45 +1463,45 @@ def connectivity( * a connectivity or metadata instance equal to that of the desired object e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.mesh.Connectivity` or + :class:`~iris.common.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. Returns ------- - :class:`~iris.experimental.ugrid.mesh.Connectivity` - The :class:`~iris.experimental.ugrid.mesh.Connectivity` from the - :class:`Mesh` that matched the given criteria. + :class:`~iris.mesh.Connectivity` + The :class:`~iris.mesh.Connectivity` from the + :class:`MeshXY` that matched the given criteria. """ result = self._connectivity_manager.filter( @@ -1482,14 +1525,12 @@ def coord( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): """Return a single :class:`~iris.coords.AuxCoord` coordinate. Return a single :class:`~iris.coords.AuxCoord` coordinate from the - :class:`Mesh` that matches the provided criteria. + :class:`MeshXY` that matches the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1501,7 +1542,7 @@ def coord( .. seealso:: - :meth:`Mesh.coords` for matching zero or more coordinates. + :meth:`MeshXY.coords` for matching zero or more coordinates. Parameters ---------- @@ -1532,17 +1573,13 @@ def coord( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- :class:`~iris.coords.AuxCoord` - The :class:`~iris.coords.AuxCoord` coordinate from the :class:`Mesh` + The :class:`~iris.coords.AuxCoord` coordinate from the :class:`MeshXY` that matched the given criteria. """ @@ -1553,9 +1590,7 @@ def coord( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) return list(result.values())[0] @@ -1567,21 +1602,19 @@ def coords( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): - """Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`Mesh`. + """Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`MeshXY`. - Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`Mesh` that - match the provided criteria. + Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`MeshXY` + which match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. .. seealso:: - :meth:`Mesh.coord` for matching exactly one coordinate. + :meth:`MeshXY.coord` for matching exactly one coordinate. Parameters ---------- @@ -1612,18 +1645,14 @@ def coords( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- list of :class:`~iris.coords.AuxCoord` A list of :class:`~iris.coords.AuxCoord` coordinates from the - :class:`Mesh` that matched the given criteria. + :class:`MeshXY` that matched the given criteria. """ result = self._coord_manager.filters( @@ -1633,9 +1662,7 @@ def coords( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) return list(result.values()) @@ -1651,10 +1678,10 @@ def remove_connectivities( contains_edge=None, contains_face=None, ): - """Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Remove one or more :class:`~iris.mesh.Connectivity`. - Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity` - from the :class:`Mesh` that match the provided criteria. + Remove one or more :class:`~iris.mesh.Connectivity` + from the :class:`MeshXY` which match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1671,45 +1698,45 @@ def remove_connectivities( * a connectivity or metadata instance equal to that of the desired objects e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.mesh.Connectivity` or + :class:`~iris.common.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.common.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. Returns ------- - list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances removed from the :class:`Mesh` that matched the given + list of :class:`~iris.mesh.Connectivity` + A list of :class:`~iris.mesh.Connectivity` + instances removed from the :class:`MeshXY` that matched the given criteria. """ @@ -1733,14 +1760,12 @@ def remove_coords( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): - """Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`Mesh`. + """Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`MeshXY`. - Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`Mesh` - that match the provided criteria. + Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`MeshXY` + which match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1774,42 +1799,30 @@ def remove_coords( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched - for potential removal. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched - for potential removal. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched - for potential removal. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- list of :class:`~iris.coords.AuxCoord` A list of :class:`~iris.coords.AuxCoord` coordinates removed from - the :class:`Mesh` that matched the given criteria. + the :class:`MeshXY` that matched the given criteria. """ - # Filter out absent arguments - only expecting face coords sometimes, - # same will be true of volumes in future. - kwargs = { - "item": item, - "standard_name": standard_name, - "long_name": long_name, - "var_name": var_name, - "attributes": attributes, - "axis": axis, - "include_nodes": include_nodes, - "include_edges": include_edges, - "include_faces": include_faces, - } - kwargs = {k: v for k, v in kwargs.items() if v} + result = self._coord_manager.remove( + item=item, + standard_name=standard_name, + long_name=long_name, + var_name=var_name, + attributes=attributes, + axis=axis, + location=location, + ) - return self._coord_manager.remove(**kwargs) + return result def xml_element(self, doc): - """Create the :class:`xml.dom.minidom.Element` that describes this :class:`Mesh`. + """Create the :class:`xml.dom.minidom.Element` that describes this :class:`MeshXY`. Parameters ---------- @@ -1820,7 +1833,7 @@ def xml_element(self, doc): ------- :class:`xml.dom.minidom.Element` The :class:`xml.dom.minidom.Element` that will describe this - :class:`Mesh`, and the dictionary of attributes that require + :class:`MeshXY`, and the dictionary of attributes that require to be added to this element. """ @@ -1840,10 +1853,10 @@ def xml_element(self, doc): # # return the lazy AuxCoord(...), AuxCoord(...) def to_MeshCoord(self, location, axis): - """Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + """Generate a :class:`~iris.mesh.MeshCoord`. - Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord` that - references the current :class:`Mesh`, and passing through the + Generate a :class:`~iris.mesh.MeshCoord` that + references the current :class:`MeshXY`, and passing through the ``location`` and ``axis`` arguments. .. seealso:: @@ -1854,26 +1867,26 @@ def to_MeshCoord(self, location, axis): ---------- location : str The ``location`` argument for - :class:`~iris.experimental.ugrid.mesh.MeshCoord` instantiation. + :class:`~iris.mesh.MeshCoord` instantiation. axis : str The ``axis`` argument for - :class:`~iris.experimental.ugrid.mesh.MeshCoord` instantiation. + :class:`~iris.mesh.MeshCoord` instantiation. Returns ------- - :class:`~iris.experimental.ugrid.mesh.MeshCoord` - A :class:`~iris.experimental.ugrid.mesh.MeshCoord` referencing the - current :class:`Mesh`. + :class:`~iris.mesh.mesh.MeshCoord` + A :class:`~iris.mesh.mesh.MeshCoord` referencing the + current :class:`MeshXY`. """ return MeshCoord(mesh=self, location=location, axis=axis) def to_MeshCoords(self, location): - r"""Generate a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + r"""Generate a tuple of :class:`~iris.mesh.mesh.MeshCoord`. Generate a tuple of - :class:`~iris.experimental.ugrid.mesh.MeshCoord`, each referencing - the current :class:`Mesh`, one for each :attr:`AXES` value, passing + :class:`~iris.mesh.mesh.MeshCoord`, each referencing + the current :class:`MeshXY`, one for each :attr:`AXES` value, passing through the ``location`` argument. .. seealso:: @@ -1887,9 +1900,9 @@ def to_MeshCoords(self, location): Returns ------- - tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` - tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` - referencing the current :class:`Mesh`. One for each value in + tuple of :class:`~iris.mesh.mesh.MeshCoord` + Tuple of :class:`~iris.mesh.mesh.MeshCoord` + referencing the current :class:`MeshXY`. One for each value in :attr:`AXES`, using the value for the ``axis`` argument. """ @@ -1926,7 +1939,7 @@ def dimension_names(self, node=None, edge=None, face=None): The default value of ``None`` will not be assigned to clear the associated ``node``, ``edge`` or ``face``. Instead use - :meth:`Mesh.dimension_names_reset`. + :meth:`MeshXY.dimension_names_reset`. Parameters ---------- @@ -1945,7 +1958,7 @@ def dimension_names(self, node=None, edge=None, face=None): @property def cf_role(self): - """The UGRID ``cf_role`` attribute of the :class:`Mesh`.""" + """The UGRID ``cf_role`` attribute of the :class:`MeshXY`.""" return "mesh_topology" @property @@ -1954,7 +1967,7 @@ def topology_dimension(self): The UGRID ``topology_dimension`` attribute represents the highest dimensionality of all the geometric elements (node, edge, face) represented - within the :class:`Mesh`. + within the :class:`MeshXY`. """ return self._metadata_manager.topology_dimension @@ -1972,7 +1985,7 @@ class _Mesh1DCoordinateManager: "node_x", "node_y", ) - OPTIONAL = ( + OPTIONAL: tuple[str, ...] = ( "edge_x", "edge_y", ) @@ -2198,21 +2211,21 @@ def filters( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): # TBD: support coord_systems? - # Preserve original argument before modifying. - face_requested = include_faces - - # Rationalise the tri-state behaviour. - args = [include_nodes, include_edges, include_faces] - state = not any(set(filter(lambda arg: arg is not None, args))) - include_nodes, include_edges, include_faces = map( - lambda arg: arg if arg is not None else state, args - ) + # Determine locations to include. + if location is not None: + if location not in ["node", "edge", "face"]: + raise ValueError( + f"Expected location to be one of `node`, `edge` or `face`, got `{location}`" + ) + include_nodes = location == "node" + include_edges = location == "edge" + include_faces = location == "face" + else: + include_nodes = include_edges = include_faces = True def populated_coords(coords_tuple): return list(filter(None, list(coords_tuple))) @@ -2225,7 +2238,7 @@ def populated_coords(coords_tuple): if hasattr(self, "face_coords"): if include_faces: members += populated_coords(self.face_coords) - elif face_requested: + elif location == "face": dmsg = "Ignoring request to filter non-existent 'face_coords'" logger.debug(dmsg, extra=dict(cls=self.__class__.__name__)) @@ -2252,8 +2265,7 @@ def remove( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, + location=None, ): return self._remove( item=item, @@ -2262,8 +2274,7 @@ def remove( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, + location=location, ) @@ -2338,9 +2349,7 @@ def remove( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): return self._remove( item=item, @@ -2349,9 +2358,7 @@ def remove( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) @@ -2642,10 +2649,13 @@ def face_node(self): return self._members["face_node_connectivity"] +Location = Literal["edge", "node", "face"] + + class MeshCoord(AuxCoord): """Geographic coordinate values of data on an unstructured mesh. - A MeshCoord references a `~iris.experimental.ugrid.mesh.Mesh`. + A MeshCoord references a `~iris.mesh.mesh.MeshXY`. When contained in a `~iris.cube.Cube` it connects the cube to the Mesh. It records (a) which 1-D cube dimension represents the unstructured mesh, and (b) which mesh 'location' the cube data is mapped to -- i.e. is it @@ -2653,7 +2663,7 @@ class MeshCoord(AuxCoord): A MeshCoord also specifies its 'axis' : 'x' or 'y'. Its values are then, accordingly, longitudes or latitudes. The values are taken from the - appropriate coordinates and connectivities in the Mesh, determined by its + appropriate coordinates and connectivities in the MeshXY, determined by its 'location' and 'axis'. Any cube with data on a mesh will have a MeshCoord for each axis, @@ -2663,9 +2673,9 @@ class MeshCoord(AuxCoord): which depends on location. For 'node', the ``.points`` contains node locations. For 'edge', the ``.bounds`` contains edge endpoints, and the ``.points`` contain - edge locations (typically centres), if the Mesh contains them (optional). + edge locations (typically centres), if the MeshXY contains them (optional). For 'face', the ``.bounds`` contain the face corners, and the ``.points`` contain the - face locations (typically centres), if the Mesh contains them (optional). + face locations (typically centres), if the MeshXY contains them (optional). .. note:: As described above, it is possible for a MeshCoord to have bounds but @@ -2680,18 +2690,18 @@ class MeshCoord(AuxCoord): def __init__( self, - mesh, - location, - axis, + mesh: MeshXY, + location: Location, + axis: Literal["x", "y"], ): # Setup the metadata. self._metadata_manager = metadata_manager_factory(MeshCoordMetadata) # Validate and record the class-specific constructor args. - if not isinstance(mesh, Mesh): - msg = ( + if not isinstance(mesh, MeshXY): + msg = ( # type: ignore[unreachable] "'mesh' must be an " - f"{Mesh.__module__}.{Mesh.__name__}, " + f"{MeshXY.__module__}.{MeshXY.__name__}, " f"got {mesh}." ) raise TypeError(msg) @@ -2699,20 +2709,20 @@ def __init__( # NOTE: currently *not* included in metadata. In future it might be. self._mesh = mesh - if location not in Mesh.ELEMENTS: + if location not in MeshXY.ELEMENTS: msg = ( - f"'location' of {location} is not a valid Mesh location', " - f"must be one of {Mesh.ELEMENTS}." + f"'location' of {location} is not a valid MeshXY location', " + f"must be one of {MeshXY.ELEMENTS}." ) raise ValueError(msg) # Held in metadata, readable as self.location, but cannot set it. self._metadata_manager.location = location - if axis not in Mesh.AXES: - # The valid axes are defined by the Mesh class. + if axis not in MeshXY.AXES: + # The valid axes are defined by the MeshXY class. msg = ( - f"'axis' of {axis} is not a valid Mesh axis', " - f"must be one of {Mesh.AXES}." + f"'axis' of {axis} is not a valid MeshXY axis', " + f"must be one of {MeshXY.AXES}." ) raise ValueError(msg) # Held in metadata, readable as self.axis, but cannot set it. @@ -2726,20 +2736,19 @@ def __init__( raise ValueError(msg) # Get the 'coord identity' metadata from the relevant node-coordinate. - node_coord = self.mesh.coord(include_nodes=True, axis=self.axis) + node_coord = self.mesh.coord(location="node", axis=self.axis) node_metadict = node_coord.metadata._asdict() # Use node metadata, unless location is face/edge. use_metadict = node_metadict.copy() if location != "node": # Location is either "edge" or "face" - get the relevant coord. - kwargs = {f"include_{location}s": True, "axis": axis} - location_coord = self.mesh.coord(**kwargs) + location_coord = self.mesh.coord(location=location, axis=axis) # Take the MeshCoord metadata from the 'location' coord. use_metadict = location_coord.metadata._asdict() unit_unknown = Unit(None) - # N.B. at present, coords in a Mesh are stored+accessed by 'axis', which + # N.B. at present, coords in a MeshXY are stored+accessed by 'axis', which # means they must have a standard_name. So ... # (a) the 'location' (face/edge) coord *always* has a usable phenomenon # identity. @@ -2779,6 +2788,11 @@ def fix_repr(val): ) raise ValueError(msg) + # Don't use 'coord_system' as a constructor arg, since for + # MeshCoords it is deduced from the mesh. + # (Otherwise a non-None coord_system breaks the 'copy' operation) + use_metadict.pop("coord_system") + # Call parent constructor to handle the common constructor args. super().__init__(points, bounds=bounds, **use_metadict) @@ -2790,7 +2804,7 @@ def mesh(self): return self._mesh @property - def location(self): + def location(self) -> Location: return self._metadata_manager.location @property @@ -2804,8 +2818,24 @@ def axis(self): @property def coord_system(self): - """The coordinate-system of a MeshCoord is always 'None'.""" - return None + """The coordinate-system of a MeshCoord. + + It comes from the `related` location coordinate in the mesh. + """ + # This matches where the coord metadata is drawn from. + # See : https://github.com/SciTools/iris/issues/4860 + try: + # NOTE: at present, a MeshCoord *always* references the relevant location + # coordinate in the mesh, from which its points are taken. + # However this might change in future .. + # see : https://github.com/SciTools/iris/discussions/4438#bounds-no-points + location_coord = self.mesh.coord(location=self.location, axis=self.axis) + coord_system = location_coord.coord_system + except CoordinateNotFoundError: + # No such coord : possible in UGRID, but probably not Iris (at present). + coord_system = None + + return coord_system @coord_system.setter def coord_system(self, value): @@ -2837,6 +2867,47 @@ def __getitem__(self, keys): # Translate "self[:,]" as "self.copy()". return self.copy() + def collapsed(self, dims_to_collapse=None): + """Return a copy of this coordinate, which has been collapsed along the specified dimensions. + + Replaces the points & bounds with a simple bounded region. + + The coordinate that is collapsed is a :class:`~iris.coords.AuxCoord` + copy of this :class:`MeshCoord`, since a :class:`MeshCoord` + does not have its own points/bounds - they are derived from the + associated :class:`MeshXY`. See :meth:`iris.coords.AuxCoord.collapsed`. + """ + + @contextmanager + def temp_suppress_warning(): + """Add IrisVagueMetadataWarning filter then removes it after yielding. + + A workaround to mimic catch_warnings(), given python/cpython#73858. + """ + warnings.filterwarnings("ignore", category=IrisVagueMetadataWarning) + added_warning = warnings.filters[0] + + yield + + # (warnings.filters is usually mutable but this is not guaranteed). + new_filters = list(warnings.filters) + new_filters.remove(added_warning) + warnings.filters = new_filters + + aux_coord = AuxCoord.from_coord(self) + + # Reuse existing AuxCoord collapse logic, but with a custom + # mesh-specific warning. + message = ( + "Collapsing a mesh coordinate - cannot check for contiguity." + f"Metadata may not be fully descriptive for '{self.name()}'." + ) + warnings.warn(message, category=IrisVagueMetadataWarning) + with temp_suppress_warning(): + collapsed_coord = aux_coord.collapsed(dims_to_collapse) + + return collapsed_coord + def copy(self, points=None, bounds=None): """Make a copy of the MeshCoord. @@ -2865,9 +2936,9 @@ def copy(self, points=None, bounds=None): def __deepcopy__(self, memo): """Make this equivalent to "shallow" copy. - Returns a new MeshCoord based on the same Mesh. + Returns a new MeshCoord based on the same MeshXY. - Required to prevent cube copying from copying the Mesh, which would + Required to prevent cube copying from copying the MeshXY, which would prevent "cube.copy() == cube" : see notes for :meth:`copy`. """ @@ -2953,30 +3024,28 @@ def _construct_access_arrays(self): """Build lazy points and bounds arrays. Build lazy points and bounds arrays, providing dynamic access via the - Mesh, according to the location and axis. + MeshXY, according to the location and axis. Returns ------- - points, bounds : array or None - lazy arrays which calculate the correct points and bounds from the - Mesh data, based on the location and axis. - The Mesh coordinates accessed are not identified on construction, - but discovered from the Mesh at the time of calculation, so that - the result is always based on current content in the Mesh. + array or None + Tuple of (points, bounds). + Lazy arrays which calculate the correct points and bounds from the + MeshXY data, based on the location and axis. + The MeshXY coordinates accessed are not identified on construction, + but discovered from the MeshXY at the time of calculation, so that + the result is always based on current content in the MeshXY. """ mesh, location, axis = self.mesh, self.location, self.axis - node_coord = self.mesh.coord(include_nodes=True, axis=axis) + node_coord = mesh.coord(location="node", axis=axis) if location == "node": points_coord = node_coord bounds_connectivity = None - elif location == "edge": - points_coord = self.mesh.coord(include_edges=True, axis=axis) - bounds_connectivity = mesh.edge_node_connectivity - elif location == "face": - points_coord = self.mesh.coord(include_faces=True, axis=axis) - bounds_connectivity = mesh.face_node_connectivity + else: + points_coord = mesh.coord(location=location, axis=axis) + bounds_connectivity = getattr(mesh, f"{location}_node_connectivity") # The points output is the points of the relevant element-type coord. points = points_coord.core_points() diff --git a/lib/iris/experimental/ugrid/utils.py b/lib/iris/mesh/utils.py similarity index 90% rename from lib/iris/experimental/ugrid/utils.py rename to lib/iris/mesh/utils.py index fce1036c6d..3930fa3f1b 100644 --- a/lib/iris/experimental/ugrid/utils.py +++ b/lib/iris/mesh/utils.py @@ -4,18 +4,21 @@ # See LICENSE in the root of the repository for full licensing details. """Utility operations specific to unstructured data.""" -from typing import AnyStr, Iterable, Union + +from collections.abc import Sequence +from typing import Union import dask.array as da import numpy as np +from iris.common.metadata import CoordMetadata from iris.cube import Cube def recombine_submeshes( mesh_cube: Cube, - submesh_cubes: Union[Iterable[Cube], Cube], - index_coord_name: AnyStr = "i_mesh_index", + submesh_cubes: Union[Sequence[Cube], Cube], + index_coord_name: str = "i_mesh_index", ) -> Cube: """Put data from sub-meshes back onto the original full mesh. @@ -28,7 +31,7 @@ def recombine_submeshes( Describes the mesh and mesh-location onto which the all the ``submesh-cubes``' data are mapped, and acts as a template for the result. - Must have a :class:`~iris.experimental.ugrid.mesh.Mesh`. + Must have a :class:`~iris.mesh.MeshXY`. submesh_cubes : iterable of Cube, or Cube Cubes, each with data on a _subset_ of the ``mesh_cube`` datapoints @@ -50,7 +53,7 @@ def recombine_submeshes( its location in the original mesh -- i.e. they are indices into the relevant mesh-location dimension. - index_coord_name : Cube + index_coord_name : str Coord name of an index coord containing the mesh location indices, in every submesh cube. @@ -85,19 +88,19 @@ def recombine_submeshes( # # Perform consistency checks on all the region-cubes. # - if not isinstance(submesh_cubes, Iterable): + if not isinstance(submesh_cubes, Sequence): # Treat a single submesh cube input as a list-of-1. submesh_cubes = [submesh_cubes] result_metadata = None result_dtype = None - indexcoord_metadata = None + indexcoord_metadata: CoordMetadata | None = None for i_sub, cube in enumerate(submesh_cubes): - sub_str = f"Submesh cube #{i_sub + 1}/{len(submesh_cubes)}, " f'"{cube.name()}"' + sub_str = f'Submesh cube #{i_sub + 1}/{len(submesh_cubes)}, "{cube.name()}"' # Check dimensionality. if cube.ndim != mesh_cube.ndim: - err = ( + err: str | None = ( f"{sub_str} has {cube.ndim} dimensions, but " f"'mesh_cube' has {mesh_cube.ndim}." ) @@ -131,23 +134,23 @@ def recombine_submeshes( for i_dim in range(mesh_cube.ndim): if i_dim == mesh_dim: # mesh dim : look for index coords (by name) - full_coord = mesh_cube.coords( + full_coords = mesh_cube.coords( name_or_coord=index_coord_name, dimensions=(i_dim,) ) - sub_coord = cube.coords( + sub_coords = cube.coords( name_or_coord=index_coord_name, dimensions=(i_dim,) ) else: # non-mesh dims : look for dim-coords (only) - full_coord = mesh_cube.coords(dim_coords=True, dimensions=(i_dim,)) - sub_coord = cube.coords(dim_coords=True, dimensions=(i_dim,)) + full_coords = mesh_cube.coords(dim_coords=True, dimensions=(i_dim,)) + sub_coords = cube.coords(dim_coords=True, dimensions=(i_dim,)) - if full_coord: - (full_coord,) = full_coord + if full_coords: + (full_coord,) = full_coords full_dimname = full_coord.name() full_metadata = full_coord.metadata._replace(var_name=None) - if sub_coord: - (sub_coord,) = sub_coord + if sub_coords: + (sub_coord,) = sub_coords sub_dimname = sub_coord.name() sub_metadata = sub_coord.metadata._replace(var_name=None) @@ -155,18 +158,18 @@ def recombine_submeshes( # N.B. checks for mesh- and non-mesh-dims are different if i_dim != mesh_dim: # i_dim == mesh_dim : checks for non-mesh dims - if full_coord and not sub_coord: + if full_coords and not sub_coords: err = ( f"{sub_str} has no dim-coord for dimension " f"{i_dim}, to match the 'mesh_cube' dimension " f'"{full_dimname}".' ) - elif sub_coord and not full_coord: + elif sub_coords and not full_coords: err = ( f'{sub_str} has a dim-coord "{sub_dimname}" for ' f"dimension {i_dim}, but 'mesh_cube' has none." ) - elif sub_coord != full_coord: + elif sub_coords != full_coords: err = ( f'{sub_str} has a dim-coord "{sub_dimname}" for ' f"dimension {i_dim}, which does not match that " @@ -174,13 +177,13 @@ def recombine_submeshes( ) else: # i_dim == mesh_dim : different rules for this one - if not sub_coord: + if not sub_coords: # Must have an index coord on the mesh dimension err = ( f'{sub_str} has no "{index_coord_name}" coord on ' f"the mesh dimension (dimension {mesh_dim})." ) - elif full_coord and sub_metadata != full_metadata: + elif full_coords and sub_metadata != full_metadata: # May *not* have full-cube index, but if so it must match err = ( f"{sub_str} has an index coord " @@ -196,6 +199,7 @@ def recombine_submeshes( # Store first occurrence (from first region-cube) indexcoord_metadata = sub_metadata elif sub_metadata != indexcoord_metadata: + # This code is unreachable, is this a bug? # Compare subsequent occurrences (from other region-cubes) err = ( f"{sub_str} has an index coord " @@ -273,6 +277,9 @@ def fill_region(target, regiondata, regioninds): # Notes on resultant calculation properties: # 1. map_blocks is chunk-mapped, so it is parallelisable and space-saving # 2. However, fetching less than a whole chunk is not efficient + meta = np.ma.array( + np.empty((0,) * result_array.ndim, dtype=result_array.dtype), mask=True + ) for cube in submesh_cubes: # Lazy data array from the region cube sub_data = cube.lazy_data() @@ -296,7 +303,7 @@ def fill_region(target, regiondata, regioninds): sub_data, indarr, dtype=result_array.dtype, - meta=np.ndarray, + meta=meta, ) # Construct the result cube diff --git a/lib/iris/palette.py b/lib/iris/palette.py index e180b649a8..522a89fa1b 100644 --- a/lib/iris/palette.py +++ b/lib/iris/palette.py @@ -55,7 +55,7 @@ def is_brewer(cmap): def _default_cmap_norm(args, kwargs): - """Injects default cmap and norm behaviour into the keyword arguments. + """Inject default cmap and norm behaviour into the keyword arguments. This function injects default cmap and norm behaviour into the keyword arguments, based on the cube referenced within the positional arguments. @@ -123,7 +123,7 @@ def cmap_norm(cube): ------- tuple Tuple of :class:`matplotlib.colors.LinearSegmentedColormap` and - :class:`iris.palette.SymmetricNormalize` + :class:`iris.palette.SymmetricNormalize`. Notes ----- diff --git a/lib/iris/pandas.py b/lib/iris/pandas.py index 1e79e1b31e..78669eceb3 100644 --- a/lib/iris/pandas.py +++ b/lib/iris/pandas.py @@ -7,6 +7,7 @@ See also: https://pandas.pydata.org/ """ + import datetime from itertools import chain, combinations import warnings @@ -87,7 +88,7 @@ def _add_iris_coord(cube, name, points, dim, calendar=None): cube.add_aux_coord(coord, dim) -def _series_index_unique(pandas_series: pd.Series): +def _series_index_unique(pandas_series: pd.Series) -> tuple[int, ...] | None: """Find an index grouping of a :class:`pandas.Series` that has just one Series value per group. Iterates through grouping single index levels, then combinations of 2 @@ -103,7 +104,7 @@ def _series_index_unique(pandas_series: pd.Series): levels_range = range(pandas_index.nlevels) if unique_number == 1: # Scalar - identical for all indices. - result = () + result: tuple[int, ...] | None = () else: result = None levels_combinations = chain( @@ -124,16 +125,10 @@ def as_cube( ): """Convert a Pandas Series/DataFrame into a 1D/2D Iris Cube. - .. deprecated:: 3.3.0 - - This function is scheduled for removal in a future release, being - replaced by :func:`iris.pandas.as_cubes`, which offers richer - dimensional intelligence. - Parameters ---------- pandas_array : :class:`pandas.Series` or :class:`pandas.DataFrame` - The Pandas object to convert + The Pandas object to convert. copy : bool, default=True Whether to copy `pandas_array`, or to create array views where possible. Provided in case of memory limit concerns. @@ -145,13 +140,21 @@ def as_cube( ----- This function will copy your data by default. - Example usage:: + Examples + -------- + :: as_cube(series, calendars={0: cf_units.CALENDAR_360_DAY}) as_cube(data_frame, calendars={1: cf_units.CALENDAR_STANDARD}) Since this function converts to/from a Pandas object, laziness will not be preserved. + .. deprecated:: 3.3.0 + + This function is scheduled for removal in a future release, being + replaced by :func:`iris.pandas.as_cubes`, which offers richer + dimensional intelligence. + """ message = ( "iris.pandas.as_cube has been deprecated, and will be removed in a " @@ -170,7 +173,7 @@ def as_cube( # 1.6 doesn't. Since we don't care about preserving the order we can # just force it back to C-order.) order = "C" if copy else "A" - data = np.array(pandas_array, copy=copy, order=order) + data = np.array(pandas_array.values, copy=copy, order=order) cube = Cube(np.ma.masked_invalid(data, copy=False)) _add_iris_coord(cube, "index", pandas_array.index, 0, calendars.get(0, None)) if pandas_array.ndim == 2: @@ -202,7 +205,7 @@ def as_cubes( Parameters ---------- pandas_structure : :class:`pandas.Series` or :class:`pandas.DataFrame` - The Pandas object to convert + The Pandas object to convert. copy : bool, default=True Whether the Cube :attr:`~iris.cube.Cube.data` is a copy of the `pandas_structure` column, or a view of the same array. Arrays other than @@ -305,7 +308,7 @@ def as_cubes( Pandas uses ``NaN`` rather than masking data. Converted :class:`~iris.cube.Cube` can be masked in downstream user code : - >>> my_series = Series([300, np.NaN, 302], name="air_temperature") + >>> my_series = Series([300, np.nan, 302], name="air_temperature") >>> converted_cube = as_cubes(my_series)[0] >>> print(converted_cube.data) [300. nan 302.] @@ -564,14 +567,9 @@ def _make_cell_measures_list(cube): def as_series(cube, copy=True): """Convert a 1D cube to a Pandas Series. - .. deprecated:: 3.4.0 - This function is scheduled for removal in a future release, being - replaced by :func:`iris.pandas.as_data_frame`, which offers improved - multi dimension handling. - Parameters ---------- - cube: :class:`Cube` + cube : :class:`Cube` The cube to convert to a Pandas Series. copy : bool, default=True Whether to make a copy of the data. @@ -585,6 +583,12 @@ def as_series(cube, copy=True): Since this function converts to/from a Pandas object, laziness will not be preserved. + .. deprecated:: 3.4.0 + + This function is scheduled for removal in a future release, being + replaced by :func:`iris.pandas.as_data_frame`, which offers improved + multi dimension handling. + """ message = ( "iris.pandas.as_series has been deprecated, and will be removed in a " @@ -644,7 +648,7 @@ def as_data_frame( ------- :class:`~pandas.DataFrame` A :class:`~pandas.DataFrame` with :class:`~iris.cube.Cube` dimensions - forming a :class:`~pandas.MultiIndex` + forming a :class:`~pandas.MultiIndex`. Warnings -------- @@ -664,8 +668,6 @@ def as_data_frame( :class:`~pandas.DataFrame` column (the legacy behaviour preserves 2 dimensions via rows and columns). - | - #. Where the :class:`~iris.cube.Cube` contains masked values, these become :data:`numpy.nan` in the returned :class:`~pandas.DataFrame`. @@ -680,6 +682,8 @@ def as_data_frame( :class:`~iris.cube.Cube` data `dtype` is preserved. + Since this function converts to/from a Pandas object, laziness will not be preserved. + Examples -------- >>> import iris @@ -794,10 +798,6 @@ def as_data_frame( 419903 298.995148 Name: surface_temperature, Length: 419904, dtype: float32 - Notes - ----- - Since this function converts to/from a Pandas object, laziness will not be preserved. - """ def merge_metadata(meta_var_list): diff --git a/lib/iris/plot.py b/lib/iris/plot.py index e9f73bd86b..7d9812d11c 100644 --- a/lib/iris/plot.py +++ b/lib/iris/plot.py @@ -12,6 +12,7 @@ import datetime import warnings +import cartopy import cartopy.crs as ccrs from cartopy.geodesic import Geodesic import cartopy.mpl.geoaxes @@ -25,6 +26,7 @@ import matplotlib.transforms as mpl_transforms import numpy as np import numpy.ma as ma +from packaging.version import Version import iris.analysis.cartography as cartography import iris.coord_systems @@ -43,6 +45,26 @@ PlotDefn = collections.namedtuple("PlotDefn", ("coords", "transpose")) +class _GeoAxesPatched(cartopy.mpl.geoaxes.GeoAxes): + # Workaround for a bug where titles collide with axis labels (cartopy#2390) + # Bug is only present in Cartopy v0.23, so this will only be invoked for + # that version. + def _draw_preprocess(self, renderer): + super()._draw_preprocess(renderer) + + for artist in self.artists: + if hasattr(artist, "_draw_gridliner"): + # Note this is only necessary since Cartopy v0.23, but is not + # wasteful for earlier versions as _draw_gridliner() includes + # a check for whether a draw is necessary. + artist._draw_gridliner(renderer=renderer) + + +cartopy_version = Version(cartopy.__version__) +if cartopy_version.major == 0 and cartopy_version.minor == 23: + cartopy.mpl.geoaxes.GeoAxes = _GeoAxesPatched + + def _get_plot_defn_custom_coords_picked(cube, coords, mode, ndims=2): def names(coords): result = [] @@ -213,9 +235,7 @@ def sort_key(coord): def _can_draw_map(coords): - std_names = [ - c and c.standard_name for c in coords if isinstance(c, iris.coords.Coord) - ] + std_names = [c.standard_name for c in coords if isinstance(c, iris.coords.Coord)] valid_std_names = [ ["latitude", "longitude"], ["grid_latitude", "grid_longitude"], @@ -256,7 +276,7 @@ def ticker_func(tick_location, _): def _invert_yaxis(v_coord, axes=None): - """Inverts the y-axis of the current plot based on conditions. + """Invert the y-axis of the current plot based on conditions. * If the y-axis is already inverted we don't want to re-invert it. * If v_coord is None then it will not have any attributes. @@ -266,7 +286,7 @@ def _invert_yaxis(v_coord, axes=None): Parameters ---------- v_coord : - The coord to be plotted on the y-axis + The coord to be plotted on the y-axis. axes : optional """ @@ -294,9 +314,9 @@ def _check_bounds_contiguity_and_mask(coord, data, atol=None, rtol=None): Parameters ---------- coord : iris.coord.Coord - Coordinate the bounds of which will be checked for contiguity + Coordinate the bounds of which will be checked for contiguity. data : array - Data of the the cube we are plotting + Data of the the cube we are plotting. atol : optional Absolute tolerance when checking the contiguity. Defaults to None. If an absolute tolerance is not set, 1D coords are not checked (so @@ -706,7 +726,7 @@ def _get_geodesic_params(globe): def _shift_plot_sections(u_object, u, v): - """Shifts subsections of u by multiples of 360 degrees. + """Shift subsections of u by multiples of 360 degrees. Shifts subsections of u by multiples of 360 degrees within ranges defined by the points where the line should cross over the 0/360 degree @@ -1052,7 +1072,7 @@ def _map_common(draw_method_name, arg_func, mode, cube, plot_defn, *args, **kwar def contour(cube, *args, **kwargs): - """Draws contour lines based on the given Cube. + """Draw contour lines based on the given Cube. Parameters ---------- @@ -1080,7 +1100,7 @@ def contour(cube, *args, **kwargs): def contourf(cube, *args, **kwargs): - """Draws filled contours based on the given Cube. + """Draw filled contours based on the given Cube. Parameters ---------- @@ -1298,7 +1318,7 @@ def horiz_plot(v_coord, orography, style_args): def outline(cube, coords=None, color="k", linewidth=None, axes=None): - """Draws cell outlines based on the given Cube. + """Draw cell outlines based on the given Cube. Parameters ---------- @@ -1339,7 +1359,7 @@ def outline(cube, coords=None, color="k", linewidth=None, axes=None): def pcolor(cube, *args, **kwargs): - """Draws a pseudocolor plot based on the given 2-dimensional Cube. + """Draw a pseudocolor plot based on the given 2-dimensional Cube. The cube must have either two 1-dimensional coordinates or two 2-dimensional coordinates with contiguous bounds to plot the cube against. @@ -1375,7 +1395,7 @@ def pcolor(cube, *args, **kwargs): def pcolormesh(cube, *args, **kwargs): - """Draws a pseudocolor plot based on the given 2-dimensional Cube. + """Draw a pseudocolor plot based on the given 2-dimensional Cube. The cube must have either two 1-dimensional coordinates or two 2-dimensional coordinates with contiguous bounds to plot against each @@ -1409,7 +1429,7 @@ def pcolormesh(cube, *args, **kwargs): def points(cube, *args, **kwargs): - """Draws sample point positions based on the given Cube. + """Draw sample point positions based on the given Cube. Parameters ---------- @@ -1479,7 +1499,7 @@ def _vector_component_args(x_points, y_points, u_data, *args, **kwargs): return ((x_points, y_points, u_data, v_data), kwargs) -def barbs(u_cube, v_cube, *args, **kwargs): +def barbs(u_cube, v_cube, *args, **kwargs): # numpydoc ignore=PR08 """Draw a barb plot from two vector component cubes. Draws a barb plot from two vector component cubes. Triangles, full-lines @@ -1531,8 +1551,8 @@ def barbs(u_cube, v_cube, *args, **kwargs): ) -def quiver(u_cube, v_cube, *args, **kwargs): - """Draws an arrow plot from two vector component cubes. +def quiver(u_cube, v_cube, *args, **kwargs): # numpydoc ignore=PR08 + """Draw an arrow plot from two vector component cubes. Parameters ---------- @@ -1582,7 +1602,7 @@ def quiver(u_cube, v_cube, *args, **kwargs): def plot(*args, **kwargs): - """Draws a line plot based on the given cube(s) or coordinate(s). + """Draw a line plot based on the given cube(s) or coordinate(s). Parameters ---------- @@ -1635,7 +1655,7 @@ def plot(*args, **kwargs): def scatter(x, y, *args, **kwargs): - """Draws a scatter plot based on the given cube(s) or coordinate(s). + """Draw a scatter plot based on the given cube(s) or coordinate(s). Parameters ---------- @@ -1740,7 +1760,7 @@ def hist(x, *args, **kwargs): def symbols(x, y, symbols, size, axes=None, units="inches"): - """Draws fixed-size symbols. + """Draw fixed-size symbols. See :mod:`iris.symbols` for available symbols. @@ -1830,7 +1850,7 @@ def citation(text, figure=None, axes=None): def animate(cube_iterator, plot_func, fig=None, **kwargs): - """Animates the given cube iterator. + """Animate the given cube iterator. Parameters ---------- @@ -1846,15 +1866,15 @@ def animate(cube_iterator, plot_func, fig=None, **kwargs): fig : :class:`matplotlib.figure.Figure` instance, optional By default, the current figure will be used or a new figure instance created if no figure is available. See :func:`matplotlib.pyplot.gcf`. - coords: list of :class:`~iris.coords.Coord` objects or coordinate names, optional + coords : list of :class:`~iris.coords.Coord` objects or coordinate names, optional Use the given coordinates as the axes for the plot. The order of the given coordinates indicates which axis to use for each, where the first element is the horizontal axis of the plot and the second element is the vertical axis of the plot. - interval: int, float or long, optional + interval : int, float or long, optional Defines the time interval in milliseconds between successive frames. A default interval of 100ms is set. - vmin, vmax: int, float or long, optional + vmin, vmax : int, float or long, optional Color scaling values, see :class:`matplotlib.colors.Normalize` for further details. Default values are determined by the min-max across the data set over the entire sequence. diff --git a/lib/iris/quickplot.py b/lib/iris/quickplot.py index 14380019f3..c1ca7f733f 100644 --- a/lib/iris/quickplot.py +++ b/lib/iris/quickplot.py @@ -48,14 +48,15 @@ def _title(cube_or_coord, with_units): return title -def _label(cube, mode, result=None, ndims=2, coords=None, axes=None): +def _label(cube, mode, result=None, ndims=2, coords=None, axes=None, colorbar=True): """Put labels on the current plot using the given cube.""" if axes is None: axes = plt.gca() axes.set_title(_title(cube, with_units=False)) - if result is not None: + # optional colorbar + if colorbar and result is not None: draw_edges = mode == iris.coords.POINT_MODE bar = plt.colorbar( result, ax=axes, orientation="horizontal", drawedges=draw_edges @@ -89,12 +90,16 @@ def _label(cube, mode, result=None, ndims=2, coords=None, axes=None): raise ValueError(msg) -def _label_with_bounds(cube, result=None, ndims=2, coords=None, axes=None): - _label(cube, iris.coords.BOUND_MODE, result, ndims, coords, axes) +def _label_with_bounds( + cube, result=None, ndims=2, coords=None, axes=None, colorbar=True +): + _label(cube, iris.coords.BOUND_MODE, result, ndims, coords, axes, colorbar) -def _label_with_points(cube, result=None, ndims=2, coords=None, axes=None): - _label(cube, iris.coords.POINT_MODE, result, ndims, coords, axes) +def _label_with_points( + cube, result=None, ndims=2, coords=None, axes=None, colorbar=True +): + _label(cube, iris.coords.POINT_MODE, result, ndims, coords, axes, colorbar) def _get_titles(u_object, v_object): @@ -135,7 +140,7 @@ def _label_1d_plot(*args, **kwargs): def contour(cube, *args, **kwargs): - """Draws contour lines on a labelled plot based on the given Cube. + """Draw contour lines on a labelled plot based on the given Cube. With the basic call signature, contour "level" values are chosen automatically:: @@ -166,7 +171,7 @@ def contour(cube, *args, **kwargs): def contourf(cube, *args, **kwargs): - """Draws filled contours on a labelled plot based on the given Cube. + """Draw filled contours on a labelled plot based on the given Cube. With the basic call signature, contour "level" values are chosen automatically:: @@ -181,6 +186,11 @@ def contourf(cube, *args, **kwargs): contour(cube, V) + Keywords + -------- + colorbar : bool, default=True + If True, an appropriate colorbar will be added to the plot. + See :func:`iris.plot.contourf` for details of valid keyword arguments. Notes @@ -190,13 +200,14 @@ def contourf(cube, *args, **kwargs): """ coords = kwargs.get("coords") axes = kwargs.get("axes") + colorbar = kwargs.pop("colorbar", True) result = iplt.contourf(cube, *args, **kwargs) - _label_with_points(cube, result, coords=coords, axes=axes) + _label_with_points(cube, result, coords=coords, axes=axes, colorbar=colorbar) return result def outline(cube, coords=None, color="k", linewidth=None, axes=None): - """Draws cell outlines on a labelled plot based on the given Cube. + """Draw cell outlines on a labelled plot based on the given Cube. Parameters ---------- @@ -227,7 +238,12 @@ def outline(cube, coords=None, color="k", linewidth=None, axes=None): def pcolor(cube, *args, **kwargs): - """Draws a labelled pseudocolor plot based on the given Cube. + """Draw a labelled pseudocolor plot based on the given Cube. + + Keywords + -------- + colorbar : bool, default=True + If True, an appropriate colorbar will be added to the plot. See :func:`iris.plot.pcolor` for details of valid keyword arguments. @@ -238,13 +254,19 @@ def pcolor(cube, *args, **kwargs): """ coords = kwargs.get("coords") axes = kwargs.get("axes") + colorbar = kwargs.pop("colorbar", True) result = iplt.pcolor(cube, *args, **kwargs) - _label_with_bounds(cube, result, coords=coords, axes=axes) + _label_with_bounds(cube, result, coords=coords, axes=axes, colorbar=colorbar) return result def pcolormesh(cube, *args, **kwargs): - """Draws a labelled pseudocolour plot based on the given Cube. + """Draw a labelled pseudocolour plot based on the given Cube. + + Keywords + -------- + colorbar : bool, default=True + If True, an appropriate colorbar will be added to the plot. See :func:`iris.plot.pcolormesh` for details of valid keyword arguments. @@ -256,13 +278,14 @@ def pcolormesh(cube, *args, **kwargs): """ coords = kwargs.get("coords") axes = kwargs.get("axes") + colorbar = kwargs.pop("colorbar", True) result = iplt.pcolormesh(cube, *args, **kwargs) - _label_with_bounds(cube, result, coords=coords, axes=axes) + _label_with_bounds(cube, result, coords=coords, axes=axes, colorbar=colorbar) return result def points(cube, *args, **kwargs): - """Draws sample point positions on a labelled plot based on the given Cube. + """Draw sample point positions on a labelled plot based on the given Cube. See :func:`iris.plot.points` for details of valid keyword arguments. @@ -280,7 +303,7 @@ def points(cube, *args, **kwargs): def plot(*args, **kwargs): - """Draws a labelled line plot based on the given cube(s) or coordinate(s). + """Draw a labelled line plot based on the given cube(s) or coordinate(s). See :func:`iris.plot.plot` for details of valid arguments and keyword arguments. @@ -298,7 +321,7 @@ def plot(*args, **kwargs): def scatter(x, y, *args, **kwargs): - """Draws a labelled scatter plot based on the given cubes or coordinates. + """Draw a labelled scatter plot based on the given cubes or coordinates. See :func:`iris.plot.scatter` for details of valid arguments and keyword arguments. @@ -316,7 +339,7 @@ def scatter(x, y, *args, **kwargs): def fill_between(x, y1, y2, *args, **kwargs): - """Draws a labelled fill_between plot based on the given cubes or coordinates. + """Draw a labelled fill_between plot based on the given cubes or coordinates. See :func:`iris.plot.fill_between` for details of valid arguments and keyword arguments. diff --git a/lib/iris/tests/__init__.py b/lib/iris/tests/__init__.py index 77a9fcdd67..a2824f90c2 100644 --- a/lib/iris/tests/__init__.py +++ b/lib/iris/tests/__init__.py @@ -29,7 +29,6 @@ import shutil import subprocess import sys -from typing import AnyStr import unittest from unittest import mock import warnings @@ -92,7 +91,7 @@ sys.argv.remove("--data-files-used") fname = "/var/tmp/all_iris_test_resource_paths.txt" print("saving list of files used by tests to %s" % fname) - _EXPORT_DATAPATHS_FILE = open(fname, "w") + _EXPORT_DATAPATHS_FILE: io.TextIOWrapper | None = open(fname, "w") else: _EXPORT_DATAPATHS_FILE = None @@ -193,10 +192,35 @@ def assert_masked_array_almost_equal(a, b, decimal=6, strict=False): ) +def assert_cml(cubes, reference_filename=None, checksum=True): + """Test that the CML for the given cubes matches the contents of + the reference file. + + If the environment variable IRIS_TEST_CREATE_MISSING is + non-empty, the reference file is created if it doesn't exist. + + Parameters + ---------- + cubes : + Either a Cube or a sequence of Cubes. + reference_filename : optional, default=None + The relative path (relative to the test results directory). + If omitted, the result is generated from the calling + method's name, class, and module using + :meth:`iris.tests.IrisTest.result_path`. + checksum : bool, optional + When True, causes the CML to include a checksum for each + Cube's data. Defaults to True. + + """ + test = IrisTest() + test.assertCML(cubes, reference_filename, checksum) + + class IrisTest(unittest.TestCase): """A subclass of unittest.TestCase which provides Iris specific testing functionality.""" - _assertion_counts = collections.defaultdict(int) + _assertion_counts: collections.defaultdict[str, int] = collections.defaultdict(int) def _assert_str_same( self, @@ -524,9 +548,7 @@ def assertRepr(self, obj, reference_filename): def _check_same(self, item, reference_path, type_comparison_name="CML"): if self._check_reference_file(reference_path): with open(reference_path, "rb") as reference_fh: - reference = "".join( - part.decode("utf-8") for part in reference_fh.readlines() - ) + reference = "".join(part.decode("utf-8") for part in reference_fh) self._assert_str_same(reference, item, reference_path, type_comparison_name) else: self._ensure_folder(reference_path) @@ -1053,7 +1075,7 @@ def wrapped(self, *args, **kwargs): return wrapped -def env_bin_path(exe_name: AnyStr = None): +def env_bin_path(exe_name: str | None = None) -> Path | None: """Return a Path object for (an executable in) the environment bin directory. Parameters diff --git a/lib/iris/tests/experimental/regrid/test_regrid_area_weighted_rectilinear_src_and_grid.py b/lib/iris/tests/experimental/regrid/test_regrid_area_weighted_rectilinear_src_and_grid.py index 68fa47f25c..0727b3c36e 100644 --- a/lib/iris/tests/experimental/regrid/test_regrid_area_weighted_rectilinear_src_and_grid.py +++ b/lib/iris/tests/experimental/regrid/test_regrid_area_weighted_rectilinear_src_and_grid.py @@ -319,7 +319,7 @@ def test_regrid_reorder_axis(self): dest = _resampled_grid(self.realistic_cube[0, 0, :3, :2], 3, 3) res = regrid_area_weighted(src, dest) self.assertArrayShapeStats(src, (4, 3, 2), 288.08868, 0.008262919) - self.assertArrayShapeStats(res, (4, 9, 6), 288.08865, 0.00826281) + self.assertArrayShapeStats(res, (4, 9, 6), 288.0886, 0.008271061) # Reshape src so that the coords are ordered [x, z, y], # the mean and std statistics should be the same data = np.moveaxis(src.data.copy(), 2, 0) @@ -329,7 +329,7 @@ def test_regrid_reorder_axis(self): src.add_dim_coord(lon, 0) res = regrid_area_weighted(src, dest) self.assertArrayShapeStats(src, (2, 4, 3), 288.08868, 0.008262919) - self.assertArrayShapeStats(res, (6, 4, 9), 288.08865, 0.00826281) + self.assertArrayShapeStats(res, (6, 4, 9), 288.0886, 0.008271061) # Reshape src so that the coords are ordered [y, x, z], # the mean and std statistics should be the same data = np.moveaxis(src.data.copy(), 2, 0) @@ -340,7 +340,7 @@ def test_regrid_reorder_axis(self): dest = _resampled_grid(self.realistic_cube[0, 0, :3, :2], 3, 3) res = regrid_area_weighted(src, dest) self.assertArrayShapeStats(src, (3, 2, 4), 288.08868, 0.008262919) - self.assertArrayShapeStats(res, (9, 6, 4), 288.08865, 0.00826281) + self.assertArrayShapeStats(res, (9, 6, 4), 288.0886, 0.008271061) def test_regrid_lon_to_half_res(self): src = self.simple_cube diff --git a/lib/iris/tests/graphics/__init__.py b/lib/iris/tests/graphics/__init__.py index d72bebf7e3..7855f6a037 100644 --- a/lib/iris/tests/graphics/__init__.py +++ b/lib/iris/tests/graphics/__init__.py @@ -126,7 +126,7 @@ def repos_equal(repo1: Dict[str, str], repo2: Dict[str, str]) -> bool: return True -def get_phash(input: Path) -> str: +def get_phash(input: Path | io.BytesIO) -> str: import imagehash from PIL import Image @@ -141,7 +141,7 @@ def generate_repo_from_baselines(baseline_image_dir: Path) -> Dict[str, str]: return repo -def fully_qualify(test_id: str, repo: str) -> Dict[str, str]: +def fully_qualify(test_id: str, repo: dict[str, str]) -> str: # If the test_id isn't in the repo as it stands, look for it if test_id not in repo: test_id_candidates = [x for x in repo.keys() if x.endswith(test_id)] diff --git a/lib/iris/tests/integration/concatenate/test_concatenate.py b/lib/iris/tests/integration/concatenate/test_concatenate.py index 13110781dc..821bde42cb 100644 --- a/lib/iris/tests/integration/concatenate/test_concatenate.py +++ b/lib/iris/tests/integration/concatenate/test_concatenate.py @@ -12,6 +12,7 @@ import iris.tests as tests # isort:skip import cf_units +import dask.array as da import numpy as np from iris._concatenate import _DerivedCoordAndDims, concatenate @@ -110,6 +111,15 @@ def test_diff_aux_coord(self): result = concatenate([cube_a, cube_b]) self.assertEqual(len(result), 2) + def test_diff_aux_coord_anonymous_dim(self): + cube_a = self.create_cube() + cube_a.remove_coord("latitude") + cube_b = cube_a.copy()[:, :1] + cube_b.coord("time").points = [12, 18] + + result = concatenate([cube_a, cube_b]) + self.assertEqual(len(result), 2) + def test_ignore_diff_aux_coord(self): cube_a = self.create_cube() cube_b = cube_a.copy() @@ -157,6 +167,16 @@ def test_ignore_diff_cell_measure(self): self.assertEqual(len(result), 1) self.assertEqual(result[0].shape, (4, 2)) + def test_lazy_cell_measure(self): + cube_a = self.create_cube() + cube_a.cell_measure("volume").data = da.array([0, 15]) + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + + result = concatenate([cube_a, cube_b]) + assert len(result) == 1 + assert result[0].cell_measure("volume").has_lazy_data() + class Test_cubes_with_ancillary_variables(tests.IrisTest): def create_cube(self): @@ -194,6 +214,16 @@ def test_ignore_diff_ancillary_variables(self): self.assertEqual(len(result), 1) self.assertEqual(result[0].shape, (4, 2)) + def test_lazy_ancillary_variables(self): + cube_a = self.create_cube() + cube_a.ancillary_variable("quality").data = da.array([0, 15]) + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + + result = concatenate([cube_a, cube_b]) + assert len(result) == 1 + assert result[0].ancillary_variable("quality").has_lazy_data() + class Test_cubes_with_derived_coord(tests.IrisTest): def create_cube(self): diff --git a/lib/iris/tests/integration/experimental/geovista/__init__.py b/lib/iris/tests/integration/experimental/geovista/__init__.py new file mode 100644 index 0000000000..6a56e09db4 --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/__init__.py @@ -0,0 +1,5 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the :mod:`iris.experimental.geovista` module.""" diff --git a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py new file mode 100644 index 0000000000..26ea8c48ea --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py @@ -0,0 +1,65 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the `iris.experimental.geovista.cube_to_polydata` function.""" + +import numpy as np + +from iris import load_cube +from iris.experimental.geovista import cube_to_polydata +from iris.tests import get_data_path + + +def test_integration_2d(): + file_path = get_data_path( + [ + "NetCDF", + "ORCA2", + "votemper.nc", + ] + ) + + cube = load_cube(file_path, "votemper") + + polydata = cube_to_polydata(cube[0, 1, :]) + # This is a known good output, we have plotted the result and checked it. + assert polydata.GetNumberOfCells() == 26640 + assert polydata.GetNumberOfPoints() == 26969 + np.testing.assert_array_equal(cube[0, 1, :].data.flatten(), polydata.active_scalars) + + +def test_integration_1d(): + file_path = get_data_path( + [ + "NetCDF", + "global", + "xyt", + "SMALL_hires_wind_u_for_ipcc4.nc", + ] + ) + cube = load_cube(file_path) + + polydata = cube_to_polydata(cube[0, :]) + # This is a known good output, we have plotted the result and checked it. + assert polydata.GetNumberOfCells() == 51200 + assert polydata.GetNumberOfPoints() == 51681 + np.testing.assert_array_equal(cube[0, :].data.flatten(), polydata.active_scalars) + + +def test_integration_mesh(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ] + ) + + cube = load_cube(file_path, "conv_rain") + + polydata = cube_to_polydata(cube[0, :]) + # This is a known good output, we have plotted the result and checked it. + assert polydata.GetNumberOfCells() == 864 + assert polydata.GetNumberOfPoints() == 866 + np.testing.assert_array_equal(polydata.active_scalars, cube[0, :].data) diff --git a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py new file mode 100644 index 0000000000..7343809cdc --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py @@ -0,0 +1,34 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" + +from geovista.geodesic import BBox + +from iris import load_cube +from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region +from iris.tests import get_data_path + + +def test_face_region_extraction(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ] + ) + + global_cube = load_cube(file_path, "conv_rain") + polydata = cube_to_polydata(global_cube[0, :]) + region = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) + + extracted_cube = extract_unstructured_region( + global_cube, polydata, region, preference="center" + ) + + assert extracted_cube.ndim == 2 + assert extracted_cube.shape == (72, 101) + assert global_cube.shape == (72, 864) + assert global_cube.ndim == 2 diff --git a/lib/iris/tests/integration/experimental/test_regrid_ProjectedUnstructured.py b/lib/iris/tests/integration/experimental/test_regrid_ProjectedUnstructured.py index 2a70ac2d32..dd62a7f376 100644 --- a/lib/iris/tests/integration/experimental/test_regrid_ProjectedUnstructured.py +++ b/lib/iris/tests/integration/experimental/test_regrid_ProjectedUnstructured.py @@ -28,7 +28,7 @@ class TestProjectedUnstructured(tests.IrisTest): def setUp(self): path = tests.get_data_path( - ("NetCDF", "unstructured_grid", "theta_nodal_xios.nc") + ("NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc") ) self.src = iris.load_cube(path, "Potential Temperature") diff --git a/lib/iris/tests/integration/fast_load/test_fast_load.py b/lib/iris/tests/integration/fast_load/test_fast_load.py index 41893ac948..239af35925 100644 --- a/lib/iris/tests/integration/fast_load/test_fast_load.py +++ b/lib/iris/tests/integration/fast_load/test_fast_load.py @@ -375,7 +375,7 @@ def callback(cube, collation, filename): # This is actually a NumPy int32, so honour that here. expected[0].attributes["LBVC"] = np.int32(8) else: - expected[0].attributes["A_LBVC"] = [8, 8] + expected[0].attributes["A_LBVC"] = [np.int32(8)] * 2 self.assertEqual(results, expected) diff --git a/lib/iris/tests/integration/mesh/test_meshcoord_coordsys.py b/lib/iris/tests/integration/mesh/test_meshcoord_coordsys.py new file mode 100644 index 0000000000..9e14b12c9a --- /dev/null +++ b/lib/iris/tests/integration/mesh/test_meshcoord_coordsys.py @@ -0,0 +1,125 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for MeshCoord.coord_system() behaviour.""" + +import pytest + +import iris +from iris.coord_systems import GeogCS +from iris.tests.stock.netcdf import ncgen_from_cdl + +TEST_CDL = """ +netcdf mesh_test { + dimensions: + node = 3 ; + face = 1 ; + vertex = 3 ; + variables: + int mesh ; + mesh:cf_role = "mesh_topology" ; + mesh:topology_dimension = 2 ; + mesh:node_coordinates = "node_x node_y" ; + mesh:face_node_connectivity = "face_nodes" ; + float node_x(node) ; + node_x:standard_name = "longitude" ; + float node_y(node) ; + node_y:standard_name = "latitude" ; + int face_nodes(face, vertex) ; + face_nodes:cf_role = "face_node_connectivity" ; + face_nodes:start_index = 0 ; + float node_data(node) ; + node_data:coordinates = "node_x node_y" ; + node_data:location = "node" ; + node_data:mesh = "mesh" ; +} +""" + +BASIC_CRS_STR = """ + int crs ; + crs:grid_mapping_name = "latitude_longitude" ; + crs:semi_major_axis = 6371000.0 ; +""" + + +def find_i_line(lines, match): + (i_line,) = [i for i, line in enumerate(lines) if match in line] + return i_line + + +def make_file(nc_path, node_x_crs=False, node_y_crs=False): + lines = TEST_CDL.split("\n") + + includes = ["node_x"] if node_x_crs else [] + includes += ["node_y"] if node_y_crs else [] + includes = " ".join(includes) + if includes: + # insert a grid-mapping + i_line = find_i_line(lines, "variables:") + lines[i_line + 1 : i_line + 1] = BASIC_CRS_STR.split("\n") + + i_line = find_i_line(lines, "float node_data(") + ref_lines = [ + # NOTE: space to match the surrounding indent + f' node_data:grid_mapping = "crs: {includes}" ;', + # NOTE: this is already present + # f'node_data:coordinates = "{includes}" ;' + ] + lines[i_line + 1 : i_line + 1] = ref_lines + + cdl_str = "\n".join(lines) + ncgen_from_cdl(cdl_str=cdl_str, cdl_path=None, nc_path=nc_path) + + +@pytest.mark.parametrize("cs_axes", ["--", "x-", "-y", "xy"]) +def test_default_mesh_cs(tmp_path, cs_axes): + """Test coord-systems of mesh cube and coords, if location coords have a crs.""" + nc_path = tmp_path / "test_temp.nc" + do_x = "x" in cs_axes + do_y = "y" in cs_axes + make_file(nc_path, node_x_crs=do_x, node_y_crs=do_y) + cube = iris.load_cube(nc_path, "node_data") + meshco_x, meshco_y = [cube.coord(mesh_coords=True, axis=ax) for ax in ("x", "y")] + # NOTE: at present, none of these load with a coordinate system, + # because we don't support the extended grid-mapping syntax. + # see: https://github.com/SciTools/iris/issues/3388 + assert meshco_x.coord_system is None + assert meshco_y.coord_system is None + + +def test_assigned_mesh_cs(tmp_path): + # Check that when a coord system is manually assigned to a location coord, + # the corresponding meshcoord reports the same cs. + nc_path = tmp_path / "test_temp.nc" + make_file(nc_path) + cube = iris.load_cube(nc_path, "node_data") + nodeco_x = cube.mesh.coord(location="node", axis="x") + meshco_x, meshco_y = [cube.coord(axis=ax) for ax in ("x", "y")] + assert nodeco_x.coord_system is None + assert meshco_x.coord_system is None + assert meshco_y.coord_system is None + assigned_cs = GeogCS(1.0) + nodeco_x.coord_system = assigned_cs + assert meshco_x.coord_system is assigned_cs + assert meshco_y.coord_system is None + # This also affects cube.coord_system(), even though it is an auxcoord, + # since there are no dim-coords, or any other coord with a c-s. + # TODO: this may be a mistake -- see https://github.com/SciTools/iris/issues/6051 + assert cube.coord_system() is assigned_cs + + +def test_meshcoord_coordsys_copy(tmp_path): + # Check that copying a meshcoord with a coord system works properly. + nc_path = tmp_path / "test_temp.nc" + make_file(nc_path) + cube = iris.load_cube(nc_path, "node_data") + node_coord = cube.mesh.coord(location="node", axis="x") + assigned_cs = GeogCS(1.0) + node_coord.coord_system = assigned_cs + mesh_coord = cube.coord(axis="x") + assert mesh_coord.coord_system is assigned_cs + meshco_copy = mesh_coord.copy() + assert meshco_copy == mesh_coord + # Note: still the same object, because it is derived from the same node_coord + assert meshco_copy.coord_system is assigned_cs diff --git a/lib/iris/tests/integration/experimental/test_ugrid_save.py b/lib/iris/tests/integration/mesh/test_ugrid_save.py similarity index 92% rename from lib/iris/tests/integration/experimental/test_ugrid_save.py rename to lib/iris/tests/integration/mesh/test_ugrid_save.py index 8350a2004f..df3c9cc553 100644 --- a/lib/iris/tests/integration/experimental/test_ugrid_save.py +++ b/lib/iris/tests/integration/mesh/test_ugrid_save.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Integration tests for NetCDF-UGRID file saving.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -13,7 +14,6 @@ import tempfile import iris -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD import iris.fileformats.netcdf from iris.tests.stock.netcdf import _add_standard_data, ncgen_from_cdl @@ -47,8 +47,7 @@ def test_example_result_cdls(self): # Fill in blank data-variables. _add_standard_data(target_ncfile_path) # Load as Iris data - with PARSE_UGRID_ON_LOAD.context(): - cubes = iris.load(target_ncfile_path) + cubes = iris.load(target_ncfile_path) # Re-save, to check the save behaviour. resave_ncfile_path = str(self.temp_dir / f"{ex_name}_resaved.nc") iris.save(cubes, resave_ncfile_path) @@ -68,8 +67,7 @@ def test_example_roundtrips(self): # Fill in blank data-variables. _add_standard_data(target_ncfile_path) # Load the original as Iris data - with PARSE_UGRID_ON_LOAD.context(): - orig_cubes = iris.load(target_ncfile_path) + orig_cubes = iris.load(target_ncfile_path) if "ex4" in ex_name: # Discard the extra formula terms component cubes @@ -79,8 +77,7 @@ def test_example_roundtrips(self): # Save-and-load-back to compare the Iris saved result. resave_ncfile_path = str(self.temp_dir / f"{ex_name}_resaved.nc") iris.save(orig_cubes, resave_ncfile_path) - with PARSE_UGRID_ON_LOAD.context(): - savedloaded_cubes = iris.load(resave_ncfile_path) + savedloaded_cubes = iris.load(resave_ncfile_path) # This should match the original exactly # ..EXCEPT for our inability to compare meshes. diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/README.txt b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/README.txt similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/README.txt rename to lib/iris/tests/integration/mesh/ugrid_conventions_examples/README.txt diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl similarity index 97% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl rename to lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl index d022fedc61..faf86c04c5 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl +++ b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl @@ -6,7 +6,7 @@ nMesh1_edge = 4 ; // nEdges Two = 2; variables: -// Mesh topology +// MeshXY topology integer Mesh1 ; Mesh1:cf_role = "mesh_topology" ; Mesh1:long_name = "Topology data of 1D network" ; @@ -19,7 +19,7 @@ Mesh1_edge_nodes:cf_role = "edge_node_connectivity" ; Mesh1_edge_nodes:long_name = "Maps every edge/link to the two nodes that it connects." ; Mesh1_edge_nodes:start_index = 1 ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh1_node_x(nMesh1_node) ; Mesh1_node_x:standard_name = "longitude" ; Mesh1_node_x:long_name = "Longitude of 1D network nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl similarity index 98% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl rename to lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl index 1e4e483826..0dd01a3c62 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl +++ b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl @@ -8,7 +8,7 @@ Two = 2 ; Three = 3 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -50,7 +50,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl similarity index 99% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl rename to lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl index 2fa077d152..fbbd3aa544 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl +++ b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl @@ -8,7 +8,7 @@ nMaxMesh2_face_nodes = 4 ; // MaxNumNodesPerFace Two = 2 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -52,7 +52,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl similarity index 99% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl rename to lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl index d154502018..48fab9bdd7 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl +++ b/lib/iris/tests/integration/mesh/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl @@ -9,7 +9,7 @@ Mesh2_layers = 10 ; Two = 2 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -53,7 +53,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/netcdf/test__dask_locks.py b/lib/iris/tests/integration/netcdf/test__dask_locks.py index 6e1026b29f..1aee902195 100644 --- a/lib/iris/tests/integration/netcdf/test__dask_locks.py +++ b/lib/iris/tests/integration/netcdf/test__dask_locks.py @@ -11,6 +11,7 @@ and (b) mock-ist testing of the implementation code in isolation would not add anything of much value. """ + import dask import dask.config import distributed diff --git a/lib/iris/tests/integration/netcdf/test_aux_factories.py b/lib/iris/tests/integration/netcdf/test_aux_factories.py index a0c2ec5992..4b4976bd18 100644 --- a/lib/iris/tests/integration/netcdf/test_aux_factories.py +++ b/lib/iris/tests/integration/netcdf/test_aux_factories.py @@ -75,9 +75,10 @@ def test_save_load_loop(self): # Tests an issue where the variable names in the formula # terms changed to the standard_names instead of the variable names # when loading a previously saved cube. - with self.temp_filename(suffix=".nc") as filename, self.temp_filename( - suffix=".nc" - ) as other_filename: + with ( + self.temp_filename(suffix=".nc") as filename, + self.temp_filename(suffix=".nc") as other_filename, + ): iris.save(self.cube, filename) cube = iris.load_cube(filename, "air_potential_temperature") iris.save(cube, other_filename) @@ -117,8 +118,9 @@ def test_shared_primary(self): ) factory.rename("another altitude") cube.add_aux_factory(factory) - with self.temp_filename(suffix=".nc") as filename, self.assertRaisesRegex( - ValueError, "multiple aux factories" + with ( + self.temp_filename(suffix=".nc") as filename, + self.assertRaisesRegex(ValueError, "multiple aux factories"), ): iris.save(cube, filename) @@ -141,8 +143,9 @@ def test_hybrid_height_cubes_on_dimension_coordinate(self): sa = hh2.coord("surface_altitude") sa.points = sa.points * 10 emsg = "Unable to create dimensonless vertical coordinate." - with self.temp_filename(".nc") as fname, self.assertRaisesRegex( - ValueError, emsg + with ( + self.temp_filename(".nc") as fname, + self.assertRaisesRegex(ValueError, emsg), ): iris.save([hh1, hh2], fname) diff --git a/lib/iris/tests/integration/netcdf/test_coord_systems.py b/lib/iris/tests/integration/netcdf/test_coord_systems.py index 55ecf2e2ef..6c101d9024 100644 --- a/lib/iris/tests/integration/netcdf/test_coord_systems.py +++ b/lib/iris/tests/integration/netcdf/test_coord_systems.py @@ -11,6 +11,9 @@ from os.path import join as path_join import shutil import tempfile +import warnings + +import pytest import iris from iris.coords import DimCoord @@ -135,15 +138,25 @@ def test_load_datum_wkt(self): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected def test_no_load_datum_wkt(self): nc_path = tlc.cdl_to_nc(self.datum_wkt_cdl) - with self.assertWarnsRegex(FutureWarning, "iris.FUTURE.datum_support"): + with pytest.warns(FutureWarning, match="iris.FUTURE.datum_support"): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(actual, "unknown") + assert actual == "unknown" + + def test_no_datum_no_warn(self): + new_cdl = self.datum_wkt_cdl.splitlines() + new_cdl = [line for line in new_cdl if "DATUM" not in line] + new_cdl = "\n".join(new_cdl) + nc_path = tlc.cdl_to_nc(new_cdl) + with warnings.catch_warnings(): + # pytest's recommended way to assert for no warnings. + warnings.simplefilter("error", FutureWarning) + _ = iris.load_cube(nc_path) def test_load_datum_cf_var(self): expected = "OSGB 1936" @@ -152,15 +165,15 @@ def test_load_datum_cf_var(self): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected def test_no_load_datum_cf_var(self): nc_path = tlc.cdl_to_nc(self.datum_cf_var_cdl) - with self.assertWarnsRegex(FutureWarning, "iris.FUTURE.datum_support"): + with pytest.warns(FutureWarning, match="iris.FUTURE.datum_support"): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(actual, "unknown") + assert actual == "unknown" def test_save_datum(self): expected = "OSGB 1936" @@ -199,7 +212,7 @@ def test_save_datum(self): test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected class TestLoadMinimalGeostationary(tests.IrisTest): @@ -270,9 +283,9 @@ def test_geostationary_no_false_offsets(self): cube = iris.load_cube(self.path_test_nc) # Check the coordinate system properties has the correct default properties. cs = cube.coord_system() - self.assertIsInstance(cs, iris.coord_systems.Geostationary) - self.assertEqual(cs.false_easting, 0.0) - self.assertEqual(cs.false_northing, 0.0) + assert isinstance(cs, iris.coord_systems.Geostationary) + assert cs.false_easting == 0.0 + assert cs.false_northing == 0.0 if __name__ == "__main__": diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index cb375cc592..2869924dce 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Integration tests for delayed saving.""" -import re + import warnings from cf_units import Unit @@ -18,7 +18,6 @@ from iris.fileformats.netcdf._thread_safe_nc import default_fillvals import iris.tests from iris.tests.stock import realistic_4d -from iris.warnings import IrisSaverFillValueWarning class Test__lazy_stream_data: @@ -184,39 +183,12 @@ def test_scheduler_types(self, output_path, scheduler_type, save_is_delayed): cube = self.make_testcube( include_lazy_content=True, ensure_fillvalue_collision=True ) - with warnings.catch_warnings(record=True) as logged_warnings: - result = iris.save(cube, output_path, compute=not save_is_delayed) + result = iris.save(cube, output_path, compute=not save_is_delayed) if not save_is_delayed: assert result is None - issued_warnings = [log.message for log in logged_warnings] else: - assert result is not None - assert len(logged_warnings) == 0 - with warnings.catch_warnings(record=True) as logged_warnings: - # The compute *returns* warnings from the delayed operations. - issued_warnings = result.compute() - issued_warnings = [log.message for log in logged_warnings] + issued_warnings - - warning_messages = [warning.args[0] for warning in issued_warnings] - if scheduler_type == "DistributedScheduler": - # Ignore any "large data transfer" messages generated, - # specifically when testing with the Distributed scheduler. - # These may not always occur and don't reflect something we want to - # test for. - large_transfer_message_regex = re.compile( - "Sending large graph.* may cause some slowdown", re.DOTALL - ) - warning_messages = [ - message - for message in warning_messages - if not large_transfer_message_regex.search(message) - ] - - # In all cases, should get 2 fill value warnings overall. - assert len(warning_messages) == 2 - expected_msg = "contains unmasked data points equal to the fill-value" - assert all(expected_msg in message for message in warning_messages) + assert isinstance(result, Delayed) def test_time_of_writing(self, save_is_delayed, output_path, scheduler_type): # Check when lazy data is *actually* written : @@ -289,49 +261,6 @@ def fetch_masks(): assert np.all(~ancil_mask) assert np.all(~cm_mask) - @pytest.mark.parametrize( - "warning_type", ["WarnMaskedBytes", "WarnFillvalueCollision"] - ) - def test_fill_warnings(self, warning_type, output_path, save_is_delayed): - # Test collision warnings for data with fill-value collisions, or for masked - # byte data. - if warning_type == "WarnFillvalueCollision": - make_fv_collide = True - make_maskedbytes = False - expected_msg = "contains unmasked data points equal to the fill-value" - else: - assert warning_type == "WarnMaskedBytes" - make_fv_collide = False - make_maskedbytes = True - expected_msg = "contains byte data with masked points" - - cube = self.make_testcube( - include_lazy_content=True, - ensure_fillvalue_collision=make_fv_collide, - data_is_maskedbytes=make_maskedbytes, - ) - with warnings.catch_warnings(record=True) as logged_warnings: - result = iris.save(cube, output_path, compute=not save_is_delayed) - - result_warnings = [ - log.message - for log in logged_warnings - if isinstance(log.message, IrisSaverFillValueWarning) - ] - - if save_is_delayed: - # Should have had *no* fill-warnings in the initial save. - assert len(result_warnings) == 0 - # Complete the operation now - with warnings.catch_warnings(): - # NOTE: warnings should *not* be issued here, instead they are returned. - warnings.simplefilter("error", category=IrisSaverFillValueWarning) - result_warnings = result.compute() - - # Either way, we should now have 2 similar warnings. - assert len(result_warnings) == 2 - assert all(expected_msg in warning.args[0] for warning in result_warnings) - def test_no_delayed_writes(self, output_path): # Just check that a delayed save returns a usable 'delayed' object, even when # there is no lazy content = no delayed writes to perform. @@ -339,4 +268,3 @@ def test_no_delayed_writes(self, output_path): warnings.simplefilter("error") result = iris.save(cube, output_path, compute=False) assert isinstance(result, Delayed) - assert result.compute() == [] diff --git a/lib/iris/tests/integration/netcdf/test_general.py b/lib/iris/tests/integration/netcdf/test_general.py index 1020ddbb96..88d636a315 100644 --- a/lib/iris/tests/integration/netcdf/test_general.py +++ b/lib/iris/tests/integration/netcdf/test_general.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Integration tests for loading and saving netcdf files.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -487,37 +488,38 @@ def test_path_string_save_same(self): @tests.skip_data class TestWarningRepeats(tests.IrisTest): - def test_datum_once(self): - """Tests for warnings being duplicated. - - Notes - ----- - This test relies on `iris.load` throwing a warning. This warning might - be removed in the future, in which case `assert len(record) == 2 should` - be change to `assert len(record) == 1`. + def test_warning_repeats(self): + """Confirm Iris load does not break Python duplicate warning handling.""" + # units.nc is designed for testing Iris' 'ignoring invalid units' + # warning; it contains two variables with invalid units, producing two + # unique warnings (due to two different messages). + file_path = tests.get_data_path(("NetCDF", "testing", "units.nc")) - toa_brightness_temperature.nc has an AuxCoord with lazy data, and triggers a - specific part of dask which contains a `catch_warnings()` call which - causes warnings to be repeated, and so has been removed from the - `fnames` list until a solution is found for such a file. - - """ - # - fnames = [ - "false_east_north_merc.nc", - "non_unit_scale_factor_merc.nc", - # toa_brightness_temperature.nc, - ] - fpaths = [ - tests.get_data_path(("NetCDF", "mercator", fname)) for fname in fnames - ] + def _raise_warning() -> None: + # Contain in function so warning always has identical line number. + warnings.warn("Dummy warning", category=iris.warnings.IrisUserWarning) with warnings.catch_warnings(record=True) as record: warnings.simplefilter("default") - for fpath in fpaths: - iris.load(fpath) - warnings.warn("Dummy warning", category=iris.warnings.IrisUserWarning) - assert len(record) == 2 + + # Warn before Iris has been invoked. + _raise_warning() + assert len(record) == 1 + + # This Iris call should raise 2 warnings and should NOT affect + # Python's duplicate warning handling. + _ = iris.load(file_path) + assert len(record) == 3 + # Raise a duplicate warning. + _raise_warning() + assert len(record) == 3 + + # Repeated identical calls should only raise duplicate warnings + # and therefore not affect the record. + for i in range(2): + _ = iris.load(file_path) + _raise_warning() + assert len(record) == 3 if __name__ == "__main__": diff --git a/lib/iris/tests/integration/netcdf/test_thread_safety.py b/lib/iris/tests/integration/netcdf/test_thread_safety.py index b2319364c2..53b40dbe85 100644 --- a/lib/iris/tests/integration/netcdf/test_thread_safety.py +++ b/lib/iris/tests/integration/netcdf/test_thread_safety.py @@ -17,6 +17,7 @@ a thread safety problem, as this seems to be good testing practice. """ + from pathlib import Path import dask diff --git a/lib/iris/tests/integration/experimental/test_ugrid_load.py b/lib/iris/tests/integration/netcdf/test_ugrid_load.py similarity index 86% rename from lib/iris/tests/integration/experimental/test_ugrid_load.py rename to lib/iris/tests/integration/netcdf/test_ugrid_load.py index d513d02497..82098a5d5a 100644 --- a/lib/iris/tests/integration/experimental/test_ugrid_load.py +++ b/lib/iris/tests/integration/netcdf/test_ugrid_load.py @@ -2,12 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Integration tests for NetCDF-UGRID file loading. +"""Integration tests for NetCDF-UGRID file loading.""" -todo: fold these tests into netcdf tests when experimental.ugrid is folded into - standard behaviour. - -""" # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -17,8 +13,8 @@ import pytest from iris import Constraint, load -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes -from iris.experimental.ugrid.mesh import Mesh +from iris.fileformats.netcdf.ugrid_load import load_mesh, load_meshes +from iris.mesh import MeshXY from iris.tests.stock.netcdf import ( _file_from_cdl_template as create_file_from_cdl_template, ) @@ -46,8 +42,7 @@ def ugrid_load(uris, constraints=None, callback=None): constraints = [constraints] constraints.append(filter_orphan_connectivities) - with PARSE_UGRID_ON_LOAD.context(): - return load(uris, constraints, callback) + return load(uris, constraints, callback) @tests.skip_data @@ -58,7 +53,7 @@ def common_test(self, load_filename, assert_filename): ) self.assertEqual(1, len(cube_list)) cube = cube_list[0] - self.assertCML(cube, ["experimental", "ugrid", assert_filename]) + self.assertCML(cube, ["mesh", assert_filename]) def test_2D_1t_face_half_levels(self): self.common_test( @@ -109,12 +104,11 @@ def test_3D_veg_pseudo_levels(self): ) def test_no_mesh(self): - with PARSE_UGRID_ON_LOAD.context(): - cube_list = load( - tests.get_data_path( - ["NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc"] - ) + cube_list = load( + tests.get_data_path( + ["NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc"] ) + ) self.assertTrue(all([cube.mesh is None for cube in cube_list])) @@ -126,7 +120,7 @@ def test_multiple_phenomena(self): ["NetCDF", "unstructured_grid", "lfric_surface_mean.nc"] ), ) - self.assertCML(cube_list, ("experimental", "ugrid", "surface_mean.cml")) + self.assertCML(cube_list, ("mesh", "surface_mean.cml")) class TestTolerantLoading(XIOSFileMixin): @@ -171,7 +165,7 @@ def test_mesh_bad_topology_dimension(self): def test_mesh_no_topology_dimension(self): # Check that the load generates a suitable warning. - warn_regex = r"Mesh variable.* has no 'topology_dimension'" + warn_regex = r"MeshXY variable.* has no 'topology_dimension'" with pytest.warns(IrisCfWarning, match=warn_regex): template = "minimal_bad_topology_dim" dim_line = "" # don't create ANY topology_dimension property @@ -206,12 +200,11 @@ def test_mesh_no_cf_role(self): @tests.skip_data class Test_load_mesh(tests.IrisTest): def common_test(self, file_name, mesh_var_name): - with PARSE_UGRID_ON_LOAD.context(): - mesh = load_mesh( - tests.get_data_path(["NetCDF", "unstructured_grid", file_name]) - ) + mesh = load_mesh( + tests.get_data_path(["NetCDF", "unstructured_grid", file_name]) + ) # NOTE: cannot use CML tests as this isn't supported for non-Cubes. - self.assertIsInstance(mesh, Mesh) + self.assertIsInstance(mesh, MeshXY) self.assertEqual(mesh.var_name, mesh_var_name) def test_full_file(self): @@ -224,12 +217,11 @@ def test_mesh_file(self): self.common_test("mesh_C12.nc", "dynamics") def test_no_mesh(self): - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes( - tests.get_data_path( - ["NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc"] - ) + meshes = load_meshes( + tests.get_data_path( + ["NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc"] ) + ) self.assertDictEqual({}, meshes) diff --git a/lib/iris/tests/integration/test_netcdf__loadsaveattrs.py b/lib/iris/tests/integration/test_netcdf__loadsaveattrs.py index 226babc9fb..b89477bfe9 100644 --- a/lib/iris/tests/integration/test_netcdf__loadsaveattrs.py +++ b/lib/iris/tests/integration/test_netcdf__loadsaveattrs.py @@ -17,6 +17,8 @@ might be recorded either globally or locally. """ + +from collections.abc import Sequence import inspect import json import os @@ -46,12 +48,11 @@ # A list of "global-style" attribute names : those which should be global attributes by # default (i.e. file- or group-level, *not* attached to a variable). -_GLOBAL_TEST_ATTRS = set(iris.fileformats.netcdf.saver._CF_GLOBAL_ATTRS) +_GLOBAL_TEST_ATTRS = sorted(iris.fileformats.netcdf.saver._CF_GLOBAL_ATTRS) # Remove this one, which has peculiar behaviour + is tested separately # N.B. this is not the same as 'Conventions', but is caught in the crossfire when that # one is processed. -_GLOBAL_TEST_ATTRS -= set(["conventions"]) -_GLOBAL_TEST_ATTRS = sorted(_GLOBAL_TEST_ATTRS) +_GLOBAL_TEST_ATTRS = [a for a in _GLOBAL_TEST_ATTRS if a != "conventions"] # Define a fixture to parametrise tests over the 'global-style' test attributes. @@ -94,7 +95,7 @@ def local_attr(request): def check_captured_warnings( - expected_keys: List[str], + expected_keys: List[str] | str | None, captured_warnings: List[warnings.WarningMessage], allow_possible_legacy_warning: bool = False, ): @@ -108,13 +109,14 @@ def check_captured_warnings( # TODO: when iris.FUTURE.save_split_attrs is removed, we can remove the # 'allow_possible_legacy_warning' arg. + if expected_keys == _SKIP_WARNCHECK: + # No check at all in this case + return + if expected_keys is None: expected_keys = [] - elif hasattr(expected_keys, "upper"): + elif isinstance(expected_keys, str): # Handle a single string - if expected_keys == _SKIP_WARNCHECK: - # No check at all in this case - return expected_keys = [expected_keys] if allow_possible_legacy_warning: @@ -125,14 +127,14 @@ def check_captured_warnings( ) expected_keys.append(legacy_message_key) - expected_keys = [re.compile(key) for key in expected_keys] + expected_patterns = [re.compile(key) for key in expected_keys] found_results = [str(warning.message) for warning in captured_warnings] - remaining_keys = expected_keys.copy() + remaining_keys = expected_patterns.copy() for i_message, message in enumerate(found_results.copy()): for key in remaining_keys: if key.search(message): # Hit : replace one message in the list with its matching "key" - found_results[i_message] = key + found_results[i_message] = key # type: ignore[call-overload] # remove the matching key remaining_keys.remove(key) # skip on to next message @@ -141,9 +143,11 @@ def check_captured_warnings( if allow_possible_legacy_warning: # Remove any unused "legacy attribute saving" key. # N.B. this is the *only* key we will tolerate not being used. - expected_keys = [key for key in expected_keys if key != legacy_message_key] + expected_patterns = [ + key for key in expected_patterns if key != legacy_message_key + ] - assert set(found_results) == set(expected_keys) + assert set(found_results) == set(expected_patterns) class MixinAttrsTesting: @@ -360,8 +364,8 @@ def run_testcase( def fetch_results( self, - filepath: str = None, - cubes: Iterable[Cube] = None, + filepath: str | None = None, + cubes: Iterable[Cube] | None = None, oldstyle_combined: bool = False, ): """Return testcase results from an output file or cubes in a standardised form. @@ -560,11 +564,11 @@ def decode_specstring(spec: str) -> List[Union[str, None]]: return result -def encode_matrix_result(results: List[List[str]]) -> List[str]: +def encode_matrix_result(results) -> List[str]: # Re-code a set of output results, [*[global-value, *local-values]] as a list of # strings, like ["GaL-b"] or ["GaLabc", "GbLabc"]. # N.B. again assuming that all values are just one-character strings, or None. - assert isinstance(results, Iterable) and len(results) >= 1 + assert isinstance(results, Sequence) and len(results) >= 1 if not isinstance(results[0], list): results = [results] assert all( @@ -1018,7 +1022,7 @@ def test_16_localstyle(self, local_attr, origin_style, do_split): expected_result = [expect_global, expect_var] if do_split and origin_style == "input_global": # The result is simply the "other way around" - expected_result = expected_result[::-1] + expected_result.reverse() self.check_roundtrip_results(expected_result) @pytest.mark.parametrize("testcase", _MATRIX_TESTCASES[:max_param_attrs]) @@ -1344,7 +1348,7 @@ def run_save_testcase(self, attr_name: str, values: list): self.captured_warnings = captured_warnings - def run_save_testcase_legacytype(self, attr_name: str, values: list): + def run_save_testcase_legacytype(self, attr_name: str, values): """Legacy-type means : before cubes had split attributes. This just means we have only one "set" of cubes, with ***no*** distinct global @@ -1356,7 +1360,9 @@ def run_save_testcase_legacytype(self, attr_name: str, values: list): self.run_save_testcase(attr_name, [None] + values) - def check_save_results(self, expected: list, expected_warnings: List[str] = None): + def check_save_results( + self, expected: list, expected_warnings: List[str] | None = None + ): results = self.fetch_results(filepath=self.result_filepath) assert results == expected check_captured_warnings( diff --git a/lib/iris/tests/integration/test_pp.py b/lib/iris/tests/integration/test_pp.py index 1ed9dca853..1e71da623a 100644 --- a/lib/iris/tests/integration/test_pp.py +++ b/lib/iris/tests/integration/test_pp.py @@ -280,9 +280,10 @@ def test_hybrid_pressure_with_duplicate_references(self): return_value=iter([data_field, pressure_field, pressure_field]) ) msg = "Multiple reference cubes for surface_air_pressure" - with mock.patch("iris.fileformats.pp.load", new=load) as load, mock.patch( - "warnings.warn" - ) as warn: + with ( + mock.patch("iris.fileformats.pp.load", new=load) as load, + mock.patch("warnings.warn") as warn, + ): _, _, _ = iris.fileformats.pp.load_cubes("DUMMY") warn.assert_called_with(msg, category=IrisUserWarning) @@ -396,9 +397,10 @@ def test_hybrid_height_round_trip_no_reference(self): # Convert field to a cube. load = mock.Mock(return_value=iter([data_field])) - with mock.patch("iris.fileformats.pp.load", new=load) as load, mock.patch( - "warnings.warn" - ) as warn: + with ( + mock.patch("iris.fileformats.pp.load", new=load) as load, + mock.patch("warnings.warn") as warn, + ): (data_cube,) = iris.fileformats.pp.load_cubes("DUMMY") msg = ( diff --git a/lib/iris/tests/integration/test_regridding.py b/lib/iris/tests/integration/test_regridding.py index c8197a9d94..7d65577545 100644 --- a/lib/iris/tests/integration/test_regridding.py +++ b/lib/iris/tests/integration/test_regridding.py @@ -98,7 +98,7 @@ def test_nearest(self): class TestUnstructured(tests.IrisTest): def setUp(self): path = tests.get_data_path( - ("NetCDF", "unstructured_grid", "theta_nodal_xios.nc") + ("NetCDF", "unstructured_grid", "theta_nodal_not_ugrid.nc") ) self.src = iris.load_cube(path, "Potential Temperature") self.grid = simple_3d()[0, :, :] diff --git a/lib/iris/tests/integration/test_trajectory.py b/lib/iris/tests/integration/test_trajectory.py index aa4ce67a3b..f56970f9fa 100644 --- a/lib/iris/tests/integration/test_trajectory.py +++ b/lib/iris/tests/integration/test_trajectory.py @@ -11,6 +11,7 @@ import numpy as np import iris +from iris import LOAD_POLICY from iris._lazy_data import as_lazy_data from iris.analysis.trajectory import Trajectory from iris.analysis.trajectory import interpolate as traj_interpolate @@ -22,7 +23,9 @@ class TestColpex(tests.IrisTest): def setUp(self): # Load the COLPEX data => TZYX path = tests.get_data_path(["PP", "COLPEX", "theta_and_orog_subset.pp"]) - cube = iris.load_cube(path, "air_potential_temperature") + # Fix to ignore time-varying orography, for the purposes of these tests + with LOAD_POLICY.context(support_multiple_references=False): + cube = iris.load_cube(path, "air_potential_temperature") cube.coord("grid_latitude").bounds = None cube.coord("grid_longitude").bounds = None # TODO: Workaround until regrid can handle factories diff --git a/lib/iris/tests/integration/varying_references/__init__.py b/lib/iris/tests/integration/varying_references/__init__.py new file mode 100644 index 0000000000..3c37f02242 --- /dev/null +++ b/lib/iris/tests/integration/varying_references/__init__.py @@ -0,0 +1,12 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for loading with varying references. + +Practically, this mostly means loading from fields-based file formats such as PP and +GRIB, and when hybrid vertical coordinates which have time-varying reference fields. +E.G. hybrid height with time-varying orography, or hybrid-pressure with time-varying +surface pressure. + +""" diff --git a/lib/iris/tests/integration/varying_references/test_realdata_load.py b/lib/iris/tests/integration/varying_references/test_realdata_load.py new file mode 100644 index 0000000000..edf2b00824 --- /dev/null +++ b/lib/iris/tests/integration/varying_references/test_realdata_load.py @@ -0,0 +1,58 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Test loading PP data with time-varying orography.""" + +import pytest + +import iris +from iris import LOAD_POLICY, sample_data_path + + +@pytest.fixture(params=["default", "recommended", "legacy"]) +def load_policy(request): + return request.param + + +def test_load_pp_timevarying_orography(load_policy): + testdata_dirpath = sample_data_path("time_varying_hybrid_height", "*.pp") + + with LOAD_POLICY.context(load_policy): + cubes = iris.load(testdata_dirpath) + + n_cubes = len(cubes) + if load_policy == "legacy": + # This doesn't merge fully: get a phenomenon cube for each reference field + assert n_cubes == 4 + else: + # Other load policies load with full merge, producing a 4D result. + assert n_cubes == 2 + phenom_cube = cubes.extract_cube("x_wind") + ref_cube = cubes.extract_cube("surface_altitude") + + cube_dims = [ + phenom_cube.coord(dim_coords=True, dimensions=i_dim).name() + for i_dim in range(phenom_cube.ndim) + ] + assert cube_dims == ["model_level_number", "time", "latitude", "longitude"] + + ref_coord = phenom_cube.coord("surface_altitude") + ref_coord_dims = [ + phenom_cube.coord(dim_coords=True, dimensions=i_dim).name() + for i_dim in phenom_cube.coord_dims(ref_coord) + ] + assert ref_coord_dims == ["time", "latitude", "longitude"] + + ref_cube_dims = [ + ref_cube.coord(dim_coords=True, dimensions=i_dim).name() + for i_dim in range(ref_cube.ndim) + ] + assert ref_cube_dims == ref_cube_dims + + derived_coord = phenom_cube.coord("altitude") + derived_dims = [ + phenom_cube.coord(dim_coords=True, dimensions=i_dim).name() + for i_dim in phenom_cube.coord_dims(derived_coord) + ] + assert derived_dims == ["model_level_number", "time", "latitude", "longitude"] diff --git a/lib/iris/tests/integration/varying_references/test_roundtrip_time_varying_references.py b/lib/iris/tests/integration/varying_references/test_roundtrip_time_varying_references.py new file mode 100644 index 0000000000..0ad4b5a941 --- /dev/null +++ b/lib/iris/tests/integration/varying_references/test_roundtrip_time_varying_references.py @@ -0,0 +1,341 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Code to save and re-load hybrid vertical coordinates with variable reference fields. + +Tests all combinations of: + * file format: PP, GRIB and NetCDF + * reference fields: static (for legacy reference) and time-dependent + * hybrid coordinate fields: + * hybrid-height levels with orography, and + * hybrid-pressure levels with surface-pressure +""" + +import numpy as np +import pytest + +import iris +from iris import LOAD_POLICY +from iris.aux_factory import HybridHeightFactory, HybridPressureFactory +from iris.coord_systems import GeogCS +from iris.coords import AuxCoord, DimCoord +from iris.cube import Cube, CubeList +from iris.fileformats.pp import EARTH_RADIUS, STASH +from iris.util import new_axis + +try: + import iris_grib +except ImportError: + iris_grib = None + +# General test dimensions = (timepoints, levels, lats, lons) +NT, NZ, NY, NX = (3, 4, 5, 6) + + +def make_hybrid_z_testdata( + hybrid_zcoord_type="height", + make_reference_time_dependent=True, + include_reference_as_cube=False, +): + """Construct a realistic synthetic data cube with a hybrid vertical coordinate. + + Parameters + ---------- + hybrid_zcoord_type : string, default "height" + either "height" or "pressure" + make_reference_time_dependent : bool, default True + if True, the reference coord has dims (t, y, x), otherwise just (y, x) + include_reference_as_cube : bool, default False + if True, the result includes a separate cube of the reference values. + (Because this must be separately passed to save for the fields-based formats.) + + Returns + ------- + cubes + A list containing a cube with (t, z, y, x) dims and the appropriate + aux-factory. + Optionally, if "include_reference_as_cube" is True, an extra cube + containing the reference data is aldo returned. + + """ + crs = GeogCS(EARTH_RADIUS) + z_dim, t_dim, y_dim, x_dim = 0, 1, 2, 3 + co_t = DimCoord( + np.arange(NT, dtype=np.float32), + standard_name="time", + units="days since 2000-01-01", + ) + co_z = DimCoord( + np.arange(1, NZ + 1, dtype=np.int32), + standard_name="model_level_number", + units=1, + ) + co_y = DimCoord( + np.linspace(0, 120.0, NY, dtype=np.float32), + standard_name="latitude", + units="degrees", + coord_system=crs, + ) + co_x = DimCoord( + np.linspace(-30.0, 50.0, NX, dtype=np.float32), + standard_name="longitude", + units="degrees", + coord_system=crs, + ) + cube = Cube( + np.zeros((NZ, NT, NY, NX), dtype=np.float32), + standard_name="air_temperature", + units="K", + dim_coords_and_dims=zip((co_t, co_z, co_y, co_x), (t_dim, z_dim, y_dim, x_dim)), + ) + + delta_vals = np.linspace(200.0, 600, NZ, dtype=np.float32) + if hybrid_zcoord_type == "pressure": + co_delta = DimCoord(delta_vals, long_name="delta", units="hPa") + elif hybrid_zcoord_type == "height": + co_delta = DimCoord(delta_vals, long_name="level_height", units="m") + else: + raise ValueError(f"Unknown hybrid coordinate type: {hybrid_zcoord_type}") + + sigma_vals = np.linspace(0.2, 0.8, NZ, dtype=np.float32) + co_sigma = DimCoord(sigma_vals, long_name="sigma", units=1) + + # Note: will not save as HH to PP without bounds on delta+sigma + for coord in (co_delta, co_sigma): + coord.guess_bounds() + cube.add_aux_coord(co_delta, z_dim) + cube.add_aux_coord(co_sigma, z_dim) + + refdata = np.arange(NT * NY * NX, dtype=np.float32) + refdata = 1000.0 + refdata.reshape(NT, NY, NX) + if hybrid_zcoord_type == "pressure": + co_ref = AuxCoord( + refdata, + standard_name="surface_air_pressure", + units="hPa", + attributes={"STASH": STASH(model=1, section=0, item=409)}, + ) + elif hybrid_zcoord_type == "height": + co_ref = AuxCoord( + refdata, + standard_name="surface_altitude", + units="m", + attributes={"STASH": STASH(model=1, section=0, item=33)}, + ) + else: + raise ValueError(f"Unknown hybrid type: {hybrid_zcoord_type}") + + ref_dims = (t_dim, y_dim, x_dim) + if not make_reference_time_dependent: + co_ref = co_ref[0] + ref_dims = ref_dims[1:] + + cube.add_aux_coord(co_ref, ref_dims) + if hybrid_zcoord_type == "pressure": + factory = HybridPressureFactory( + sigma=co_sigma, delta=co_delta, surface_air_pressure=co_ref + ) + elif hybrid_zcoord_type == "height": + factory = HybridHeightFactory(sigma=co_sigma, delta=co_delta, orography=co_ref) + else: + raise ValueError(f"Unknown hybrid type: {hybrid_zcoord_type}") + + cube.add_aux_factory(factory) + + cubes = CubeList([cube]) + + if include_reference_as_cube: + ref_dimcoords = [ + cube.coord(dim_coords=True, dimensions=cube_refdim) + for cube_refdim in cube.coord_dims(co_ref) + ] + reference_cube = Cube( + co_ref.points, + standard_name=co_ref.standard_name, + units=co_ref.units, + dim_coords_and_dims=[ + (ref_dimcoord, i_refdim) + for i_refdim, ref_dimcoord in enumerate(ref_dimcoords) + ], + attributes=co_ref.attributes, + ) + if not reference_cube.coords("time"): + # Add a dummy time coordinate to non-time-dependent reference cube + # - mostly because otherwise it cannot be saved to GRIB format + # NOTE: we give this a different nominal time to any of the data : when + # there is only one reference field, it's recorded time value should be + # **ignored** by the loader + reference_cube.add_aux_coord( + DimCoord( + np.array(0, dtype=np.float32), + standard_name="time", + units="days since 1900-01-01", + ) + ) + cubes.append(reference_cube) + + return cubes + + +def check_expected(result_cubes, file_extension, time_dependence, zcoord_type): + assert len(result_cubes) == 2 + result_phenom = result_cubes.extract_cube("air_temperature") + + if zcoord_type == "pressure": + ref_coord_name = ref_cube_name = "surface_air_pressure" + if file_extension == "grib2": + ref_cube_name = "air_pressure" + elif zcoord_type == "height": + ref_coord_name = ref_cube_name = "surface_altitude" + else: + raise ValueError(f"Unknown hybrid coordinate type: {zcoord_type}") + + result_ref_cube = result_cubes.extract_cube(ref_cube_name) + result_ref_coord = result_phenom.coord(ref_coord_name) + + # Check that the reference cube and the coord are equivalent + assert result_ref_coord.shape == result_ref_cube.shape + assert np.array_equal(result_ref_cube.data, result_ref_coord.points) + assert not result_ref_coord.bounds # bounds are unused in our testcases + + # Check the expected phenomenon shape + if time_dependence == "static" and file_extension in ("pp", "grib2"): + phenom_shape = (NT, NZ, NY, NX) + else: + phenom_shape = (NZ, NT, NY, NX) + assert result_phenom.shape == phenom_shape + + # Check expected reference values against calculated values. + # This shows that the reference was correctly divided into 2d fields and + # reconstructed on load to match the original (for fields-based formats). + if time_dependence == "static": + ref_shape = (NY, NX) + else: + ref_shape = (NT, NY, NX) + ref_data = 1000.0 + np.arange(np.prod(ref_shape)).reshape(ref_shape) + if zcoord_type == "pressure" and file_extension == "grib2": + # values come back in Pa not hPa + ref_data *= 100.0 + assert np.array_equal(ref_data, result_ref_cube.data) + + +_file_formats = ["pp", "nc"] +if iris_grib: + _file_formats += ["grib2"] + + +@pytest.fixture(params=_file_formats) +def file_extension(request): + return request.param + + +@pytest.fixture(params=["static", "time_varying"]) +def time_dependence(request): + return request.param + + +@pytest.fixture(params=["height", "pressure"]) +def zcoord_type(request): + return request.param + + +@pytest.fixture(params=[f"{name}_policy" for name in LOAD_POLICY.SETTINGS]) +def load_policy(request): + return request.param + + +def test_roundtrip(file_extension, time_dependence, zcoord_type, load_policy, tmp_path): + if ( + load_policy == "legacy_policy" + and time_dependence == "time_varying" + and file_extension in ("pp", "grib2") + ): + pytest.skip("Testcase not supported in 'legacy' mode.") + + filepath = tmp_path / f"tmp.{file_extension}" + include_ref = file_extension in ("grib2", "pp") + is_time_dependent = time_dependence == "time_varying" + data = make_hybrid_z_testdata( + hybrid_zcoord_type=zcoord_type, + include_reference_as_cube=include_ref, + make_reference_time_dependent=is_time_dependent, + ) + + iris.save(data, filepath) + + policy_name = load_policy.split("_")[0] + with LOAD_POLICY.context(policy_name): + # NOTE: this is default, but "legacy" mode would fail + readback = iris.load(filepath) + + check_expected( + readback, + file_extension=file_extension, + time_dependence=time_dependence, + zcoord_type=zcoord_type, + ) + + +def test_split_netcdf_roundtrip(zcoord_type, load_policy, tmp_path): + # NetCDF special test : split the data into 2D slices (like "fields"), + # and save each to a different file. + policy_name = load_policy.split("_")[0] + reference_surface_name = { + "pressure": "surface_air_pressure", + "height": "surface_altitude", + }[zcoord_type] + + data = make_hybrid_z_testdata( + hybrid_zcoord_type=zcoord_type, + include_reference_as_cube=False, + make_reference_time_dependent=True, + ) + + # There is just 1 cube + (data,) = data # just 1 cube for netcdf, no separate reference cube + # split it into 2D YX "field" cubes + field_cubes = list(data.slices(("latitude", "longitude"))) + # Reinstate a length-1 "time" dimension in each cube. + field_cubes = [ + new_axis(field_cube, "time", expand_extras=[reference_surface_name]) + for field_cube in field_cubes + ] + # Save to 1 file per 'field_cube' + result_paths = [ + tmp_path / f"field_{i_field:02d}.nc" for i_field in range(len(field_cubes)) + ] + for field_cube, path in zip(field_cubes, result_paths): + iris.save(field_cube, path) + + # load back with the chosen policy. + with LOAD_POLICY.context(policy_name): + readback = iris.load(result_paths) + + n_cubes = len(readback) + n_datacubes = len(readback.extract("air_temperature")) + if policy_name == "legacy": + assert (n_cubes, n_datacubes) == (15, 3) + elif policy_name == "default": + assert (n_cubes, n_datacubes) == (15, 3) + elif policy_name == "recommended": + assert (n_cubes, n_datacubes) == (5, 1) + elif policy_name == "comprehensive": + assert (n_cubes, n_datacubes) == (5, 1) + else: + raise ValueError(f"unknown policy {policy_name!r}") + + if n_datacubes == 1: + check_expected( + CubeList( + [ + readback.extract_cube("air_temperature"), + # include only 1 of N (identical) reference cubes + # (all this would be easier if we could rely on load-cube ordering!) + readback.extract(reference_surface_name)[0], + ] + ), + file_extension=file_extension, + time_dependence=time_dependence, + zcoord_type=zcoord_type, + ) diff --git a/lib/iris/tests/results/cube_io/pickling/cubelist.cml b/lib/iris/tests/results/cube_io/pickling/cubelist.cml index c52486b1d0..6510b200e6 100644 --- a/lib/iris/tests/results/cube_io/pickling/cubelist.cml +++ b/lib/iris/tests/results/cube_io/pickling/cubelist.cml @@ -7,398 +7,2360 @@ - - + + + [[[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]]], + + + [[[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]]], + + + [[[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]]]]" shape="(70, 6, 100, 100)" standard_name="altitude" units="Unit('m')" value_type="float32"> @@ -407,7 +2369,7 @@ - + @@ -436,7 +2398,7 @@ - + + + - - + + @@ -531,14 +2563,14 @@ - + - + diff --git a/lib/iris/tests/results/cube_io/pickling/single_cube.cml b/lib/iris/tests/results/cube_io/pickling/single_cube.cml index eb3e9d0112..aead0825ea 100644 --- a/lib/iris/tests/results/cube_io/pickling/single_cube.cml +++ b/lib/iris/tests/results/cube_io/pickling/single_cube.cml @@ -7,398 +7,2360 @@ - - + + + [[[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]], + + [[32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + ..., + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ], + [32192.732 , 32192.732 , 32192.732 , ..., + 32192.732 , 32192.732 , 32192.732 ]]], + + + [[[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]], + + [[35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + ..., + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ], + [35845.004 , 35845.004 , 35845.004 , ..., + 35845.004 , 35845.004 , 35845.004 ]]], + + + [[[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]], + + [[40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + ..., + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ], + [40000. , 40000. , 40000. , ..., + 40000. , 40000. , 40000. ]]]]" shape="(70, 6, 100, 100)" standard_name="altitude" units="Unit('m')" value_type="float32"> @@ -407,7 +2369,7 @@ - + @@ -436,7 +2398,7 @@ - + + + - - + + @@ -531,13 +2563,13 @@ - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml index a0ed65bd29..9cfffb1342 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml @@ -6,54 +6,54 @@ - + [408.6315 , 447.17175], + [389.76822, 428.3958 ], + [363.19095, 401.94156]]]" id="9041e969" points="[[372.6527 , 377.71793, 374.74316, ..., + 323.53378, 304.47693, 277.62692], + [388.6133 , 393.66876, 390.69974, ..., + 339.5887 , 320.56845, 293.77 ], + [410.95926, 416.00113, 413.04007, ..., + 362.0666 , 343.0975 , 316.37115], + [439.6917 , 444.7161 , 441.76532, ..., + 390.96838, 372.065 , 345.4312 ], + [474.81216, 479.81528, 476.87698, ..., + 426.2954 , 407.4722 , 380.95132]]" shape="(5, 18)" standard_name="altitude" units="Unit('m')" value_type="float32"> @@ -68,29 +68,28 @@ - + @@ -122,11 +121,11 @@ 0.98717135]" shape="(5,)" units="Unit('1')" value_type="float32"/> - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.data.0.json b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.data.0.json index 0c2b277ef0..138bdc6711 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.data.0.json +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.data.0.json @@ -1 +1 @@ -{"std": 0.04919414967298508, "min": 287.8340148925781, "max": 288.0903625488281, "shape": [5, 18], "masked": false, "mean": 288.0065002441406} \ No newline at end of file +{"std": 0.04917990416288376, "min": 287.8338317871094, "max": 288.0901794433594, "shape": [5, 18], "masked": false, "mean": 288.00640869140625} \ No newline at end of file diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml index efe8c37e2c..41cec442aa 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml @@ -7,58 +7,58 @@ + [473.80203, 512.0405 ]]]" id="9041e969" points="[[389.81168, 380.65045, 338.00278, 295.5282 , + 278.92233, 280.889 , 327.14603, 342.9571 , + 368.6561 , 404.0448 , 416.55072, 389.3731 ], + [405.73932, 396.59567, 354.0299 , 311.6369 , + 295.06293, 297.02582, 343.194 , 358.9747 , + 384.62436, 419.9451 , 432.427 , 405.30157], + [428.03918, 418.92017, 376.4689 , 334.19 , + 317.6606 , 319.61823, 365.66217, 381.40042, + 406.98105, 442.20676, 454.65506, 427.6026 ], + [456.71246, 447.62503, 405.32083, 363.18835, + 346.71622, 348.66705, 394.5515 , 410.23526, + 435.72726, 470.83096, 483.23618, 456.2774 ], + [491.76077, 482.71185, 440.587 , 398.63315, + 382.23087, 384.17343, 429.86337, 445.4806 , + 470.86453, 505.8194 , 518.172 , 491.32755]]" shape="(5, 12)" standard_name="altitude" units="Unit('m')" value_type="float32"> @@ -68,8 +68,8 @@ - + -0.1185 , -0.11700001, -0.1155 , + -0.11400001, -0.11250001, -0.11100001]" shape="(12,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> @@ -119,9 +119,9 @@ 0.98717135]" shape="(5,)" units="Unit('1')" value_type="float32"/> - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml index efe348ffcb..f6bf6f86c2 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml @@ -6,327 +6,327 @@ - + [600.6252 , 589.63086, 574.741 , ..., + 351.04297, 348.4652 , 337.71198], + [584.26105, 574.0093 , 563.243 , ..., + 335.1148 , 333.11978, 329.5481 ], + [562.93256, 552.1968 , 545.87976, ..., + 329.34094, 327.58188, 325.25644]]]" shape="(5, 16, 21)" standard_name="altitude" units="Unit('m')" value_type="float32"> @@ -336,58 +336,57 @@ - + -0.1175625 , -0.1164375 , -0.11531251, + -0.11418751, -0.11306251, -0.11193752, + -0.11081252]" shape="(16,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -419,19 +418,19 @@ 0.98717135]" shape="(5,)" units="Unit('1')" value_type="float32"/> - + [495.3127 , 484.17548, 469.0922 , ..., + 242.48706, 239.87582, 228.98285], + [478.73593, 468.3509 , 457.44473, ..., + 226.35193, 224.33096, 220.71288], + [457.13025, 446.25494, 439.85583, ..., + 220.50302, 218.7211 , 216.36543]]" shape="(16, 21)" standard_name="surface_altitude" units="Unit('m')" value_type="float32"/> diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.data.0.json b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.data.0.json index bdc0cad306..31ad377de6 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.data.0.json +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.data.0.json @@ -1 +1 @@ -{"std": 0.10611984878778458, "min": 287.595703125, "max": 288.1650695800781, "shape": [2, 5, 16, 21], "masked": false, "mean": 287.91802978515625} \ No newline at end of file +{"std": 0.10612151026725769, "min": 287.5958251953125, "max": 288.1652526855469, "shape": [2, 5, 16, 21], "masked": false, "mean": 287.91802978515625} \ No newline at end of file diff --git a/lib/iris/tests/results/imagerepo.json b/lib/iris/tests/results/imagerepo.json index 69beacb848..42f7323201 100644 --- a/lib/iris/tests/results/imagerepo.json +++ b/lib/iris/tests/results/imagerepo.json @@ -2,7 +2,7 @@ "gallery_tests.test_plot_COP_1d.0": "aefec91c3601249cc9b3336dc4c8cdb31a64c6d997b3c0eccb5932d285e42f33", "gallery_tests.test_plot_COP_maps.0": "ea91789995668566913e43474adb6a917e8d947c4b46957ec6716a91958e6f81", "gallery_tests.test_plot_SOI_filtering.0": "fa56f295c5e0694a3c17a58d95e8da536233da99984c5af4c6739b4a9a444eb4", - "gallery_tests.test_plot_TEC.0": "e5a761b69a589a4bc46f9e48c65c6631ce61d1ce3982c13739b33193c0ee3f8c", + "gallery_tests.test_plot_TEC.0": "e59661969a589a49c06f1e69c27c66314e71c06e3986c1b739b33993c1df3fc4", "gallery_tests.test_plot_anomaly_log_colouring.0": "ec4464e384a39b13931a9b1c85696da968d5e6e63e26847bdbd399938d3c5a4c", "gallery_tests.test_plot_atlantic_profiles.0": "97c160f462a88f07203ebc77a1e36707e61f4e38d8f3d08a910597fc877cec58", "gallery_tests.test_plot_atlantic_profiles.1": "eeea64dd6ea8cd99991d1322b3741e2684571cd89995b3131f32a4765ee2a1cc", @@ -12,7 +12,7 @@ "gallery_tests.test_plot_custom_aggregation.0": "ee816f81917e907eb03ec73f856f7ac198d070186e90811f1be33ee1a57a6e18", "gallery_tests.test_plot_custom_file_loading.0": "fa81cb47845e34bc932797436cccc8343f11359b73523746c48c72d9d9b34da5", "gallery_tests.test_plot_deriving_phenomena.0": "ec97681793689768943c97e8926669d186e8c33f6c99c32e6b936c83d33e2c98", - "gallery_tests.test_plot_global_map.0": "fb997b958466846ed13e87467a997a898d66d17e2cc9906684696f99d3162e81", + "gallery_tests.test_plot_global_map.0": "fb997b958466846ed13e87467b997a898d66d1762cc9806684696f99d3162f81", "gallery_tests.test_plot_hovmoller.0": "eeb46cb4934b934bc07e974bc14b38949943c0fe3e94c17f6ea46cb4c07b3f00", "gallery_tests.test_plot_inset.0": "ebff6992b50096ad9267dac4d640949294924cdbc95d4b699d29952dcda46ed4", "gallery_tests.test_plot_lagged_ensemble.0": "bbbb31b1c44e64e4b1579b5b917133cecc61f146c414668eb1119b1bb197ce34", @@ -67,7 +67,7 @@ "iris.tests.test_mapping.TestLowLevel.test_params.1": "be21a71bc1de58e43a63a71b3e016061c1fe9b8c3e01a473847e5b94d1fb9ac3", "iris.tests.test_mapping.TestLowLevel.test_params.2": "fa81909f857e6520957e7acc7a8194716e31851e857e6ac281fe3ba17a81963f", "iris.tests.test_mapping.TestLowLevel.test_simple.0": "faa0e558855f9de7857a1ab16a85a51d36a1e55a854e58a5c13837096e8fe17a", - "iris.tests.test_mapping.TestMappingSubRegion.test_simple.0": "b9913d90c66eca6ec66ec2f3689195aecf5b2f00392cb3496495e21da4db6c92", + "iris.tests.test_mapping.TestMappingSubRegion.test_simple.0": "b9913d90c66eca6ec66ee2fb689195a6cf522f00392cb149648de69fa4db6c90", "iris.tests.test_mapping.TestUnmappable.test_simple.0": "fa81b54a817eca37817ec701857e3e64943e7bb41b806f996e817e006ee1b19b", "iris.tests.test_plot.Test1dFillBetween.test_coord_coord.0": "f31432798cebcd87723835b4a5c5c2dbcf139c6c8cf4730bf3c36d801e380378", "iris.tests.test_plot.Test1dFillBetween.test_coord_cube.0": "ea17352b92f0cbd42d6c8d25e59d36dc3a538d2bb2e42d26c6d2c2c8e4a1ce99", @@ -212,10 +212,13 @@ "iris.tests.test_quickplot.TestLabels.test_contourf.1": "bf802f85c17fc17fc07eb42ac17f3f929130c06e3f80c07f7aa02e85c07f3e81", "iris.tests.test_quickplot.TestLabels.test_contourf.2": "be816a95907ae508c17e955ac07f3fa0945bc07f3f80c07f3aa36f01c0ff3f80", "iris.tests.test_quickplot.TestLabels.test_contourf_nameless.0": "be816af5907ee508c17e955ac03f3f809419c07f3f80c07f3a8b6f81c0ff3f80", + "iris.tests.test_quickplot.TestLabels.test_contourf_no_colorbar.0": "bf80c391c17fe07ec07e1d1a917e3f42917879224834487c6e24ca3e2f87c2ff", "iris.tests.test_quickplot.TestLabels.test_map.0": "e85a634c86a597a793c9349b94b79969c396c95bcce69a64d938c9b039a58ca6", "iris.tests.test_quickplot.TestLabels.test_map.1": "e85a636c86a597a793c9349b94b69969c396c95bcce69a64d938c9b039a58ca6", "iris.tests.test_quickplot.TestLabels.test_pcolor.0": "eea16affc05ab500956e974ac53f3d80925ac03f2f81c07e3fa12da1c2fe3f80", + "iris.tests.test_quickplot.TestLabels.test_pcolor_no_colorbar.0": "eea1c2dac51ab54a905e2d20905a6da5d05e6da19d60dade6da1dade6da1d2d8", "iris.tests.test_quickplot.TestLabels.test_pcolormesh.0": "eea16affc05ab500956e974ac53f3d80925ac03f2f81c07e3fa12da1c2fe3f80", + "iris.tests.test_quickplot.TestLabels.test_pcolormesh_no_colorbar.0": "eea1c2dac51ab54a905e2d20905a6da1d05e6da19d60dade6da1dade6da1d2dc", "iris.tests.test_quickplot.TestLabels.test_pcolormesh_str_symbol.0": "eea16affc05ab500956e974ac53f3d80925ac03f3f80c07e3fa12d21c2ff3f80", "iris.tests.test_quickplot.TestPlotHist.test_horizontal.0": "b59cc3dadb433c24c4f166039438793591a7dbdcbcdc9ccc68c697a91b139131", "iris.tests.test_quickplot.TestPlotHist.test_vertical.0": "bf80c7c6c07d7959647e343a33364b699589c6c64ec0312b9e227ad681ffcc68", diff --git a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_multi_dtype.cdl b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_multi_dtype.cdl index 37dafe4745..8a8f481492 100644 --- a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_multi_dtype.cdl +++ b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_multi_dtype.cdl @@ -5,8 +5,8 @@ dimensions: time = 360 ; variables: short air_temperature(time, latitude, longitude) ; - air_temperature:scale_factor = 0.0024257504786326 ; - air_temperature:add_offset = 261.648002426021 ; + air_temperature:scale_factor = 0.00242575f ; + air_temperature:add_offset = 261.648f ; air_temperature:standard_name = "air_temperature" ; air_temperature:units = "K" ; air_temperature:um_stash_source = "m01s03i236" ; @@ -53,7 +53,7 @@ variables: precipitation_flux:grid_mapping = "latitude_longitude" ; precipitation_flux:coordinates = "forecast_period forecast_reference_time" ; ushort air_temperature_0(time, latitude, longitude) ; - air_temperature_0:scale_factor = 0.0020141666756075 ; + air_temperature_0:scale_factor = 0.002014167f ; air_temperature_0:add_offset = 176.7872f ; air_temperature_0:standard_name = "air_temperature" ; air_temperature_0:units = "K" ; diff --git a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_single_dtype.cdl b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_single_dtype.cdl index a3c90bf1f8..3f2c909ce8 100644 --- a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_single_dtype.cdl +++ b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/multi_packed_single_dtype.cdl @@ -5,8 +5,8 @@ dimensions: time = 360 ; variables: short air_temperature(time, latitude, longitude) ; - air_temperature:scale_factor = 0.0024257504786326 ; - air_temperature:add_offset = 261.648002426021 ; + air_temperature:scale_factor = 0.00242575f ; + air_temperature:add_offset = 261.648f ; air_temperature:standard_name = "air_temperature" ; air_temperature:units = "K" ; air_temperature:um_stash_source = "m01s03i236" ; @@ -46,8 +46,8 @@ variables: height:standard_name = "height" ; height:positive = "up" ; short precipitation_flux(time, latitude, longitude) ; - precipitation_flux:scale_factor = 2.9897383798121e-08 ; - precipitation_flux:add_offset = 0.000979677472296829 ; + precipitation_flux:scale_factor = 2.989738e-08f ; + precipitation_flux:add_offset = 0.0009796774f ; precipitation_flux:standard_name = "precipitation_flux" ; precipitation_flux:units = "kg m-2 s-1" ; precipitation_flux:um_stash_source = "m01s05i216" ; @@ -55,8 +55,8 @@ variables: precipitation_flux:grid_mapping = "latitude_longitude" ; precipitation_flux:coordinates = "forecast_period forecast_reference_time" ; short air_temperature_0(time, latitude, longitude) ; - air_temperature_0:scale_factor = 0.0020141666756075 ; - air_temperature_0:add_offset = 242.787445071619 ; + air_temperature_0:scale_factor = 0.002014167f ; + air_temperature_0:add_offset = 242.7874f ; air_temperature_0:standard_name = "air_temperature" ; air_temperature_0:units = "K" ; air_temperature_0:um_stash_source = "m01s03i236" ; diff --git a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_manual.cdl b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_manual.cdl index fece18b1f3..83e7329575 100644 --- a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_manual.cdl +++ b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_manual.cdl @@ -4,8 +4,8 @@ dimensions: longitude = 96 ; variables: short air_temperature(latitude, longitude) ; - air_temperature:scale_factor = 0.00119806791576066 ; - air_temperature:add_offset = 267.40062344802 ; + air_temperature:scale_factor = 0.001198068f ; + air_temperature:add_offset = 267.4006f ; air_temperature:standard_name = "air_temperature" ; air_temperature:units = "K" ; air_temperature:um_stash_source = "m01s03i236" ; diff --git a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_signed.cdl b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_signed.cdl index fece18b1f3..83e7329575 100644 --- a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_signed.cdl +++ b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_signed.cdl @@ -4,8 +4,8 @@ dimensions: longitude = 96 ; variables: short air_temperature(latitude, longitude) ; - air_temperature:scale_factor = 0.00119806791576066 ; - air_temperature:add_offset = 267.40062344802 ; + air_temperature:scale_factor = 0.001198068f ; + air_temperature:add_offset = 267.4006f ; air_temperature:standard_name = "air_temperature" ; air_temperature:units = "K" ; air_temperature:um_stash_source = "m01s03i236" ; diff --git a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_unsigned.cdl b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_unsigned.cdl index c85ba6aadd..7b9114309e 100644 --- a/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_unsigned.cdl +++ b/lib/iris/tests/results/integration/netcdf/general/TestPackedData/single_packed_unsigned.cdl @@ -4,7 +4,7 @@ dimensions: longitude = 96 ; variables: ubyte air_temperature(latitude, longitude) ; - air_temperature:scale_factor = 0.30790345435049 ; + air_temperature:scale_factor = 0.3079035f ; air_temperature:add_offset = 228.1423f ; air_temperature:standard_name = "air_temperature" ; air_temperature:units = "K" ; diff --git a/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml b/lib/iris/tests/results/mesh/2D_1t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml rename to lib/iris/tests/results/mesh/2D_1t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml b/lib/iris/tests/results/mesh/2D_72t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml rename to lib/iris/tests/results/mesh/2D_72t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml b/lib/iris/tests/results/mesh/3D_1t_face_full_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml rename to lib/iris/tests/results/mesh/3D_1t_face_full_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml b/lib/iris/tests/results/mesh/3D_1t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml rename to lib/iris/tests/results/mesh/3D_1t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml b/lib/iris/tests/results/mesh/3D_snow_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml rename to lib/iris/tests/results/mesh/3D_snow_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml b/lib/iris/tests/results/mesh/3D_soil_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml rename to lib/iris/tests/results/mesh/3D_soil_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml b/lib/iris/tests/results/mesh/3D_tile_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml rename to lib/iris/tests/results/mesh/3D_tile_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml b/lib/iris/tests/results/mesh/3D_veg_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml rename to lib/iris/tests/results/mesh/3D_veg_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/surface_mean.cml b/lib/iris/tests/results/mesh/surface_mean.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/surface_mean.cml rename to lib/iris/tests/results/mesh/surface_mean.cml diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml index 4e3a95118e..cc657e4c97 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml @@ -212,7 +212,7 @@ - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml index 4cfec2d195..9c3cc9f181 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml @@ -62,6 +62,6 @@ - + diff --git a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml index f1f37e23b9..54d1f2311b 100644 --- a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml +++ b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml @@ -62,6 +62,32 @@ + + + + + + + + + + diff --git a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml index 48f0fa1aaa..4b2e03ad30 100644 --- a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml +++ b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml @@ -65,6 +65,32 @@ + + + + + + + + + + diff --git a/lib/iris/tests/stock/__init__.py b/lib/iris/tests/stock/__init__.py index 8c1154af72..31fa7e653d 100644 --- a/lib/iris/tests/stock/__init__.py +++ b/lib/iris/tests/stock/__init__.py @@ -3,21 +3,27 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """A collection of routines which create standard Cubes/files for test purposes.""" + import iris.tests as tests # isort:skip from datetime import datetime import os.path +from typing import NamedTuple +from cartopy.crs import CRS from cf_units import Unit import numpy as np import numpy.ma as ma +from iris import mesh as ugrid +from iris.analysis import cartography import iris.aux_factory from iris.coord_systems import GeogCS, RotatedGeogCS import iris.coords import iris.coords as icoords from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, CellMethod, DimCoord from iris.cube import Cube +from iris.util import mask_cube from ._stock_2d_latlons import ( # noqa make_bounds_discontiguous_at_point, @@ -712,6 +718,268 @@ def realistic_4d_w_missing_data(): return cube +def realistic_4d_w_everything(w_mesh=False): + """Returns a cube that will exercise as much of Iris as possible. + + Uses :func:`realistic_4d` as a basis, then modifies accordingly. + + Parameters + ---------- + w_mesh : bool, optional + If True, the horizontal grid will be replaced with a mesh representation. + """ + cube = realistic_4d() + + grid_lon, grid_lat = [cube.coord(n) for n in ("grid_longitude", "grid_latitude")] + (lon_dim,), (lat_dim,) = [c.cube_dims(cube) for c in (grid_lon, grid_lat)] + horizontal_shape = (cube.shape[lon_dim], cube.shape[lat_dim]) + + # Mask a corner of the cube. + mask = np.ones(np.array(cube.shape) // 2) + padding = np.stack( + [np.subtract(cube.shape, mask.shape), np.zeros_like(cube.shape)], axis=1 + ) + mask = np.pad(mask, padding) + cube = mask_cube(cube, mask) + + ################ + # Add various missing types of metadata. + + cube.long_name = "Air Potential Temperature" + cube.var_name = "air_temp" + + cell_method = CellMethod("mean", coords="time", intervals="1 hour") + cube.add_cell_method(cell_method) + + cell_areas = cartography.area_weights(cube, normalize=True) + # Index cell_areas to just get the lat and lon dimensions. + slices = tuple( + slice(None) if i in (lat_dim, lon_dim) else 0 for i in range(cube.ndim) + ) + cell_areas = cell_areas[slices] + cell_measure = CellMeasure( + data=cell_areas, + standard_name="cell_area", + ) + cube.add_cell_measure(cell_measure, (lat_dim, lon_dim)) + + ancillary_variable = AncillaryVariable( + data=np.remainder(cube.data.astype(int), 2), + standard_name="quality_flag", + ) + cube.add_ancillary_variable(ancillary_variable, np.arange(cube.ndim)) + + ################ + # Add 2-dimensional coordinates for lon/lat in the default coord system. + + class XY(NamedTuple): + """Syntactic sugar for storing x and y components.""" + + x: np.ndarray | int | float + y: np.ndarray | int | float + + def get_default_lat_lon(lat: np.ndarray, lon: np.ndarray) -> XY: + """Represent the given lon-lat points/bounds in the default CRS. + + The original coordinates are rotated so the output is therefore arrays + for constructing a 2D coordinate. + """ + default_cs = GeogCS(cartography.DEFAULT_SPHERICAL_EARTH_RADIUS) + default_crs: CRS = default_cs.as_cartopy_crs() + + mesh = np.meshgrid(lat, lon) + transformed = default_crs.transform_points( + cube.coord_system().as_cartopy_crs(), + *mesh, + ) + no_z = transformed[..., :2] + return XY(*no_z.T) + + default_points = get_default_lat_lon(grid_lat.points, grid_lon.points) + corners = [ + get_default_lat_lon( + grid_lat.bounds[:, corner.y], + grid_lon.bounds[:, corner.x], + ) + for corner in [XY(0, 0), XY(1, 0), XY(1, 1), XY(0, 1)] + ] + default_bounds = XY( + np.stack([c.x for c in corners], axis=-1), + np.stack([c.y for c in corners], axis=-1), + ) + + default_lon = AuxCoord( + default_points.x, + bounds=default_bounds.x, + standard_name="longitude", + units="degrees", + ) + default_lat = AuxCoord( + default_points.y, + bounds=default_bounds.y, + standard_name="latitude", + units="degrees", + ) + cube.add_aux_coord(default_lon, (lat_dim, lon_dim)) + cube.add_aux_coord(default_lat, (lat_dim, lon_dim)) + + ################ + # Optionally convert the horizontal grid to a mesh representation. + + def flatten_dim_metadata(dim_metadata: icoords._DimensionalMetadata): + flat_values = dim_metadata._values.flatten() + kwargs = dim_metadata.metadata._asdict() + if getattr(dim_metadata, "bounds", None) is not None: + flat_bounds = dim_metadata.bounds.reshape( + [len(flat_values), dim_metadata.bounds.shape[-1]] + ) + kwargs["bounds"] = flat_bounds + new_instance = dim_metadata.__class__(flat_values, **kwargs) + return new_instance + + def remove_duplicate_nodes(mesh: ugrid.MeshXY): + """Remove duplicate nodes from a mesh. + + MeshXY.from_coords() does not do this due to complications like lazy + arrays. Not a problem here. + """ + # TODO: + # Contained in a function because this _could_ be generalised into a + # public function. Would need to make it handle Dask arrays and masked + # indices. + + # Example nodes: [a, b, c, a, c, b, d] + # (Real nodes are X-Y pairs so a 2d array). + # Example faces: [[0, 1, 2, 6], [3, 4, 5, 6]] + # I.e. faces made by connecting: a-b-c-d , a-c-b-d + # Processed nodes: [a, b, c, d] + # Processed faces: [[0, 1, 2, 3], [0, 2, 1, 3]] + + nodes = np.stack([c.points for c in mesh.node_coords]) + face_node = mesh.face_node_connectivity + + # first_instances = a full length array but always with the index of + # the first instance of each node e.g.: [0, 1, 2, 0, 2, 1, 3] + nodes_unique, first_instances = np.unique( + nodes, + return_inverse=True, + axis=1, + ) + # E.g. indexing [0, 1, 2, 0, 2, 1, 3] with [[0, 1, 2, 6], [3, 4, 5, 6]] + # -> [[0, 1, 2, 3], [0, 2, 1, 3]] + indices_unique = first_instances[face_node.indices] + # Connectivity indices expected to be a masked array. + indices_unique = np.ma.masked_array(indices_unique, mask=face_node.indices.mask) + + # Replace the original node coords and face-node connectivity with the + # unique-d versions. + node_x, node_y = [ + AuxCoord(nodes_unique[i], **c.metadata._asdict()) + for i, c in enumerate(mesh.node_coords) + ] + mesh.add_coords(node_x=node_x, node_y=node_y) + conn_kwargs = dict(indices=indices_unique, start_index=0) + mesh.add_connectivities( + ugrid.Connectivity(**(face_node.metadata._asdict() | conn_kwargs)) + ) + + return mesh + + new_mesh = ugrid.MeshXY.from_coords( + flatten_dim_metadata(default_lon), + flatten_dim_metadata(default_lat), + ) + new_mesh = remove_duplicate_nodes(new_mesh) + + # Create a new Cube with the horizontal (XY) dimensions flattened into a + # UGRID mesh. + def reshape_for_mesh(shape: tuple): + new_shape = [] + for dim, len in enumerate(shape): + if dim not in (lat_dim, lon_dim): + new_shape.append(len) + new_shape.append(np.prod(horizontal_shape)) + return new_shape + + mesh_cube = Cube( + cube.data.reshape(reshape_for_mesh(cube.shape)), + **cube.metadata._asdict(), + ) + for mesh_coord in new_mesh.to_MeshCoords("face"): + mesh_cube.add_aux_coord(mesh_coord, mesh_cube.ndim - 1) + + # Add all appropriate dimensional metadata from the original cube, reshaped + # where necessary. + dim_metadata_groups = [ + cube.dim_coords, + cube.aux_coords, + cube.cell_measures(), + cube.ancillary_variables(), + ] + add_methods = { + AncillaryVariable: Cube.add_ancillary_variable, + AuxCoord: Cube.add_aux_coord, + CellMeasure: Cube.add_cell_measure, + DimCoord: Cube.add_dim_coord, + } + for dim_metadata_group in dim_metadata_groups: + for dim_metadata in dim_metadata_group: + add_method = add_methods[type(dim_metadata)] + cube_dims = dim_metadata.cube_dims(cube) + + if cube_dims == (lat_dim,) or cube_dims == (lon_dim,): + # For realistic_4d() this is just lat and lon, and we're using + # the mesh coords for those. + continue + + elif cube_dims == (lat_dim, lon_dim): + dim_metadata = flatten_dim_metadata(dim_metadata) + add_method(mesh_cube, dim_metadata, mesh_cube.ndim - 1) + + elif {lat_dim, lon_dim}.issubset(cube_dims): + # Simplify implementation by not handling bounds. + assert getattr(dim_metadata, "bounds", None) is None + new_shape = reshape_for_mesh(dim_metadata.shape) + new_dims = list(cube_dims) + for dim in (lat_dim, lon_dim): + new_dims.remove(dim) + new_dims.append(mesh_cube.ndim - 1) + dim_metadata = dim_metadata.__class__( + dim_metadata._values.reshape(new_shape), + **dim_metadata.metadata._asdict(), + ) + add_method(mesh_cube, dim_metadata, new_dims) + + else: + try: + add_method(mesh_cube, dim_metadata, cube_dims) + except iris.exceptions.CannotAddError as err: + if isinstance(dim_metadata, DimCoord): + mesh_cube.add_aux_coord(dim_metadata, cube_dims) + else: + raise err + + for cell_method in cube.cell_methods: + if cell_method not in mesh_cube.cell_methods: + # Think some get copied across implicitly? Not sure how. + mesh_cube.add_cell_method(cell_method) + + for aux_factory in cube.aux_factories: + coord_mapping = { + id(dep): mesh_cube.coord(dep.name()) + for key, dep in aux_factory.dependencies.items() + if dep.name() in [c.name() for c in mesh_cube.coords()] + } + aux_factory = aux_factory.updated(coord_mapping) + mesh_cube.add_aux_factory(aux_factory) + + if w_mesh: + result = mesh_cube + else: + result = cube + return result + + def ocean_sigma_z(): """Return a sample cube with an :class:`iris.aux_factory.OceanSigmaZFactory` vertical coordinate. diff --git a/lib/iris/tests/stock/_stock_2d_latlons.py b/lib/iris/tests/stock/_stock_2d_latlons.py index c216629fcd..018b64a03a 100644 --- a/lib/iris/tests/stock/_stock_2d_latlons.py +++ b/lib/iris/tests/stock/_stock_2d_latlons.py @@ -305,9 +305,9 @@ def make_bounds_discontiguous_at_point(cube, at_iy, at_ix, in_y=False, upper=Tru x_coord = cube.coord(axis="x") y_coord = cube.coord(axis="y") assert x_coord.shape == y_coord.shape - assert ( - coord.bounds.ndim == 3 and coord.shape[-1] == 4 for coord in (x_coord, y_coord) - ) + for coord in (x_coord, y_coord): + assert coord.bounds.ndim == 3 + assert coord.bounds.shape[-1] == 4 # For both X and Y coord, move points + bounds to create a discontinuity. def adjust_coord(coord): diff --git a/lib/iris/tests/stock/mesh.py b/lib/iris/tests/stock/mesh.py index 3520436f66..3824ba84fc 100644 --- a/lib/iris/tests/stock/mesh.py +++ b/lib/iris/tests/stock/mesh.py @@ -4,14 +4,13 @@ # See LICENSE in the root of the repository for full licensing details. """Helper functions making objects for unstructured mesh testing.""" - import numpy as np from iris.coords import AuxCoord, DimCoord from iris.cube import Cube -from iris.experimental.ugrid.mesh import Connectivity, Mesh, MeshCoord +from iris.mesh import Connectivity, MeshCoord, MeshXY -# Default creation controls for creating a test Mesh. +# Default creation controls for creating a test MeshXY. # Note: we're not creating any kind of sensible 'normal' mesh here, the numbers # of nodes/faces/edges are quite arbitrary and the connectivities we generate # are pretty random too. @@ -21,10 +20,17 @@ _TEST_N_BOUNDS = 4 -def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): +def sample_mesh( + n_nodes=None, + n_faces=None, + n_edges=None, + lazy_values=False, + nodes_per_face=None, + masked_connecteds=False, +): """Make a test mesh. - Mesh has nodes, plus faces and/or edges, with face-coords and edge-coords, + MeshXY has nodes, plus faces and/or edges, with face-coords and edge-coords, numbers of which can be controlled. Parameters @@ -39,6 +45,11 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): If not 0, face coords and a 'face_node_connectivity' are included. lazy_values : bool, default=False If True, all content values of coords and connectivities are lazy. + nodes_per_face : int or None + Number of nodes per face. Default is 4. + masked_connecteds : bool, default=False + If True, mask some of the connected spaces in the connectivity indices + arrays. """ if lazy_values: @@ -54,6 +65,8 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): n_faces = _TEST_N_FACES if n_edges is None: n_edges = _TEST_N_EDGES + if nodes_per_face is None: + nodes_per_face = _TEST_N_BOUNDS node_x = AuxCoord( 1100 + arr.arange(n_nodes), standard_name="longitude", @@ -77,6 +90,9 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): conns = arr.arange(n_edges * 2, dtype=int) # Missing nodes include #0-5, because we add 5. conns = ((conns + 5) % n_nodes).reshape((n_edges, 2)) + if masked_connecteds: + conns[0, -1] = -1 + conns = arr.ma.masked_less(conns, 0) edge_nodes = Connectivity(conns, cf_role="edge_node_connectivity") connectivities.append(edge_nodes) @@ -89,8 +105,11 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): else: # Define a rather arbitrary face-nodes connectivity. # Some nodes are left out, because n_faces*n_bounds < n_nodes. - conns = arr.arange(n_faces * _TEST_N_BOUNDS, dtype=int) - conns = (conns % n_nodes).reshape((n_faces, _TEST_N_BOUNDS)) + conns = arr.arange(n_faces * nodes_per_face, dtype=int) + conns = (conns % n_nodes).reshape((n_faces, nodes_per_face)) + if masked_connecteds: + conns[0, -1] = -1 + conns = arr.ma.masked_less(conns, 0) face_nodes = Connectivity(conns, cf_role="face_node_connectivity") connectivities.append(face_nodes) @@ -99,7 +118,7 @@ def sample_mesh(n_nodes=None, n_faces=None, n_edges=None, lazy_values=False): face_y = AuxCoord(3200 + arr.arange(n_faces), standard_name="latitude") face_coords_and_axes = [(face_x, "x"), (face_y, "y")] - mesh = Mesh( + mesh = MeshXY( topology_dimension=2, node_coords_and_axes=[(node_x, "x"), (node_y, "y")], connectivities=connectivities, @@ -123,7 +142,7 @@ def sample_meshcoord(mesh=None, location="face", axis="x", **extra_kwargs): def sample_mesh_cube(nomesh_faces=None, n_z=2, with_parts=False, **meshcoord_kwargs): - """Create a 2d test cube with 1 'normal' and 1 unstructured dimension (with a Mesh). + """Create a 2d test cube with 1 'normal' and 1 unstructured dimension (with a MeshXY). Result contains : dimcoords for both dims; an auxcoord on the unstructured dim; 2 mesh-coords. diff --git a/lib/iris/tests/stock/netcdf.py b/lib/iris/tests/stock/netcdf.py index 5721433103..0f5fb0f144 100644 --- a/lib/iris/tests/stock/netcdf.py +++ b/lib/iris/tests/stock/netcdf.py @@ -7,7 +7,7 @@ from pathlib import Path from string import Template import subprocess -from typing import Optional +from typing import Any, Optional import dask from dask import array as da @@ -48,7 +48,7 @@ def ncgen_from_cdl(cdl_str: Optional[str], cdl_path: Optional[str], nc_path: str if cdl_path: # Create netcdf from stored CDL file. call_args = [NCGEN_PATHSTR, "-k3", "-o", nc_path, cdl_path] - call_kwargs = {} + call_kwargs: dict[str, Any] = {} else: # No CDL file : pipe 'cdl_str' directly into the ncgen program. if not cdl_str: @@ -116,7 +116,7 @@ def _add_standard_data(nc_path, unlimited_dim_size=0): var[:] = data else: # Fill with a plain value. But avoid zeros, so we can simulate - # valid ugrid connectivities even when start_index=1. + # valid mesh connectivities even when start_index=1. with dask.config.set({"array.chunk-size": "2048MiB"}): data = da.ones(shape, dtype=var.dtype) # Do not use zero da.store(data, var) diff --git a/lib/iris/tests/test_analysis.py b/lib/iris/tests/test_analysis.py index abc68c06b5..9e0bf76d34 100644 --- a/lib/iris/tests/test_analysis.py +++ b/lib/iris/tests/test_analysis.py @@ -1192,6 +1192,8 @@ def test_rotate_1d(self): @_shared_utils.skip_data class TestAreaWeights: + # Note: chunks is simply ignored for non-lazy data + @pytest.mark.parametrize("chunks", [None, (2, 3)]) @pytest.fixture(autouse=True) def _setup(self, request): self.request = request @@ -1237,6 +1239,47 @@ def test_area_weights(self): ) +@_shared_utils.skip_data +class TestLazyAreaWeights: + @pytest.mark.parametrize("normalize", [True, False]) + @pytest.mark.parametrize("chunks", [None, (2, 3, 4), (2, 2, 2)]) + def test_lazy_area_weights(self, chunks, normalize): + small_cube = iris.tests.stock.simple_3d()[[0, 0, 0, 0], :, :] + small_cube.coord("latitude").guess_bounds() + small_cube.coord("longitude").guess_bounds() + + area_weights = iris.analysis.cartography.area_weights( + small_cube, + normalize=normalize, + compute=False, + chunks=chunks, + ) + + assert isinstance(area_weights, da.Array) + + # Check that chunksizes are as expected + if chunks is None: + assert area_weights.chunksize == (4, 3, 4) + else: + assert area_weights.chunksize == (2, 3, 4) + + # Check that actual weights are as expected (known good output) + if normalize: + expected_2d = [ + [0.03661165, 0.03661165, 0.03661165, 0.03661165], + [0.1767767, 0.1767767, 0.1767767, 0.1767767], + [0.03661165, 0.03661165, 0.03661165, 0.03661165], + ] + else: + expected_2d = [ + [1.86536150e13, 1.86536150e13, 1.86536150e13, 1.86536150e13], + [9.00676206e13, 9.00676206e13, 9.00676206e13, 9.00676206e13], + [1.86536150e13, 1.86536150e13, 1.86536150e13, 1.86536150e13], + ] + expected = np.broadcast_to(expected_2d, (4, 3, 4)) + np.testing.assert_allclose(area_weights.compute(), expected) + + @_shared_utils.skip_data class TestAreaWeightGeneration: @pytest.fixture(autouse=True) diff --git a/lib/iris/tests/test_basic_maths.py b/lib/iris/tests/test_basic_maths.py index f234239dcc..8255d823f7 100644 --- a/lib/iris/tests/test_basic_maths.py +++ b/lib/iris/tests/test_basic_maths.py @@ -874,7 +874,7 @@ def setUp(self): def test_coord_op_coord__fail(self): for op, symbol in zip(self.ops, self.symbols): - emsg = f"AuxCoord \{symbol} DimCoord" # noqa: W605 + emsg = rf"AuxCoord \{symbol} DimCoord" with self.assertRaisesRegex(NotYetImplementedError, emsg): _ = op(self.aux, self.dim) diff --git a/lib/iris/tests/test_coding_standards.py b/lib/iris/tests/test_coding_standards.py index 2f14ea703e..9bb26a426a 100644 --- a/lib/iris/tests/test_coding_standards.py +++ b/lib/iris/tests/test_coding_standards.py @@ -69,8 +69,8 @@ def test_python_versions(): Test is designed to fail whenever Iris' supported Python versions are updated, insisting that versions are updated EVERYWHERE in-sync. """ - latest_supported = "3.11" - all_supported = ["3.9", "3.10", latest_supported] + latest_supported = "3.12" + all_supported = ["3.10", "3.11", latest_supported] root_dir = Path(__file__).parents[3] workflows_dir = root_dir / ".github" / "workflows" diff --git a/lib/iris/tests/test_constraints.py b/lib/iris/tests/test_constraints.py index f7dab288b6..2e203e0185 100644 --- a/lib/iris/tests/test_constraints.py +++ b/lib/iris/tests/test_constraints.py @@ -152,7 +152,7 @@ def fixup_sigma_to_be_aux(cubes): sigma = iris.coords.AuxCoord.from_coord(sigma) cube.replace_coord(sigma) - def assertCML(self, cubes, filename): + def assertConstraintCML(self, cubes, filename): filename = "%s_%s.cml" % (filename, self.suffix) tests.IrisTest.assertCML(self, cubes, ("constrained_load", filename)) @@ -162,15 +162,15 @@ def load_match(self, files, constraints): def test_single_atomic_constraint(self): cubes = self.load_match(self.dec_path, self.level_10) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "all_10") + self.assertConstraintCML(cubes, "all_10") cubes = self.load_match(self.dec_path, self.theta) - self.assertCML(cubes, "theta") + self.assertConstraintCML(cubes, "theta") cubes = self.load_match(self.dec_path, self.model_level_number_10_22) self.fixup_sigma_to_be_aux(cubes) workaround_pending_1262(cubes) - self.assertCML(cubes, "all_ml_10_22") + self.assertConstraintCML(cubes, "all_ml_10_22") # Check that it didn't matter that we provided sets & tuples to the model_level for constraint in [ @@ -180,52 +180,52 @@ def test_single_atomic_constraint(self): cubes = self.load_match(self.dec_path, constraint) self.fixup_sigma_to_be_aux(cubes) workaround_pending_1262(cubes) - self.assertCML(cubes, "all_ml_10_22") + self.assertConstraintCML(cubes, "all_ml_10_22") def test_string_standard_name(self): cubes = self.load_match(self.dec_path, SN_AIR_POTENTIAL_TEMPERATURE) - self.assertCML(cubes, "theta") + self.assertConstraintCML(cubes, "theta") cubes = self.load_match(self.dec_path, [SN_AIR_POTENTIAL_TEMPERATURE]) - self.assertCML(cubes, "theta") + self.assertConstraintCML(cubes, "theta") cubes = self.load_match( self.dec_path, iris.Constraint(SN_AIR_POTENTIAL_TEMPERATURE) ) - self.assertCML(cubes, "theta") + self.assertConstraintCML(cubes, "theta") cubes = self.load_match( self.dec_path, iris.Constraint(SN_AIR_POTENTIAL_TEMPERATURE, model_level_number=10), ) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_10") + self.assertConstraintCML(cubes, "theta_10") def test_latitude_constraint(self): cubes = self.load_match(self.theta_path, self.lat_30) - self.assertCML(cubes, "theta_lat_30") + self.assertConstraintCML(cubes, "theta_lat_30") cubes = self.load_match(self.theta_path, self.lat_gt_45) - self.assertCML(cubes, "theta_lat_gt_30") + self.assertConstraintCML(cubes, "theta_lat_gt_30") def test_single_expression_constraint(self): cubes = self.load_match(self.theta_path, self.theta & self.level_10) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_10") + self.assertConstraintCML(cubes, "theta_10") cubes = self.load_match(self.theta_path, self.level_10 & self.theta) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_10") + self.assertConstraintCML(cubes, "theta_10") def test_dual_atomic_constraint(self): cubes = self.load_match(self.dec_path, [self.theta, self.level_10]) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_and_all_10") + self.assertConstraintCML(cubes, "theta_and_all_10") def test_dual_repeated_constraint(self): cubes = self.load_match(self.dec_path, [self.theta, self.theta]) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_and_theta") + self.assertConstraintCML(cubes, "theta_and_theta") def test_dual_expression_constraint(self): cubes = self.load_match( @@ -233,28 +233,28 @@ def test_dual_expression_constraint(self): [self.theta & self.level_10, self.level_gt_30_le_3 & self.theta], ) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_10_and_theta_level_gt_30_le_3") + self.assertConstraintCML(cubes, "theta_10_and_theta_level_gt_30_le_3") def test_invalid_constraint(self): cubes = self.load_match(self.theta_path, self.pressure_950) - self.assertCML(cubes, "pressure_950") + self.assertConstraintCML(cubes, "pressure_950") cubes = self.load_match(self.theta_path, self.invalid_inequality) - self.assertCML(cubes, "invalid_inequality") + self.assertConstraintCML(cubes, "invalid_inequality") def test_inequality_constraint(self): cubes = self.load_match(self.theta_path, self.level_gt_30_le_3) - self.assertCML(cubes, "theta_gt_30_le_3") + self.assertConstraintCML(cubes, "theta_gt_30_le_3") class StrictConstraintMixin(RelaxedConstraintMixin): def test_single_atomic_constraint(self): cubes = self.load_match(self.theta_path, self.theta) - self.assertCML(cubes, "theta") + self.assertConstraintCML(cubes, "theta") cubes = self.load_match(self.theta_path, self.level_10) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_10") + self.assertConstraintCML(cubes, "theta_10") def test_invalid_constraint(self): with self.assertRaises(iris.exceptions.ConstraintMismatchError): @@ -263,7 +263,7 @@ def test_invalid_constraint(self): def test_dual_atomic_constraint(self): cubes = self.load_match(self.dec_path, [self.theta, self.level_10 & self.theta]) self.fixup_sigma_to_be_aux(cubes) - self.assertCML(cubes, "theta_and_theta_10") + self.assertConstraintCML(cubes, "theta_and_theta_10") @tests.skip_data diff --git a/lib/iris/tests/test_cube_to_pp.py b/lib/iris/tests/test_cube_to_pp.py index 6ae4567f49..fa06ba553f 100644 --- a/lib/iris/tests/test_cube_to_pp.py +++ b/lib/iris/tests/test_cube_to_pp.py @@ -370,6 +370,31 @@ def test_lbvc(self): self.assertEqual(field.lblev, lblev) self.assertEqual(field.blev, blev) + def test_surface_field(self): + def setup_cube(coord=None): + cube = stock.lat_lon_cube() + if coord: + cube.add_aux_coord(coord) + temp_pp_path = iris.util.create_temp_filename(".pp") + iris.fileformats.pp.save( + cube, target=temp_pp_path, label_surface_fields=True + ) + cube = iris.fileformats.pp.load(temp_pp_path) + return cube + + # check surface fields are correctly applied + cube = setup_cube() + for field in cube: + self.assertEqual(field.lbvc, 129) + self.assertEqual(field.lblev, 9999) + + # check surface fields aren't incorrectly applied + v_coord = iris.coords.DimCoord(standard_name="depth", units="m", points=[-5]) + cube = setup_cube(v_coord) + for field in cube: + self.assertNotEqual(field.lbvc, 129) + self.assertNotEqual(field.lblev, 9999) + def fields_from_cube(cubes): """Return an iterator of PP fields generated from saving the given cube(s) diff --git a/lib/iris/tests/test_iterate.py b/lib/iris/tests/test_iterate.py index 749e8650db..25b1c32ebc 100644 --- a/lib/iris/tests/test_iterate.py +++ b/lib/iris/tests/test_iterate.py @@ -4,10 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Test the iteration of cubes in step.""" -# import iris tests first so that some things can be initialised before -# importing anything else -import iris.tests as tests # isort:skip - from functools import reduce import itertools import operator @@ -15,19 +11,22 @@ import warnings import numpy as np +import pytest import iris import iris.analysis import iris.iterate +import iris.tests import iris.tests.stock from iris.warnings import IrisUserWarning -@tests.skip_data -class TestIterateFunctions(tests.IrisTest): +@iris.tests.skip_data +class TestIterateFunctions: + @pytest.fixture(autouse=True) def setUp(self): - self.cube_a = iris.tests.stock.realistic_4d()[0, 0:5, 0:10, 0:12] - self.cube_b = iris.tests.stock.realistic_4d()[1, 0:5, 0:10, 0:12] + self.cube_a = iris.tests.stock.realistic_4d()[0, :2, :4, :3] + self.cube_b = iris.tests.stock.realistic_4d()[1, :2, :4, :3] self.coord_names = ["grid_latitude", "grid_longitude"] # Modify elements of cube_b to introduce additional differences @@ -35,11 +34,11 @@ def setUp(self): self.cube_b.add_aux_coord(iris.coords.AuxCoord(23, long_name="other")) def test_izip_no_args(self): - with self.assertRaises(TypeError): + with pytest.raises(TypeError): iris.iterate.izip() - with self.assertRaises(TypeError): + with pytest.raises(TypeError): iris.iterate.izip(coords=self.coord_names) - with self.assertRaises(TypeError): + with pytest.raises(TypeError): iris.iterate.izip(coords=self.coord_names, ordered=False) def test_izip_input_collections(self): @@ -51,7 +50,7 @@ def test_izip_input_collections(self): self.cube_a, self.cube_b, self.cube_a, coords=self.coord_names ) # Check unpacked collections - cubes = [self.cube_a] * 10 + cubes = [self.cube_a] * 2 iris.iterate.izip(*cubes, coords=self.coord_names) cubes = tuple(cubes) iris.iterate.izip(*cubes, coords=self.coord_names) @@ -61,7 +60,7 @@ def test_izip_returns_iterable(self): # Raises an exception if arg is not iterable iter(iris.iterate.izip(self.cube_a, coords=self.coord_names)) except TypeError: - self.fail("iris.iterate.izip is not returning an iterable") + assert False, "iris.iterate.izip is not returning an iterable" def test_izip_unequal_slice_coords(self): # Create a cube with grid_latitude and grid_longitude coords @@ -74,35 +73,32 @@ def test_izip_unequal_slice_coords(self): ): slice_a_truth = self.cube_a[i, :, :] slice_other_truth = other_cube - self.assertEqual(slice_a_truth, slice_a) - self.assertEqual(slice_other_truth, slice_other) + assert slice_a_truth == slice_a + assert slice_other_truth == slice_other i += 1 - self.assertEqual(i, nslices) + assert i == nslices # Attempting to iterate over these incompatible coords should # raise an exception - with self.assertRaises(ValueError): + with pytest.raises(ValueError): iris.iterate.izip(self.cube_a, other_cube) def test_izip_missing_slice_coords(self): # Remove latitude coordinate from one of the cubes other_cube = self.cube_b.copy() other_cube.remove_coord("grid_latitude") - with self.assertRaises(iris.exceptions.CoordinateNotFoundError): + with pytest.raises(iris.exceptions.CoordinateNotFoundError): iris.iterate.izip(self.cube_a, other_cube, coords=self.coord_names) # Create a cube with latitude and longitude rather than grid_latitude # and grid_longitude self.cube_b.coord("grid_latitude").rename("latitude") self.cube_b.coord("grid_longitude").rename("longitude") - with self.assertRaises(iris.exceptions.CoordinateNotFoundError): + with pytest.raises(iris.exceptions.CoordinateNotFoundError): iris.iterate.izip(self.cube_a, self.cube_b, coords=self.coord_names) def test_izip_onecube_no_coords(self): # Should do the same as slices() but bearing in mind izip.next() # returns a tuple of cubes - - # Reduce the size to speed things up - we're going to iterate - # over *every* data point. - self.cube_b = self.cube_b[:2, :4, :3] + self.cube_b = self.cube_b[:2, :1, :1] # Empty list as coords slice_iterator = self.cube_b.slices([]) @@ -110,8 +106,8 @@ def test_izip_onecube_no_coords(self): for cube_slice in slice_iterator: # First element of tuple: (extractedcube, ) zip_slice = next(zip_iterator)[0] - self.assertEqual(cube_slice, zip_slice) - with self.assertRaises(StopIteration): + assert cube_slice == zip_slice + with pytest.raises(StopIteration): next(zip_iterator) # Should raise exception if we continue try to # to iterate @@ -122,8 +118,8 @@ def test_izip_onecube_lat_lon(self): for cube_slice in slice_iterator: # First element of tuple: (extractedcube, ) zip_slice = next(zip_iterator)[0] - self.assertEqual(cube_slice, zip_slice) - with self.assertRaises(StopIteration): + assert cube_slice == zip_slice + with pytest.raises(StopIteration): next(zip_iterator) # Should raise exception if we continue to try # to iterate @@ -134,8 +130,8 @@ def test_izip_onecube_lat(self): for cube_slice in slice_iterator: # First element of tuple: (extractedcube, ) zip_slice = next(zip_iterator)[0] - self.assertEqual(cube_slice, zip_slice) - with self.assertRaises(StopIteration): + assert cube_slice == zip_slice + with pytest.raises(StopIteration): next(zip_iterator) # Should raise exception if we continue to try # to iterate @@ -151,8 +147,8 @@ def test_izip_onecube_height_lat_long(self): for cube_slice in slice_iterator: # First element of tuple: (extractedcube, ) zip_slice = next(zip_iterator)[0] - self.assertEqual(cube_slice, zip_slice) - with self.assertRaises(StopIteration): + assert cube_slice == zip_slice + with pytest.raises(StopIteration): next(zip_iterator) # Should raise exception if we continue to try # to iterate @@ -163,12 +159,12 @@ def test_izip_same_cube_lat_lon(self): for slice_first, slice_second in iris.iterate.izip( self.cube_b, self.cube_b, coords=self.coord_names ): - self.assertEqual(slice_first, slice_second) # Equal to each other - self.assertEqual( - slice_first, next(slice_iterator) + assert slice_first == slice_second # Equal to each other + assert slice_first == next( + slice_iterator ) # Equal to the truth (from slice()) count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_same_cube_lat(self): nslices = ( @@ -181,77 +177,67 @@ def test_izip_same_cube_lat(self): for slice_first, slice_second in iris.iterate.izip( self.cube_a, self.cube_a, coords=["grid_latitude"] ): - self.assertEqual(slice_first, slice_second) - self.assertEqual( - slice_first, next(slice_iterator) + assert slice_first == slice_second + assert slice_first == next( + slice_iterator ) # Equal to the truth (from slice()) count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_same_cube_no_coords(self): - # Reduce the size to speed things up - we're going to iterate - # over *every* data point. - self.cube_b = self.cube_b[:2, :4, :3] - + self.cube_b = self.cube_b[0, :2, :2] nslices = reduce(operator.mul, self.cube_b.shape) slice_iterator = self.cube_b.slices([]) count = 0 for slice_first, slice_second in iris.iterate.izip( self.cube_b, self.cube_b, coords=[] ): - self.assertEqual(slice_first, slice_second) - self.assertEqual( - slice_first, next(slice_iterator) + assert slice_first == slice_second + assert slice_first == next( + slice_iterator ) # Equal to the truth (from slice()) count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_subcube_of_same(self): - for _ in range(3): + for k in range(2): super_cube = self.cube_a - # Random int to pick coord value to calc subcube - k = random.randint(0, super_cube.shape[0] - 1) sub_cube = super_cube[k, :, :] super_slice_iterator = super_cube.slices(self.coord_names) j = 0 for super_slice, sub_slice in iris.iterate.izip( super_cube, sub_cube, coords=self.coord_names ): - self.assertEqual(sub_slice, sub_cube) # This cube should not change + assert sub_slice == sub_cube # This cube should not change # as lat and long are the only # data dimensions in this cube) - self.assertEqual(super_slice, next(super_slice_iterator)) + assert super_slice == next(super_slice_iterator) if j == k: - self.assertEqual(super_slice, sub_slice) + assert super_slice == sub_slice else: - self.assertNotEqual(super_slice, sub_slice) + assert super_slice != sub_slice j += 1 nslices = super_cube.shape[0] - self.assertEqual(j, nslices) + assert j == nslices - def test_izip_same_dims(self): - # Check single coords slice + def test_izip_same_dims_single_coord(self): + self.cube_a = self.cube_a[:, :2, :2] + self.cube_b = self.cube_b[:, :2, :2] nslices = reduce(operator.mul, self.cube_a.shape[1:]) - nslices_to_check = ( - 20 # This is only approximate as we use random to select slices - ) - # Fraction of slices to check - check_eq_probability = max(0.0, min(1.0, nslices_to_check / nslices)) - ij_iterator = np.ndindex(self.cube_a.shape[1], self.cube_a.shape[2]) count = 0 for slice_a, slice_b in iris.iterate.izip( self.cube_a, self.cube_b, coords="level_height" ): i, j = next(ij_iterator) - if random.random() < check_eq_probability: # Check these slices - slice_a_truth = self.cube_a[:, i, j] - slice_b_truth = self.cube_b[:, i, j] - self.assertEqual(slice_a_truth, slice_a) - self.assertEqual(slice_b_truth, slice_b) + slice_a_truth = self.cube_a[:, i, j] + slice_b_truth = self.cube_b[:, i, j] + assert slice_a_truth == slice_a + assert slice_b_truth == slice_b count += 1 - self.assertEqual(count, nslices) - # Two coords + assert count == nslices + + def test_izip_same_dims_two_coords(self): nslices = self.cube_a.shape[0] i_iterator = iter(range(self.cube_a.shape[0])) count = 0 @@ -261,10 +247,10 @@ def test_izip_same_dims(self): i = next(i_iterator) slice_a_truth = self.cube_a[i, :, :] slice_b_truth = self.cube_b[i, :, :] - self.assertEqual(slice_a_truth, slice_a) - self.assertEqual(slice_b_truth, slice_b) + assert slice_a_truth == slice_a + assert slice_b_truth == slice_b count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_extra_dim(self): big_cube = self.cube_a @@ -283,11 +269,11 @@ def test_izip_extra_dim(self): big_cube, little_cube, coords=self.coord_names ): big_slice_truth = big_cube[i, :, :] - self.assertEqual(little_slice_truth, little_slice) - self.assertEqual(big_slice_truth, big_slice) + assert little_slice_truth == little_slice + assert big_slice_truth == big_slice i += 1 nslices = big_cube.shape[0] - self.assertEqual(nslices, i) + assert nslices == i # Leave middle coord but move it from a data dimension to a scalar coord by slicing little_cube = self.cube_b[:, 0, :] @@ -295,7 +281,7 @@ def test_izip_extra_dim(self): # Now remove associated coord little_cube.remove_coord("grid_latitude") # Check we raise an exception if we request coords one of the cubes doesn't have - with self.assertRaises(iris.exceptions.CoordinateNotFoundError): + with pytest.raises(iris.exceptions.CoordinateNotFoundError): iris.iterate.izip(big_cube, little_cube, coords=self.coord_names) # little_slice should remain the same as there are no other data dimensions @@ -307,40 +293,34 @@ def test_izip_extra_dim(self): coords=["model_level_number", "grid_longitude"], ): big_slice_truth = big_cube[:, i, :] - self.assertEqual(little_slice_truth, little_slice) - self.assertEqual(big_slice_truth, big_slice) + assert little_slice_truth == little_slice + assert big_slice_truth == big_slice i += 1 nslices = big_cube.shape[1] - self.assertEqual(nslices, i) + assert nslices == i # Take a random slice reducing it to a 1d cube p = random.randint(0, self.cube_b.shape[0] - 1) q = random.randint(0, self.cube_b.shape[2] - 1) little_cube = self.cube_b[p, :, q] nslices = big_cube.shape[0] * big_cube.shape[2] - nslices_to_check = ( - 20 # This is only approximate as we use random to select slices - ) - # Fraction of slices to check - check_eq_probability = max(0.0, min(1.0, nslices_to_check / nslices)) ij_iterator = np.ndindex(big_cube.shape[0], big_cube.shape[2]) count = 0 for big_slice, little_slice in iris.iterate.izip( big_cube, little_cube, coords="grid_latitude" ): i, j = next(ij_iterator) - if random.random() < check_eq_probability: - big_slice_truth = big_cube[i, :, j] - little_slice_truth = little_cube # Just 1d so slice is entire cube - self.assertEqual(little_slice_truth, little_slice) - self.assertEqual(big_slice_truth, big_slice) + big_slice_truth = big_cube[i, :, j] + little_slice_truth = little_cube # Just 1d so slice is entire cube + assert little_slice_truth == little_slice + assert big_slice_truth == big_slice count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_different_shaped_coords(self): other = self.cube_b[0:-1] # Different 'z' coord shape - expect a ValueError - with self.assertRaises(ValueError): + with pytest.raises(ValueError): iris.iterate.izip(self.cube_a, other, coords=self.coord_names) def test_izip_different_valued_coords(self): @@ -354,10 +334,10 @@ def test_izip_different_valued_coords(self): # Same coord metadata and shape, but different values - check it produces a warning with warnings.catch_warnings(): warnings.simplefilter("error") # Cause all warnings to raise Exceptions - with self.assertRaises(IrisUserWarning): + with pytest.raises(IrisUserWarning): iris.iterate.izip(self.cube_a, self.cube_b, coords=self.coord_names) # Call with coordinates, rather than names - with self.assertRaises(IrisUserWarning): + with pytest.raises(IrisUserWarning): iris.iterate.izip( self.cube_a, self.cube_b, coords=[latitude, longitude] ) @@ -371,11 +351,11 @@ def test_izip_different_valued_coords(self): ): slice_a_truth = self.cube_a[i, :, :] slice_b_truth = self.cube_b[i, :, :] - self.assertEqual(slice_a_truth, slice_a) - self.assertEqual(slice_b_truth, slice_b) - self.assertNotEqual(slice_b, None) + assert slice_a_truth == slice_a + assert slice_b_truth == slice_b + assert slice_b is not None i += 1 - self.assertEqual(i, nslices) + assert i == nslices # Call with coordinate instances rather than coord names i = 0 for slice_a, slice_b in iris.iterate.izip( @@ -383,10 +363,10 @@ def test_izip_different_valued_coords(self): ): slice_a_truth = self.cube_a[i, :, :] slice_b_truth = self.cube_b[i, :, :] - self.assertEqual(slice_a_truth, slice_a) - self.assertEqual(slice_b_truth, slice_b) + assert slice_a_truth == slice_a + assert slice_b_truth == slice_b i += 1 - self.assertEqual(i, nslices) + assert i == nslices def test_izip_ordered(self): # Remove coordinate that spans grid_latitude and @@ -405,10 +385,10 @@ def test_izip_ordered(self): cube_slice_truth = cube[i, :, :] # izip should transpose the slice to ensure order is [lat, lon] cube_slice_truth.transpose() - self.assertEqual(slice_b_truth, slice_b) - self.assertEqual(cube_slice_truth, cube_slice) + assert slice_b_truth == slice_b + assert cube_slice_truth == cube_slice i += 1 - self.assertEqual(i, nslices) + assert i == nslices # Alternative behaviour: ordered=False (retain original ordering) i = 0 for slice_b, cube_slice in iris.iterate.izip( @@ -416,10 +396,10 @@ def test_izip_ordered(self): ): slice_b_truth = self.cube_b[i, :, :] cube_slice_truth = cube[i, :, :] - self.assertEqual(slice_b_truth, slice_b) - self.assertEqual(cube_slice_truth, cube_slice) + assert slice_b_truth == slice_b + assert cube_slice_truth == cube_slice i += 1 - self.assertEqual(i, nslices) + assert i == nslices def test_izip_use_in_analysis(self): # Calculate mean, collapsing vertical dimension @@ -434,11 +414,11 @@ def test_izip_use_in_analysis(self): self.cube_b, vertical_mean, coords=self.coord_names ): slice_b_truth = self.cube_b[i, :, :] - self.assertEqual(slice_b_truth, slice_b) + assert slice_b_truth == slice_b # Should return same cube in each iteration - self.assertEqual(vertical_mean, mean_slice) + assert vertical_mean == mean_slice i += 1 - self.assertEqual(i, nslices) + assert i == nslices def test_izip_nd_non_ortho(self): cube1 = iris.cube.Cube(np.zeros((5, 5, 5))) @@ -454,7 +434,7 @@ def test_izip_nd_non_ortho(self): cube2 = cube1.copy() # The two coords are not orthogonal so we cannot use them with izip - with self.assertRaises(ValueError): + with pytest.raises(ValueError): iris.iterate.izip(cube1, cube2, coords=["y", "x"]) def test_izip_nd_ortho(self): @@ -484,7 +464,7 @@ def test_izip_nd_ortho(self): # The two coords are orthogonal so we can use them with izip it = iris.iterate.izip(cube1, cube2, coords=["y", "x"]) cubes = list(np.array(list(it)).flatten()) - self.assertCML(cubes, ("iterate", "izip_nd_ortho.cml")) + iris.tests.assert_cml(cubes, ("iterate", "izip_nd_ortho.cml")) def _check_2d_slices(self): # Helper method to verify slices from izip match those from @@ -496,10 +476,10 @@ def _check_2d_slices(self): for slice_a, slice_b in iris.iterate.izip( self.cube_a, self.cube_b, coords=self.coord_names ): - self.assertEqual(slice_a, next(slice_a_iterator)) - self.assertEqual(slice_b, next(slice_b_iterator)) + assert slice_a == next(slice_a_iterator) + assert slice_b == next(slice_b_iterator) count += 1 - self.assertEqual(count, nslices) + assert count == nslices def test_izip_extra_coords_step_dim(self): # Add extra different coords to cubes along the dimension we are @@ -557,11 +537,7 @@ def test_izip_no_common_coords_on_step_dim(self): self.cube_a, self.cube_b, coords=self.coord_names ): expected_a, expected_b = next(product_iterator) - self.assertEqual(slice_a, expected_a) - self.assertEqual(slice_b, expected_b) + assert slice_a == expected_a + assert slice_b == expected_b count += 1 - self.assertEqual(count, nslices) - - -if __name__ == "__main__": - tests.main() + assert count == nslices diff --git a/lib/iris/tests/test_plot.py b/lib/iris/tests/test_plot.py index 0c5e2541fe..f68a9cf32a 100644 --- a/lib/iris/tests/test_plot.py +++ b/lib/iris/tests/test_plot.py @@ -736,7 +736,11 @@ def _get_cube(self): filename = _shared_utils.get_data_path( ("PP", "COLPEX", "theta_and_orog_subset.pp") ) - self.__class__.cube = iris.load_cube(filename, "air_potential_temperature") + cube = iris.load_cube(filename, "air_potential_temperature") + if cube.coord_dims("time") != (0,): + # A quick fix for data which has changed since we support time-varying orography + cube.transpose((1, 0, 2, 3)) + self.__class__.cube = cube @pytest.fixture(autouse=True) def _setup(self): diff --git a/lib/iris/tests/test_pp_to_cube.py b/lib/iris/tests/test_pp_to_cube.py index eeee76273f..88eca67d6d 100644 --- a/lib/iris/tests/test_pp_to_cube.py +++ b/lib/iris/tests/test_pp_to_cube.py @@ -88,7 +88,7 @@ def test_regrid_missing_coord(self): # If the target cube is missing one of the source dimension # coords, ensure the re-grid fails nicely - i.e. returns None. self.target.remove_coord("bar") - new_ref = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) + new_ref, _ = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) assert new_ref is None def test_regrid_codimension(self): @@ -99,11 +99,11 @@ def test_regrid_codimension(self): new_foo = self.target.coord("bar").copy() new_foo.rename("foo") self.target.add_aux_coord(new_foo, 0) - new_ref = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) + new_ref, _ = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) assert new_ref is None def test_regrid_identity(self): - new_ref = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) + new_ref, _ = iris.fileformats.rules._ensure_aligned({}, self.ref, self.target) # Bounds don't make it through the re-grid process self.ref.coord("bar").bounds = None self.ref.coord("foo").bounds = None diff --git a/lib/iris/tests/test_quickplot.py b/lib/iris/tests/test_quickplot.py index 01b3d5812b..17ef68e64b 100644 --- a/lib/iris/tests/test_quickplot.py +++ b/lib/iris/tests/test_quickplot.py @@ -159,10 +159,22 @@ def test_contourf_nameless(self): qplt.contourf(cube, coords=["grid_longitude", "model_level_number"]) self.check_graphic() + def test_contourf_no_colorbar(self): + qplt.contourf( + self._small(), + colorbar=False, + coords=["model_level_number", "grid_longitude"], + ) + self.check_graphic() + def test_pcolor(self): qplt.pcolor(self._small()) self.check_graphic() + def test_pcolor_no_colorbar(self): + qplt.pcolor(self._small(), colorbar=False) + self.check_graphic() + def test_pcolormesh(self): qplt.pcolormesh(self._small()) @@ -178,6 +190,10 @@ def test_pcolormesh_str_symbol(self): self.check_graphic() + def test_pcolormesh_no_colorbar(self): + qplt.pcolormesh(self._small(), colorbar=False) + self.check_graphic() + def test_map(self): cube = self._slice(["grid_latitude", "grid_longitude"]) qplt.contour(cube) diff --git a/lib/iris/tests/unit/analysis/maths/test__arith__meshcoords.py b/lib/iris/tests/unit/analysis/maths/test__arith__meshcoords.py index 7275bfa1d3..58af4364d4 100644 --- a/lib/iris/tests/unit/analysis/maths/test__arith__meshcoords.py +++ b/lib/iris/tests/unit/analysis/maths/test__arith__meshcoords.py @@ -44,7 +44,7 @@ class MeshLocationsMixin: # Modify the inherited data operation, to test with a mesh-cube. # Also, optionally, test with derived coordinates. - def _base_testcube(self): + def _base_testcube(self, include_derived=False): cube = super()._base_testcube(include_derived=self.use_derived_coords) cube = _convert_to_meshcube(cube) self.cube_xy_dimcoords = ["i_mesh_face"] diff --git a/lib/iris/tests/unit/analysis/regrid/test_RectilinearRegridder.py b/lib/iris/tests/unit/analysis/regrid/test_RectilinearRegridder.py index 284d52d3f9..3f841b938a 100644 --- a/lib/iris/tests/unit/analysis/regrid/test_RectilinearRegridder.py +++ b/lib/iris/tests/unit/analysis/regrid/test_RectilinearRegridder.py @@ -474,12 +474,25 @@ def setUp(self): self.args = ("linear", "mask") self.regridder = Regridder(self.cube, self.cube, *self.args) self.lazy_cube = self.cube.copy(da.asarray(self.cube.data)) + self.lazy_masked_cube = self.lazy_cube.copy(da.ma.masked_array(self.cube.data)) self.lazy_regridder = Regridder(self.lazy_cube, self.lazy_cube, *self.args) def test_lazy_regrid(self): result = self.lazy_regridder(self.lazy_cube) self.assertTrue(result.has_lazy_data()) + meta = da.utils.meta_from_array(result.core_data()) + self.assertTrue(meta.__class__ is np.ndarray) expected = self.regridder(self.cube) + self.assertEqual(result.dtype, expected.dtype) + self.assertTrue(result == expected) + + def test_lazy_masked_regrid(self): + result = self.lazy_regridder(self.lazy_masked_cube) + self.assertTrue(result.has_lazy_data()) + meta = da.utils.meta_from_array(result.core_data()) + self.assertTrue(isinstance(meta, np.ma.MaskedArray)) + expected = self.regridder(self.cube) + self.assertEqual(result.dtype, expected.dtype) self.assertTrue(result == expected) diff --git a/lib/iris/tests/unit/analysis/test_PERCENTILE.py b/lib/iris/tests/unit/analysis/test_PERCENTILE.py index 0d759c621f..72218af830 100644 --- a/lib/iris/tests/unit/analysis/test_PERCENTILE.py +++ b/lib/iris/tests/unit/analysis/test_PERCENTILE.py @@ -155,10 +155,10 @@ def test_default_kwargs_passed(self, mocked_mquantiles): if self.lazy: data = as_lazy_data(data) - self.agg_method(data, axis=axis, percent=percent) + result = self.agg_method(data, axis=axis, percent=percent) # Trigger calculation for lazy case. - as_concrete_data(data) + as_concrete_data(result) for key in ["alphap", "betap"]: self.assertEqual(mocked_mquantiles.call_args.kwargs[key], 1) @@ -170,10 +170,12 @@ def test_chosen_kwargs_passed(self, mocked_mquantiles): if self.lazy: data = as_lazy_data(data) - self.agg_method(data, axis=axis, percent=percent, alphap=0.6, betap=0.5) + result = self.agg_method( + data, axis=axis, percent=percent, alphap=0.6, betap=0.5 + ) # Trigger calculation for lazy case. - as_concrete_data(data) + as_concrete_data(result) for key, val in zip(["alphap", "betap"], [0.6, 0.5]): self.assertEqual(mocked_mquantiles.call_args.kwargs[key], val) diff --git a/lib/iris/tests/unit/analysis/test_WPERCENTILE.py b/lib/iris/tests/unit/analysis/test_WPERCENTILE.py index a0e6b860ce..0fb64445d0 100644 --- a/lib/iris/tests/unit/analysis/test_WPERCENTILE.py +++ b/lib/iris/tests/unit/analysis/test_WPERCENTILE.py @@ -8,6 +8,8 @@ # importing anything else. import iris.tests as tests # isort:skip +import re + import numpy as np import numpy.ma as ma @@ -26,7 +28,9 @@ def test_missing_mandatory_kwargs(self): def test_wrong_weights_shape(self): data = np.arange(11) weights = np.ones(10) - emsg = "_weighted_percentile: weights wrong shape." + emsg = re.escape( + "For data array of shape (11,), weights should be (11,) or (11,)" + ) with self.assertRaisesRegex(ValueError, emsg): WPERCENTILE.aggregate(data, axis=0, percent=50, weights=weights) @@ -158,6 +162,22 @@ def test_masked_2d_multi_unequal(self): self.assertTupleEqual(weight_total.shape, (shape[-1],)) self.assertArrayEqual(weight_total, np.repeat(4, shape[-1])) + def test_2d_multi_weight1d_unequal(self): + shape = (3, 10) + data = np.arange(np.prod(shape)).reshape(shape) + weights1d = np.ones(shape[-1]) + weights1d[::3] = 3 + weights2d = np.broadcast_to(weights1d, shape) + percent = np.array([30, 50, 75, 80]) + result_1d, wt_total_1d = WPERCENTILE.aggregate( + data, axis=1, percent=percent, weights=weights1d, returned=True + ) + result_2d, wt_total_2d = WPERCENTILE.aggregate( + data, axis=1, percent=percent, weights=weights2d, returned=True + ) + # Results should be the same whether we use 1d or 2d weights. + self.assertArrayAllClose(result_1d, result_2d) + class Test_name(tests.IrisTest): def test(self): diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py b/lib/iris/tests/unit/common/metadata/test_ConnectivityMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py rename to lib/iris/tests/unit/common/metadata/test_ConnectivityMetadata.py index fa62a9f7e2..6f3c9f7429 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py +++ b/lib/iris/tests/unit/common/metadata/test_ConnectivityMetadata.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.ConnectivityMetadata`.""" +"""Unit tests for the :class:`iris.common.metadata.ConnectivityMetadata`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -12,8 +13,7 @@ from unittest.mock import sentinel from iris.common.lenient import _LENIENT, _qualname -from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import ConnectivityMetadata +from iris.common.metadata import BaseMetadata, ConnectivityMetadata class Test(tests.IrisTest): diff --git a/lib/iris/tests/unit/common/metadata/test_CubeMetadata.py b/lib/iris/tests/unit/common/metadata/test_CubeMetadata.py index b810fb0659..c678a285d9 100644 --- a/lib/iris/tests/unit/common/metadata/test_CubeMetadata.py +++ b/lib/iris/tests/unit/common/metadata/test_CubeMetadata.py @@ -4,6 +4,12 @@ # See LICENSE in the root of the repository for full licensing details. """Unit tests for the :class:`iris.common.metadata.CubeMetadata`.""" +# Import iris.tests first so that some things can be initialised before +# importing anything else. +from typing import Any, ClassVar + +from copy import deepcopy + from copy import deepcopy import pytest @@ -85,7 +91,7 @@ def test_bases(self): assert issubclass(self.cls, BaseMetadata) -@pytest.fixture(params=CubeMetadata._fields) +@pytest.fixture(params=CubeMetadata._fields) # type: ignore[attr-defined] def fieldname(request): """Parametrize testing over all CubeMetadata field names.""" return request.param @@ -135,7 +141,7 @@ def order_reversed(request): # N.B. the *same* results should also apply when left+right are swapped, with a suitable # adjustment to the result value. Likewise, results should be the same for either # global- or local-style attributes. -_ALL_RESULTS = { +_ALL_RESULTS: dict[str, dict[str, dict[str, Any]]] = { "equal": { "primaryAA": {"lenient": True, "strict": True}, "primaryAX": {"lenient": True, "strict": False}, @@ -297,7 +303,7 @@ def check_splitattrs_testcase( CubeMetadata( **{ field: attrs if field == "attributes" else None - for field in CubeMetadata._fields + for field in CubeMetadata._fields # type: ignore[attr-defined] } ) for attrs in input_dicts @@ -314,7 +320,7 @@ def check_splitattrs_testcase( # Adjust the result of a "reversed" operation to the 'normal' way round. # ( N.B. only "difference" results are affected by reversal. ) if isinstance(result, CubeMetadata): - result = result._replace(attributes=result.attributes[::-1]) + result = result._replace(attributes=result.attributes[::-1]) # type: ignore[attr-defined] # Extract, from the operation result, the value to be tested against "expected". result = extract_result_value(result, check_global_not_local) @@ -325,7 +331,9 @@ def check_splitattrs_testcase( expected = _ALL_RESULTS[operation_name][primary_key][which] if operation_name == "equal" and expected: # Account for the equality cases made `False` by mismatched secondary values. - left, right = secondary_inputs + left, right = list( + secondary_inputs + ) # see https://github.com/python/mypy/issues/13823 secondaries_same = left == right or (check_is_lenient and "X" in (left, right)) if not secondaries_same: expected = False @@ -342,7 +350,7 @@ class MixinSplitattrsMatrixTests: """ # Define the operation name : set in each inheritor - operation_name = None + operation_name: ClassVar[str] def test_splitattrs_cases( self, diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py b/lib/iris/tests/unit/common/metadata/test_MeshCoordMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py rename to lib/iris/tests/unit/common/metadata/test_MeshCoordMetadata.py index fc9242a8f9..3bdf261165 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py +++ b/lib/iris/tests/unit/common/metadata/test_MeshCoordMetadata.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.MeshCoordMetadata`.""" +"""Unit tests for the :class:`iris.common.metadata.MeshCoordMetadata`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -12,8 +13,7 @@ from unittest.mock import sentinel from iris.common.lenient import _LENIENT, _qualname -from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import MeshCoordMetadata +from iris.common.metadata import BaseMetadata, MeshCoordMetadata class Test__identity(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py b/lib/iris/tests/unit/common/metadata/test_MeshMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py rename to lib/iris/tests/unit/common/metadata/test_MeshMetadata.py index 080d94c188..7dae56bbe6 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py +++ b/lib/iris/tests/unit/common/metadata/test_MeshMetadata.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.MeshMetadata`.""" +"""Unit tests for the :class:`iris.common.metadata.MeshMetadata`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -12,8 +13,7 @@ from unittest.mock import sentinel from iris.common.lenient import _LENIENT, _qualname -from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import MeshMetadata +from iris.common.metadata import BaseMetadata, MeshMetadata class Test(tests.IrisTest): diff --git a/lib/iris/tests/unit/common/metadata/test__NamedTupleMeta.py b/lib/iris/tests/unit/common/metadata/test__NamedTupleMeta.py index 6009cb85f7..426bf6416a 100644 --- a/lib/iris/tests/unit/common/metadata/test__NamedTupleMeta.py +++ b/lib/iris/tests/unit/common/metadata/test__NamedTupleMeta.py @@ -43,7 +43,7 @@ def _members(self): assert self.names(Metadata.__bases__) == expected expected = ["Metadata", "object"] assert self.names(Metadata.__mro__) == expected - emsg = "Can't instantiate abstract class .* with abstract method.* _members" + emsg = "Can't instantiate abstract class" with pytest.raises(TypeError, match=emsg): _ = Metadata() diff --git a/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py b/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py index 4e83736103..ab1a8eeb6c 100644 --- a/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py +++ b/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py @@ -13,11 +13,11 @@ AncillaryVariableMetadata, BaseMetadata, CellMeasureMetadata, + ConnectivityMetadata, CoordMetadata, CubeMetadata, metadata_manager_factory, ) -from iris.experimental.ugrid.metadata import ConnectivityMetadata BASES = [ AncillaryVariableMetadata, diff --git a/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py b/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py index e75d734284..c6de740ba1 100644 --- a/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py +++ b/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py @@ -13,11 +13,11 @@ AncillaryVariableMetadata, BaseMetadata, CellMeasureMetadata, + ConnectivityMetadata, CoordMetadata, CubeMetadata, ) from iris.common.mixin import CFVariableMixin, LimitedAttributeDict -from iris.experimental.ugrid.metadata import ConnectivityMetadata class Test__getter: diff --git a/lib/iris/tests/unit/common/mixin/test_LimitedAttributeDict.py b/lib/iris/tests/unit/common/mixin/test_LimitedAttributeDict.py index 4b700aa963..ca8fd97c39 100644 --- a/lib/iris/tests/unit/common/mixin/test_LimitedAttributeDict.py +++ b/lib/iris/tests/unit/common/mixin/test_LimitedAttributeDict.py @@ -44,6 +44,15 @@ def test___eq___numpy(self): assert left == right assert left == values + # Test inequality: + values = dict(one=np.arange(1), two=np.arange(2), three=np.arange(3)) + left = LimitedAttributeDict(**values) + right = LimitedAttributeDict( + one=np.arange(3), two=np.arange(2), three=np.arange(1) + ) + assert right != left + assert right != values + def test___setitem__(self): for key in self.forbidden_keys: item = LimitedAttributeDict() diff --git a/lib/iris/tests/unit/concatenate/__init__.py b/lib/iris/tests/unit/concatenate/__init__.py index a99b5790d7..7b8c75d6ab 100644 --- a/lib/iris/tests/unit/concatenate/__init__.py +++ b/lib/iris/tests/unit/concatenate/__init__.py @@ -60,9 +60,9 @@ class MetaDataItem: def create_metadata( dim_coord: bool = True, scalar: bool = False, - order: int = None, + order: int | None = None, circular: bool | None = False, - coord_dtype: np.dtype = None, + coord_dtype=None, lazy: bool = True, with_bounds: bool | None = False, ) -> MetaDataItem: @@ -121,7 +121,7 @@ def create_metadata( coord.metadata = iris.common.CoordMetadata.from_metadata(metadata) dims = tuple([dim for dim in range(coord.ndim)]) - kwargs = {"scalar": scalar} + kwargs: dict[str, Any] = {"scalar": scalar} if dim_coord: kwargs["circular"] = circular diff --git a/lib/iris/tests/unit/concatenate/test__CoordSignature.py b/lib/iris/tests/unit/concatenate/test__CoordSignature.py index 0d91b1883b..051f02de94 100644 --- a/lib/iris/tests/unit/concatenate/test__CoordSignature.py +++ b/lib/iris/tests/unit/concatenate/test__CoordSignature.py @@ -33,18 +33,18 @@ class MockCubeSignature: cell_measures_and_dims: bool | None = None ancillary_variables_and_dims: bool | None = None derived_coords_and_dims: bool | None = None - dim_coords: list[DimCoord, ...] = field(default_factory=list) + dim_coords: list[DimCoord] = field(default_factory=list) dim_mapping: bool | None = None - dim_extents: list[_Extent, ...] = field(default_factory=list) - dim_order: list[int, ...] = field(default_factory=list) - dim_metadata: list[_CoordMetaData, ...] = field(default_factory=list) + dim_extents: list[_Extent] = field(default_factory=list) + dim_order: list[int] = field(default_factory=list) + dim_metadata: list[_CoordMetaData] = field(default_factory=list) @pytest.mark.parametrize("order", [_DECREASING, _INCREASING]) @pytest.mark.parametrize("coord_dtype", [np.int32, np.float32]) @pytest.mark.parametrize("lazy", [False, True]) @pytest.mark.parametrize("with_bounds", [False, True]) -def test_dim(order: int, coord_dtype: np.dtype, lazy: bool, with_bounds: bool) -> None: +def test_dim(order: int, coord_dtype, lazy: bool, with_bounds: bool) -> None: """Test extent calculation of vector dimension coordinates.""" metadata = create_metadata( dim_coord=True, @@ -54,11 +54,12 @@ def test_dim(order: int, coord_dtype: np.dtype, lazy: bool, with_bounds: bool) - lazy=lazy, with_bounds=with_bounds, ) + assert isinstance(metadata.coord, DimCoord) # Type hint for linters. dim_metadata = [_CoordMetaData(metadata.coord, metadata.dims)] cube_signature = MockCubeSignature( dim_coords=[metadata.coord], dim_metadata=dim_metadata ) - coord_signature = _CoordSignature(cube_signature) + coord_signature = _CoordSignature(cube_signature) # type: ignore[arg-type] assert len(coord_signature.dim_extents) == 1 (actual,) = coord_signature.dim_extents first, last = coord_dtype(0), coord_dtype((N_POINTS - 1) * SCALE_FACTOR) @@ -86,7 +87,7 @@ def test_dim(order: int, coord_dtype: np.dtype, lazy: bool, with_bounds: bool) - @pytest.mark.parametrize("coord_dtype", [np.int32, np.float32]) @pytest.mark.parametrize("lazy", [False, True]) @pytest.mark.parametrize("with_bounds", [False, True]) -def test_dim__scalar(coord_dtype: np.dtype, lazy: bool, with_bounds: bool) -> None: +def test_dim__scalar(coord_dtype, lazy: bool, with_bounds: bool) -> None: """Test extent calculation of scalar dimension coordinates.""" metadata = create_metadata( dim_coord=True, @@ -96,11 +97,12 @@ def test_dim__scalar(coord_dtype: np.dtype, lazy: bool, with_bounds: bool) -> No lazy=lazy, with_bounds=with_bounds, ) + assert isinstance(metadata.coord, DimCoord) # Hint for mypy. dim_metadata = [_CoordMetaData(metadata.coord, metadata.dims)] cube_signature = MockCubeSignature( dim_coords=[metadata.coord], dim_metadata=dim_metadata ) - coord_signature = _CoordSignature(cube_signature) + coord_signature = _CoordSignature(cube_signature) # type: ignore[arg-type] assert len(coord_signature.dim_extents) == 1 (actual,) = coord_signature.dim_extents point = coord_dtype(1) diff --git a/lib/iris/tests/unit/concatenate/test_concatenate.py b/lib/iris/tests/unit/concatenate/test_concatenate.py index 16e6c2784d..9521c3af48 100644 --- a/lib/iris/tests/unit/concatenate/test_concatenate.py +++ b/lib/iris/tests/unit/concatenate/test_concatenate.py @@ -15,6 +15,7 @@ import iris.coords import iris.cube from iris.exceptions import ConcatenateError +import iris.warnings class TestEpoch: @@ -49,9 +50,15 @@ def test_concat_1d_with_same_time_units(self, simple_1d_time_cubes): assert result[0].shape == (10,) -class TestMessages: +class _MessagesMixin: + + @pytest.fixture() + def placeholder(self): + # Shim to allow sample_cubes to have identical signature in both parent and subclasses + return [] + @pytest.fixture() - def sample_cubes(self): + def sample_cubes(self, placeholder): # Construct and return a pair of identical cubes data = np.arange(24, dtype=np.float32).reshape(2, 3, 4) cube = iris.cube.Cube(data, standard_name="air_temperature", units="K") @@ -114,6 +121,19 @@ def test_definition_difference_message(self, sample_cubes): with pytest.raises(ConcatenateError, match=exc_regexp): _ = concatenate(sample_cubes, True) + +class TestMessages(_MessagesMixin): + def test_dim_coords_same_message(self, sample_cubes): + exc_regexp = "Cannot find an axis to concatenate over for phenomenon *" + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + + def test_definition_difference_message(self, sample_cubes): + sample_cubes[1].units = "1" + exc_regexp = "Cube metadata differs for phenomenon: *" + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + def test_dimensions_difference_message(self, sample_cubes): sample_cubes[1].remove_coord("latitude") exc_regexp = "Dimension coordinates differ: .* != .*" @@ -216,6 +236,52 @@ def test_dim_coords_overlap_message(self, sample_cubes): _ = concatenate(sample_cubes, True) +class TestNonMetadataMessages(_MessagesMixin): + parent_cubes = _MessagesMixin.sample_cubes + + @pytest.fixture() + def sample_cubes(self, parent_cubes): + coord = parent_cubes[1].coord("time") + parent_cubes[1].replace_coord(coord.copy(points=coord.points + 2)) + return parent_cubes + + def test_aux_coords_diff_message(self, sample_cubes): + sample_cubes[1].coord("foo").points = [3, 4, 5] + + exc_regexp = "Auxiliary coordinates are unequal for phenomenon * " + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + with pytest.warns(iris.warnings.IrisUserWarning, match=exc_regexp): + _ = concatenate(sample_cubes, False) + + def test_cell_measures_diff_message(self, sample_cubes): + sample_cubes[1].cell_measure("bar").data = [3, 4, 5] + + exc_regexp = "Cell measures are unequal for phenomenon * " + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + with pytest.warns(iris.warnings.IrisUserWarning, match=exc_regexp): + _ = concatenate(sample_cubes, False) + + def test_ancillary_variable_diff_message(self, sample_cubes): + sample_cubes[1].ancillary_variable("baz").data = [3, 4, 5] + + exc_regexp = "Ancillary variables are unequal for phenomenon * " + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + with pytest.warns(iris.warnings.IrisUserWarning, match=exc_regexp): + _ = concatenate(sample_cubes, False) + + def test_derived_coords_diff_message(self, sample_cubes): + sample_cubes[1].aux_factories[0].update(sample_cubes[1].coord("sigma"), None) + + exc_regexp = "Derived coordinates are unequal for phenomenon * " + with pytest.raises(ConcatenateError, match=exc_regexp): + _ = concatenate(sample_cubes, True) + with pytest.warns(iris.warnings.IrisUserWarning, match=exc_regexp): + _ = concatenate(sample_cubes, False) + + class TestOrder: def _make_cube(self, points, bounds=None): nx = 4 diff --git a/lib/iris/tests/unit/concatenate/test_hashing.py b/lib/iris/tests/unit/concatenate/test_hashing.py new file mode 100644 index 0000000000..24062a2af3 --- /dev/null +++ b/lib/iris/tests/unit/concatenate/test_hashing.py @@ -0,0 +1,90 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Test array hashing in :mod:`iris._concatenate`.""" + +import dask.array as da +import numpy as np +import pytest + +from iris import _concatenate + + +@pytest.mark.parametrize( + "a,b,eq", + [ + (np.arange(2), da.arange(2), True), + (np.arange(2), np.arange(2).reshape((1, 2)), False), + (da.arange(2), da.arange(2).reshape((1, 2)), False), + (np.array([1], dtype=np.float32), np.array([1], dtype=bool), True), + (np.array([np.nan, 1.0]), np.array([np.nan, 1.0]), True), + (np.ma.array([1, 2], mask=[0, 1]), np.ma.array([1, 2], mask=[0, 1]), True), + (np.ma.array([1, 2], mask=[0, 1]), np.ma.array([1, 2], mask=[0, 0]), False), + (np.ma.array([1, 2], mask=[1, 1]), np.ma.array([1, 2], mask=[1, 1]), True), + (np.ma.array([1, 2], mask=[0, 0]), np.ma.array([1, 2], mask=[0, 0]), True), + (da.arange(6).reshape((2, 3)), da.arange(6, chunks=1).reshape((2, 3)), True), + (da.arange(20, chunks=1), da.arange(20, chunks=2), True), + ( + da.ma.masked_array([1, 2], mask=[0, 1]), + da.ma.masked_array([1, 2], mask=[0, 1]), + True, + ), + ( + da.ma.masked_array([1, 2], mask=[0, 1]), + da.ma.masked_array([1, 3], mask=[0, 1]), + True, + ), + ( + np.arange(2), + da.ma.masked_array(np.arange(2), mask=[0, 0]), + True, + ), + ( + np.arange(2), + da.ma.masked_array(np.arange(2), mask=[0, 1]), + False, + ), + ( + da.ma.masked_array(np.arange(10), mask=np.zeros(10)), + da.ma.masked_array(np.arange(10), mask=np.ma.nomask), + True, + ), + ( + np.ma.array([1, 2], mask=[0, 1]), + np.ma.array([1, 3], mask=[0, 1], fill_value=10), + True, + ), + ( + np.ma.masked_array([1], mask=[True]), + np.array([np.ma.default_fill_value(np.dtype("int64"))]), + False, + ), + (np.array(["a", "b"]), np.array(["a", "b"]), True), + (np.array(["a"]), np.array(["b"]), False), + (da.asarray(["a", "b"], chunks=1), da.asarray(["a", "b"], chunks=1), True), + (da.array(["a"]), da.array(["b"]), False), + (np.array(["a"]), da.array(["a"]), True), + (np.array(["a"]), np.array([1]), False), + (da.asarray([1, 1], chunks=1), da.asarray(["a", "b"], chunks=1), False), + (np.array(["a"]), np.array(["a"]).view(dtype=np.int32), False), + ], +) +def test_compute_hashes(a, b, eq): + hashes = _concatenate._compute_hashes({"a": a, "b": b}) + assert eq == (hashes["a"] == hashes["b"]) + + +def test_arrayhash_equal_incompatible_chunks_raises(): + hash1 = _concatenate._ArrayHash(1, chunks=((1, 1),)) + hash2 = _concatenate._ArrayHash(1, chunks=((2,),)) + msg = r"Unable to compare arrays with different chunks.*" + with pytest.raises(ValueError, match=msg): + hash1 == hash2 + + +def test_arrayhash_equal_incompatible_type_raises(): + hash = _concatenate._ArrayHash(1, chunks=(1, 1)) + msg = r"Unable to compare .*" + with pytest.raises(TypeError, match=msg): + hash == object() diff --git a/lib/iris/tests/unit/conftest.py b/lib/iris/tests/unit/conftest.py index a4ddb89294..524ca53ce8 100644 --- a/lib/iris/tests/unit/conftest.py +++ b/lib/iris/tests/unit/conftest.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests fixture infra-structure.""" + import pytest import iris diff --git a/lib/iris/tests/unit/coords/test_Coord.py b/lib/iris/tests/unit/coords/test_Coord.py index c0accfe071..97429f58f8 100644 --- a/lib/iris/tests/unit/coords/test_Coord.py +++ b/lib/iris/tests/unit/coords/test_Coord.py @@ -9,11 +9,14 @@ import iris.tests as tests # isort:skip import collections +from datetime import datetime from unittest import mock import warnings +import cf_units import dask.array as da import numpy as np +import numpy.ma as ma import pytest import iris @@ -236,6 +239,163 @@ def test_points_inside_bounds_outside_wrong_name_2(self): self.assertArrayEqual(lat.bounds, [[-120, -40], [-40, 35], [35, 105]]) +def test_guess_bounds_monthly_and_yearly(): + units = cf_units.Unit("days since epoch", calendar="gregorian") + points = units.date2num( + [ + datetime(1990, 1, 1), + datetime(1990, 2, 1), + datetime(1990, 3, 1), + ] + ) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + with pytest.raises( + ValueError, + match="Cannot guess monthly and yearly bounds simultaneously.", + ): + coord.guess_bounds(monthly=True, yearly=True) + + +class Test_Guess_Bounds_Monthly: + def test_monthly_multiple_points_in_month(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + points = units.date2num( + [ + datetime(1990, 1, 3), + datetime(1990, 1, 28), + datetime(1990, 2, 13), + ] + ) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + with pytest.raises( + ValueError, + match="Cannot guess monthly bounds for a coordinate with multiple points " + "in a month.", + ): + coord.guess_bounds(monthly=True) + + def test_monthly_non_contiguous(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = units.date2num( + [ + [datetime(1990, 1, 1), datetime(1990, 2, 1)], + [datetime(1990, 2, 1), datetime(1990, 3, 1)], + [datetime(1990, 5, 1), datetime(1990, 6, 1)], + ] + ) + points = expected.mean(axis=1) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + with pytest.raises( + ValueError, match="Cannot guess bounds for a non-contiguous coordinate." + ): + coord.guess_bounds(monthly=True) + + def test_monthly_end_of_month(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = units.date2num( + [ + [datetime(1990, 1, 1), datetime(1990, 2, 1)], + [datetime(1990, 2, 1), datetime(1990, 3, 1)], + [datetime(1990, 3, 1), datetime(1990, 4, 1)], + ] + ) + points = units.date2num( + [ + datetime(1990, 1, 31), + datetime(1990, 2, 28), + datetime(1990, 3, 31), + ] + ) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + coord.guess_bounds(monthly=True) + dates = units.num2date(coord.bounds) + expected_dates = units.num2date(expected) + np.testing.assert_array_equal(dates, expected_dates) + + def test_monthly_multiple_years(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = [ + [datetime(1990, 10, 1), datetime(1990, 11, 1)], + [datetime(1990, 11, 1), datetime(1990, 12, 1)], + [datetime(1990, 12, 1), datetime(1991, 1, 1)], + ] + expected_points = units.date2num(expected) + points = expected_points.mean(axis=1) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + coord.guess_bounds(monthly=True) + dates = units.num2date(coord.bounds) + np.testing.assert_array_equal(dates, expected) + + def test_monthly_single_point(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = [ + [datetime(1990, 1, 1), datetime(1990, 2, 1)], + ] + expected_points = units.date2num(expected) + points = expected_points.mean(axis=1) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + coord.guess_bounds(monthly=True) + dates = units.num2date(coord.bounds) + np.testing.assert_array_equal(dates, expected) + + +class Test_Guess_Bounds_Yearly: + def test_yearly_multiple_points_in_year(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + points = units.date2num( + [ + datetime(1990, 1, 1), + datetime(1990, 2, 1), + datetime(1991, 1, 1), + ] + ) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + with pytest.raises( + ValueError, + match="Cannot guess yearly bounds for a coordinate with multiple points " + "in a year.", + ): + coord.guess_bounds(yearly=True) + + def test_yearly_non_contiguous(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = units.date2num( + [ + [datetime(1990, 1, 1), datetime(1990, 1, 1)], + [datetime(1991, 1, 1), datetime(1991, 1, 1)], + [datetime(1994, 1, 1), datetime(1994, 1, 1)], + ] + ) + points = expected.mean(axis=1) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + with pytest.raises( + ValueError, match="Cannot guess bounds for a non-contiguous coordinate." + ): + coord.guess_bounds(yearly=True) + + def test_yearly_end_of_year(self): + units = cf_units.Unit("days since epoch", calendar="gregorian") + expected = units.date2num( + [ + [datetime(1990, 1, 1), datetime(1991, 1, 1)], + [datetime(1991, 1, 1), datetime(1992, 1, 1)], + [datetime(1992, 1, 1), datetime(1993, 1, 1)], + ] + ) + points = units.date2num( + [ + datetime(1990, 12, 31), + datetime(1991, 12, 31), + datetime(1992, 12, 31), + ] + ) + coord = iris.coords.AuxCoord(points=points, units=units, standard_name="time") + coord.guess_bounds(yearly=True) + dates = units.num2date(coord.bounds) + expected_dates = units.num2date(expected) + np.testing.assert_array_equal(dates, expected_dates) + + class Test_cell(tests.IrisTest): def _mock_coord(self): coord = mock.Mock( @@ -542,6 +702,112 @@ def test_lazy_3_bounds(self): self.assertArrayAlmostEqual(collapsed_coord.points, da.array([2.0])) self.assertArrayAlmostEqual(collapsed_coord.bounds, da.array([[0.0, 4.0]])) + def test_string_masked(self): + points = ma.array(["foo", "bar", "bing"], mask=[0, 1, 0], dtype=str) + coord = AuxCoord(points) + + collapsed_coord = coord.collapsed(0) + + expected = "foo|--|bing" + self.assertEqual(collapsed_coord.points, expected) + + def test_string_nd_first(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str)) + + collapsed_coord = coord.collapsed(0) + expected = [ + "0.0|40.0|80.0", + "10.0|50.0|90.0", + "20.0|60.0|100.0", + "30.0|70.0|110.0", + ] + + self.assertArrayEqual(collapsed_coord.points, expected) + + def test_string_nd_second(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str)) + + collapsed_coord = coord.collapsed(1) + expected = [ + "0.0|10.0|20.0|30.0", + "40.0|50.0|60.0|70.0", + "80.0|90.0|100.0|110.0", + ] + + self.assertArrayEqual(collapsed_coord.points, expected) + + def test_string_nd_both(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str)) + + collapsed_coord = coord.collapsed() + expected = ["0.0|10.0|20.0|30.0|40.0|50.0|60.0|70.0|80.0|90.0|100.0|110.0"] + + self.assertArrayEqual(collapsed_coord.points, expected) + + def test_string_nd_bounds_first(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str), bounds=self.bds_real.astype(str)) + + collapsed_coord = coord.collapsed(0) + + # Points handling is as for non bounded case. So just check bounds. + expected_lower = [ + "-2.0|38.0|78.0", + "8.0|48.0|88.0", + "18.0|58.0|98.0", + "28.0|68.0|108.0", + ] + + expected_upper = [ + "2.0|42.0|82.0", + "12.0|52.0|92.0", + "22.0|62.0|102.0", + "32.0|72.0|112.0", + ] + + self.assertArrayEqual(collapsed_coord.bounds[:, 0], expected_lower) + self.assertArrayEqual(collapsed_coord.bounds[:, 1], expected_upper) + + def test_string_nd_bounds_second(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str), bounds=self.bds_real.astype(str)) + + collapsed_coord = coord.collapsed(1) + + # Points handling is as for non bounded case. So just check bounds. + expected_lower = [ + "-2.0|8.0|18.0|28.0", + "38.0|48.0|58.0|68.0", + "78.0|88.0|98.0|108.0", + ] + + expected_upper = [ + "2.0|12.0|22.0|32.0", + "42.0|52.0|62.0|72.0", + "82.0|92.0|102.0|112.0", + ] + + self.assertArrayEqual(collapsed_coord.bounds[:, 0], expected_lower) + self.assertArrayEqual(collapsed_coord.bounds[:, 1], expected_upper) + + def test_string_nd_bounds_both(self): + self.setupTestArrays((3, 4)) + coord = AuxCoord(self.pts_real.astype(str), bounds=self.bds_real.astype(str)) + + collapsed_coord = coord.collapsed() + + # Points handling is as for non bounded case. So just check bounds. + expected_lower = ["-2.0|8.0|18.0|28.0|38.0|48.0|58.0|68.0|78.0|88.0|98.0|108.0"] + expected_upper = [ + "2.0|12.0|22.0|32.0|42.0|52.0|62.0|72.0|82.0|92.0|102.0|112.0" + ] + + self.assertArrayEqual(collapsed_coord.bounds[:, 0], expected_lower) + self.assertArrayEqual(collapsed_coord.bounds[:, 1], expected_upper) + class Test_is_compatible(tests.IrisTest): def setUp(self): @@ -1124,7 +1390,7 @@ def test_copy_coord(self, ignore_axis, copy_or_from, result, sample_coord): class Test___init____abstractmethod(tests.IrisTest): def test(self): - emsg = "Can't instantiate abstract class Coord with abstract method.* __init__" + emsg = "Can't instantiate abstract class Coord" with self.assertRaisesRegex(TypeError, emsg): _ = Coord(points=[0, 1]) diff --git a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py index caff08fb66..64246261ca 100644 --- a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py +++ b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py @@ -21,17 +21,14 @@ DimCoord, _DimensionalMetadata, ) -from iris.experimental.ugrid.mesh import Connectivity +from iris.mesh import Connectivity from iris.tests.stock import climatology_3d as cube_with_climatology from iris.tests.stock.mesh import sample_meshcoord class Test___init____abstractmethod(tests.IrisTest): def test(self): - emsg = ( - "Can't instantiate abstract class _DimensionalMetadata with " - "abstract methods __init__" - ) + emsg = "Can't instantiate abstract class _DimensionalMetadata" with self.assertRaisesRegex(TypeError, emsg): _ = _DimensionalMetadata(0) @@ -888,7 +885,7 @@ def test_meshcoord(self): "[...]+bounds shape(3,)>" ), "MeshCoord : longitude / (unknown)", - " mesh: ", + " mesh: ", " location: 'face'", " points: [3100, 3101, 3102]", " bounds: [", diff --git a/lib/iris/tests/unit/cube/test_Cube.py b/lib/iris/tests/unit/cube/test_Cube.py index 71ef401651..1f01efd90f 100644 --- a/lib/iris/tests/unit/cube/test_Cube.py +++ b/lib/iris/tests/unit/cube/test_Cube.py @@ -896,7 +896,7 @@ def _setup(self): self.cell_measure = CellMeasure([0, 1, 2, 0, 1, 2], long_name="bar") self.multi_dim_cube.add_cell_measure(self.cell_measure, 1) - self.mock_agg = mock.Mock(spec=Aggregator) + self.mock_agg = mock.Mock(spec=Aggregator, lazy_func=None) self.mock_agg.aggregate = mock.Mock(return_value=np.empty([4])) self.mock_agg.post_process = mock.Mock(side_effect=lambda x, y, z: x) @@ -938,6 +938,21 @@ def test_kwargs(self): ) _shared_utils.assert_masked_array_equal(expected_result, res_cube.data) + def test_lazy(self): + window = 2 + self.cube.data = da.ma.masked_array( + self.cube.data, mask=([True, False, False, False, True, False]) + ) + res_cube = self.cube.rolling_window("val", iris.analysis.MEAN, window, mdtol=0) + assert self.cube.has_lazy_data() + assert res_cube.has_lazy_data() + expected_result = ma.array( + [-99.0, 1.5, 2.5, -99.0, -99.0], + mask=[True, False, False, True, True], + dtype=np.float64, + ) + _shared_utils.assert_masked_array_equal(expected_result, res_cube.data) + def test_ancillary_variables_and_cell_measures_kept(self): res_cube = self.multi_dim_cube.rolling_window("val", self.mock_agg, 3) assert res_cube.ancillary_variables() == [self.ancillary_variable] @@ -1057,10 +1072,10 @@ def test_all_permutations(self): class Test_slices_over: @pytest.fixture(autouse=True) def _setup(self): - self.cube = stock.realistic_4d() + self.cube = stock.realistic_4d()[:, :7, :10, :10] # Define expected iterators for 1D and 2D test cases. self.exp_iter_1d = range(len(self.cube.coord("model_level_number").points)) - self.exp_iter_2d = np.ndindex(6, 70, 1, 1) + self.exp_iter_2d = np.ndindex(6, 7, 1, 1) # Define maximum number of interactions for particularly long # (and so time-consuming) iterators. self.long_iterator_max = 5 @@ -1096,7 +1111,7 @@ def test_1d_slice_nonexistent_dimension_given(self): _ = self.cube.slices_over(self.cube.ndim + 1) def test_2d_slice_coord_given(self): - # Slicing over these two dimensions returns 420 2D cubes, so only check + # Slicing over these two dimensions returns 42 2D cubes, so only check # cubes up to `self.long_iterator_max` to keep test runtime sensible. res = self.cube.slices_over( [self.cube.coord("time"), self.cube.coord("model_level_number")] @@ -1115,7 +1130,7 @@ def test_2d_slice_nonexistent_coord_given(self): ) def test_2d_slice_coord_name_given(self): - # Slicing over these two dimensions returns 420 2D cubes, so only check + # Slicing over these two dimensions returns 42 2D cubes, so only check # cubes up to `self.long_iterator_max` to keep test runtime sensible. res = self.cube.slices_over(["time", "model_level_number"]) for ct in range(self.long_iterator_max): @@ -1130,7 +1145,7 @@ def test_2d_slice_nonexistent_coord_name_given(self): _ = self.cube.slices_over(["time", "wibble"]) def test_2d_slice_dimension_given(self): - # Slicing over these two dimensions returns 420 2D cubes, so only check + # Slicing over these two dimensions returns 42 2D cubes, so only check # cubes up to `self.long_iterator_max` to keep test runtime sensible. res = self.cube.slices_over([0, 1]) for ct in range(self.long_iterator_max): @@ -1156,11 +1171,11 @@ def test_2d_slice_nonexistent_dimension_given(self): _ = self.cube.slices_over([0, self.cube.ndim + 1]) def test_multidim_slice_coord_given(self): - # Slicing over surface altitude returns 100x100 2D cubes, so only check + # Slicing over surface altitude returns 10x10 2D cubes, so only check # cubes up to `self.long_iterator_max` to keep test runtime sensible. res = self.cube.slices_over("surface_altitude") # Define special ndindex iterator for the different dims sliced over. - nditer = np.ndindex(1, 1, 100, 100) + nditer = np.ndindex(1, 1, 10, 10) for ct in range(self.long_iterator_max): indices = list(next(nditer)) # Replace the dimensions not iterated over with spanning slices. @@ -1213,6 +1228,22 @@ def create_cube(lon_min, lon_max, bounds=False): ), 2, ) + cube.add_cell_measure( + iris.coords.CellMeasure( + np.arange(0, n_lons * 3).reshape(3, -1), + "cell_area", + units="m2", + ), + data_dims=[1, 2], + ) + cube.add_ancillary_variable( + iris.coords.AncillaryVariable( + np.arange(0, n_lons * 3).reshape(3, -1), + "land_area_fraction", + units="%", + ), + data_dims=[1, 2], + ) if bounds: cube.coord("longitude").guess_bounds() cube.add_aux_coord( @@ -2328,7 +2359,7 @@ def test_fail_meshcoords_different_meshes(self): meshco_y = sample_meshcoord(axis="y") # Own (different) mesh meshco_y.mesh.long_name = "new_name" n_faces = meshco_x.shape[0] - with pytest.raises(ValueError, match="Mesh.* does not match"): + with pytest.raises(ValueError, match="MeshXY.* does not match"): Cube( np.zeros(n_faces), aux_coords_and_dims=[(meshco_x, 0), (meshco_y, 0)], diff --git a/lib/iris/tests/unit/cube/test_Cube__aggregated_by.py b/lib/iris/tests/unit/cube/test_Cube__aggregated_by.py index bd65ff6773..ae7a1cee7a 100644 --- a/lib/iris/tests/unit/cube/test_Cube__aggregated_by.py +++ b/lib/iris/tests/unit/cube/test_Cube__aggregated_by.py @@ -579,11 +579,14 @@ def get_result( if second_categorised: categorised_coord2 = AuxCoord(np.tile([0, 1, 2, 3, 4], 4), long_name="cat2") - categorised_coords = [categorised_coord1, categorised_coord2] + categorised_coords: AuxCoord | list[AuxCoord] = [ + categorised_coord1, + categorised_coord2, + ] else: categorised_coords = categorised_coord1 - aux_coords_and_dims = [ + aux_coords_and_dims: list[tuple[AuxCoord, int | tuple[int, ...]]] = [ (categorised_coord1, axes[0]), ] diff --git a/lib/iris/tests/unit/experimental/ugrid/load/__init__.py b/lib/iris/tests/unit/experimental/geovista/__init__.py similarity index 70% rename from lib/iris/tests/unit/experimental/ugrid/load/__init__.py rename to lib/iris/tests/unit/experimental/geovista/__init__.py index 3248db6e41..b2024ce97d 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/__init__.py +++ b/lib/iris/tests/unit/experimental/geovista/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.load` package.""" +"""Unit tests for the :mod:`iris.experimental.geovista` module.""" diff --git a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py new file mode 100644 index 0000000000..bf3132cb74 --- /dev/null +++ b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py @@ -0,0 +1,191 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the `iris.experimental.geovista.cube_to_polydata` function.""" + +from typing import ClassVar +from unittest.mock import Mock + +from geovista import Transform +import numpy as np +import pytest + +import iris.analysis.cartography +import iris.coord_systems +from iris.experimental.geovista import cube_to_polydata +from iris.tests.stock import lat_lon_cube, sample_2d_latlons +from iris.tests.stock.mesh import sample_mesh_cube + + +@pytest.fixture() +def cube_mesh(): + return sample_mesh_cube() + + +@pytest.fixture() +def cube_1d(): + sample_1d_cube = lat_lon_cube() + for coord in sample_1d_cube.dim_coords: + coord.coord_system = None + return sample_1d_cube + + +@pytest.fixture() +def cube_2d(): + return sample_2d_latlons() + + +@pytest.fixture() +def default_cs(): + return iris.coord_systems.GeogCS( + iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS + ) + + +class ParentClass: + MOCKED_OPERATION: ClassVar[str] + + @pytest.fixture() + def expected(self): + pass + + @pytest.fixture() + def operation(self): + pass + + @pytest.fixture() + def cube(self): + pass + + @pytest.fixture() + def cube_with_crs(self, default_cs, cube): + cube_crs = cube.copy() + for coord in cube_crs.coords(): + coord.coord_system = default_cs + return cube_crs + + @pytest.fixture() + def mocked_operation(self): + mocking = Mock() + setattr(Transform, self.MOCKED_OPERATION, mocking) + return mocking + + @staticmethod + def test_to_poly(expected, mocked_operation, cube): + cube_to_polydata(cube) + actual = mocked_operation.call_args.kwargs + for key, expected_value in expected.items(): + if hasattr(expected_value, "shape"): + np.testing.assert_array_equal(actual[key], expected_value) + else: + assert actual[key] == expected_value + + @staticmethod + def test_to_poly_crs(mocked_operation, default_cs, cube_with_crs): + cube_to_polydata(cube_with_crs) + actual = mocked_operation.call_args.kwargs + assert actual["crs"] == default_cs.as_cartopy_crs().proj4_init + + @staticmethod + def test_to_poly_kwargs(mocked_operation, cube): + kwargs = {"test": "test"} + cube_to_polydata(cube, **kwargs) + actual = mocked_operation.call_args.kwargs + assert actual["test"] == "test" + + +class Test2dToPoly(ParentClass): + MOCKED_OPERATION = "from_2d" + + @pytest.fixture() + def expected(self, cube_2d): + return { + "xs": cube_2d.coord(axis="X").contiguous_bounds(), + "ys": cube_2d.coord(axis="Y").contiguous_bounds(), + "data": cube_2d.data, + "name": f"{cube_2d.name()} / ({cube_2d.units})", + } + + @pytest.fixture() + def cube(self, cube_2d): + return cube_2d + + +class Test1dToPoly(ParentClass): + MOCKED_OPERATION = "from_1d" + + @pytest.fixture() + def expected(self, cube_1d): + return { + "xs": cube_1d.coord(axis="X").contiguous_bounds(), + "ys": cube_1d.coord(axis="Y").contiguous_bounds(), + "data": cube_1d.data, + "name": f"{cube_1d.name()} / ({cube_1d.units})", + } + + @pytest.fixture() + def cube(self, cube_1d): + return cube_1d + + +class TestMeshToPoly(ParentClass): + MOCKED_OPERATION = "from_unstructured" + + @pytest.fixture() + def expected(self, cube_mesh): + return { + "xs": cube_mesh.mesh.node_coords[0].points, + "ys": cube_mesh.mesh.node_coords[1].points, + "connectivity": cube_mesh.mesh.face_node_connectivity.indices_by_location(), + "data": cube_mesh.data[0], + "name": cube_mesh.name() + " / " + "(" + str(cube_mesh.units) + ")", + "start_index": 0, + } + + def test_if_1d(self, cube_mesh): + with pytest.raises( + NotImplementedError, + match=r"Cubes with a mesh must be one dimensional", + ): + cube_to_polydata(cube_mesh) + + @pytest.fixture() + def operation(self): + return "from_unstructured" + + @pytest.fixture() + def cube(self, cube_mesh): + return cube_mesh[0] + + @pytest.mark.skip(reason="Meshes do not support crs currently") + def test_to_poly_crs(self, expected, actual): + return NotImplemented + + +class TestExtras: + @pytest.fixture() + def cube_1d_2d(self, cube_2d): + my_cube = cube_2d.copy() + lat_coord = my_cube.aux_coords[0] + lat_coord_small = lat_coord[0] + lat_coord_small.bounds = None + lat_coord_small.points = np.arange(len(lat_coord_small.points)) + my_cube.remove_coord(lat_coord) + my_cube.add_aux_coord(lat_coord_small, 1) + return my_cube + + def test_not_1d_or_2d(self, cube_1d_2d): + with pytest.raises( + NotImplementedError, + match=r"Only 1D and 2D coordinates are supported", + ): + cube_to_polydata(cube_1d_2d) + + def test_no_mesh_or_2d(self, cube_1d): + cube = cube_1d[0] + with pytest.raises( + NotImplementedError, + match=r"Cube must have a mesh or have 2 dimensions", + ): + cube_to_polydata(cube) diff --git a/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py new file mode 100644 index 0000000000..57babfc764 --- /dev/null +++ b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py @@ -0,0 +1,153 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" + +from unittest.mock import MagicMock, Mock + +from geovista.common import VTK_CELL_IDS, VTK_POINT_IDS +import numpy as np +import pytest + +from iris.experimental.geovista import extract_unstructured_region +from iris.tests.stock import sample_2d_latlons +from iris.tests.stock.mesh import sample_mesh_cube + + +class TestRegionExtraction: + @pytest.fixture() + def cube_2d(self): + return sample_2d_latlons() + + @pytest.fixture(params=["face", "node"], autouse=True) + def cube_mesh(self, request): + self.cube_mesh = sample_mesh_cube(location=request.param, n_z=10) + + @pytest.fixture() + def cube_mesh_edge(self): + return sample_mesh_cube(location="edge") + + @pytest.fixture(autouse=True) + def mocked_polydata(self): + mock_polydata_scalars = { + VTK_CELL_IDS: np.arange(2), + VTK_POINT_IDS: np.arange(14), + } + polydata = MagicMock() + polydata.__getitem__.side_effect = mock_polydata_scalars.__getitem__ + polydata.GetNumberOfCells.return_value = 3 + polydata.GetNumberOfPoints.return_value = 15 + self.mocked_polydata = polydata + + @pytest.fixture(autouse=True) + def mocked_region(self): + region = Mock() + region.enclosed.return_value = self.mocked_polydata + self.mocked_region = region + + def test_called_with(self): + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + self.mocked_region.enclosed.assert_called_with(self.mocked_polydata) + + def test_kwarg(self): + extract_unstructured_region( + self.cube_mesh, + self.mocked_polydata, + self.mocked_region, + test="test", + ) + actual = self.mocked_region.enclosed.call_args.kwargs + assert actual["test"] == "test" + + @pytest.mark.parametrize( + "transpose_cube", [True, False], ids=["Transposed", "Not Transposed"] + ) + def test_indices(self, transpose_cube): + if transpose_cube: + self.cube_mesh.transpose() + extracted_region = extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + expected_length = len(self.mocked_polydata[VTK_CELL_IDS]) + else: + assert self.cube_mesh.location == "node" + expected_length = len(self.mocked_polydata[VTK_POINT_IDS]) + mesh_dim = self.cube_mesh.mesh_dim() + assert extracted_region.shape[mesh_dim] == expected_length + + def test_empty_indices(self): + mock_polydata_scalars = { + VTK_CELL_IDS: np.arange(0), + VTK_POINT_IDS: np.arange(0), + } + self.mocked_polydata.__getitem__.side_effect = mock_polydata_scalars.__getitem__ + with pytest.raises( + IndexError, match="No part of `polydata` falls within `region`." + ): + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + + def test_recreate_mesh(self): + extracted_region = extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + assert extracted_region.mesh is not None + else: + assert extracted_region.mesh is None + + def test_new_mesh_coords(self): + extracted_region = extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + mesh_coords = extracted_region.coords(mesh_coords=True) + np.testing.assert_array_equal( + mesh_coords[0].bounds, + [[1200, 1201, 1202, 1203], [1204, 1205, 1206, 1207]], + ) + np.testing.assert_array_equal(mesh_coords[0].points, [3200, 3201]) + np.testing.assert_array_equal( + mesh_coords[1].bounds, + [[1100, 1101, 1102, 1103], [1104, 1105, 1106, 1107]], + ) + np.testing.assert_array_equal(mesh_coords[1].points, [3100, 3101]) + + def test_no_mesh(self, cube_2d): + cube = cube_2d + with pytest.raises(ValueError, match="Cube must have a mesh"): + extract_unstructured_region(cube, self.mocked_polydata, self.mocked_region) + + def test_edge_location(self, cube_mesh_edge): + with pytest.raises( + NotImplementedError, + match=f"cube.location must be `face` or `node`." + f" Found: {cube_mesh_edge.location}.", + ): + extract_unstructured_region( + cube_mesh_edge, self.mocked_polydata, self.mocked_region + ) + + def test_cube_and_poly_shapes_mismatch(self): + self.mocked_polydata.GetNumberOfCells.return_value = 4 + self.mocked_polydata.GetNumberOfPoints.return_value = 16 + polydata_length = () + if self.cube_mesh.location == "face": + polydata_length = self.mocked_polydata.GetNumberOfCells() + elif self.cube_mesh.location == "node": + polydata_length = self.mocked_polydata.GetNumberOfPoints() + with pytest.raises( + ValueError, + match=f"The mesh on the cube and the polydata" + f"must have the same shape." + f" Found Mesh: {self.cube_mesh.shape[self.cube_mesh.mesh_dim()]}," + f" Polydata: {polydata_length}.", + ): + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py b/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py deleted file mode 100644 index 9577955f97..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridGroup` class. - -todo: fold these tests into cf tests when experimental.ugrid is folded into - standard behaviour. - -""" -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - -from unittest.mock import MagicMock - -from iris.experimental.ugrid.cf import ( - CFUGridAuxiliaryCoordinateVariable, - CFUGridConnectivityVariable, - CFUGridGroup, - CFUGridMeshVariable, -) -from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable - - -class Tests(tests.IrisTest): - def setUp(self): - self.cf_group = CFUGridGroup() - - def test_inherited(self): - coord_var = MagicMock(spec=CFCoordinateVariable, cf_name="coord_var") - self.cf_group[coord_var.cf_name] = coord_var - self.assertEqual(coord_var, self.cf_group.coordinates[coord_var.cf_name]) - - def test_connectivities(self): - conn_var = MagicMock(spec=CFUGridConnectivityVariable, cf_name="conn_var") - self.cf_group[conn_var.cf_name] = conn_var - self.assertEqual(conn_var, self.cf_group.connectivities[conn_var.cf_name]) - - def test_ugrid_coords(self): - coord_var = MagicMock( - spec=CFUGridAuxiliaryCoordinateVariable, cf_name="coord_var" - ) - self.cf_group[coord_var.cf_name] = coord_var - self.assertEqual(coord_var, self.cf_group.ugrid_coords[coord_var.cf_name]) - - def test_meshes(self): - mesh_var = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var") - self.cf_group[mesh_var.cf_name] = mesh_var - self.assertEqual(mesh_var, self.cf_group.meshes[mesh_var.cf_name]) - - def test_non_data_names(self): - data_var = MagicMock(spec=CFDataVariable, cf_name="data_var") - coord_var = MagicMock(spec=CFCoordinateVariable, cf_name="coord_var") - conn_var = MagicMock(spec=CFUGridConnectivityVariable, cf_name="conn_var") - ugrid_coord_var = MagicMock( - spec=CFUGridAuxiliaryCoordinateVariable, cf_name="ugrid_coord_var" - ) - mesh_var = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var") - mesh_var2 = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var2") - duplicate_name_var = MagicMock(spec=CFUGridMeshVariable, cf_name="coord_var") - - for var in ( - data_var, - coord_var, - conn_var, - ugrid_coord_var, - mesh_var, - mesh_var2, - duplicate_name_var, - ): - self.cf_group[var.cf_name] = var - - expected_names = [ - var.cf_name - for var in ( - coord_var, - conn_var, - ugrid_coord_var, - mesh_var, - mesh_var2, - ) - ] - expected = set(expected_names) - self.assertEqual(expected, self.cf_group.non_data_variable_names) diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py b/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py deleted file mode 100644 index cb2ae41d72..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridGroup` class. - -todo: fold these tests into cf tests when experimental.ugrid is folded into - standard behaviour. - -""" -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - -from unittest import mock - -from iris.experimental.ugrid.cf import ( - CFUGridAuxiliaryCoordinateVariable, - CFUGridConnectivityVariable, - CFUGridGroup, - CFUGridMeshVariable, - CFUGridReader, -) -from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable -from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable - - -def netcdf_ugrid_variable( - name, - dimensions, - dtype, - coordinates=None, -): - ncvar = netcdf_variable( - name=name, dimensions=dimensions, dtype=dtype, coordinates=coordinates - ) - - # Fill in all the extra UGRID attributes to prevent problems with getattr - # and Mock. Any attribute can be replaced in downstream setUp if present. - ugrid_attrs = ( - CFUGridAuxiliaryCoordinateVariable.cf_identities - + CFUGridConnectivityVariable.cf_identities - + [CFUGridMeshVariable.cf_identity] - ) - for attr in ugrid_attrs: - setattr(ncvar, attr, None) - - return ncvar - - -class Test_build_cf_groups(tests.IrisTest): - @classmethod - def setUpClass(cls): - # Replicating syntax from test_CFReader.Test_build_cf_groups__formula_terms. - cls.mesh = netcdf_ugrid_variable("mesh", "", int) - cls.node_x = netcdf_ugrid_variable("node_x", "node", float) - cls.node_y = netcdf_ugrid_variable("node_y", "node", float) - cls.face_x = netcdf_ugrid_variable("face_x", "face", float) - cls.face_y = netcdf_ugrid_variable("face_y", "face", float) - cls.face_nodes = netcdf_ugrid_variable("face_nodes", "face vertex", int) - cls.levels = netcdf_ugrid_variable("levels", "levels", int) - cls.data = netcdf_ugrid_variable( - "data", "levels face", float, coordinates="face_x face_y" - ) - - # Add necessary attributes for mesh recognition. - cls.mesh.cf_role = "mesh_topology" - cls.mesh.node_coordinates = "node_x node_y" - cls.mesh.face_coordinates = "face_x face_y" - cls.mesh.face_node_connectivity = "face_nodes" - cls.face_nodes.cf_role = "face_node_connectivity" - cls.data.mesh = "mesh" - - cls.variables = dict( - mesh=cls.mesh, - node_x=cls.node_x, - node_y=cls.node_y, - face_x=cls.face_x, - face_y=cls.face_y, - face_nodes=cls.face_nodes, - levels=cls.levels, - data=cls.data, - ) - ncattrs = mock.Mock(return_value=[]) - cls.dataset = mock.Mock( - file_format="NetCDF4", variables=cls.variables, ncattrs=ncattrs - ) - - def setUp(self): - # Restrict the CFUGridReader functionality to only performing - # translations and building first level cf-groups for variables. - self.patch("iris.experimental.ugrid.cf.CFUGridReader._reset") - self.patch( - "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper", - return_value=self.dataset, - ) - cf_reader = CFUGridReader("dummy") - self.cf_group = cf_reader.cf_group - - def test_inherited(self): - for expected_var, collection in ( - [CFCoordinateVariable("levels", self.levels), "coordinates"], - [CFDataVariable("data", self.data), "data_variables"], - ): - expected = {expected_var.cf_name: expected_var} - self.assertDictEqual(expected, getattr(self.cf_group, collection)) - - def test_connectivities(self): - expected_var = CFUGridConnectivityVariable("face_nodes", self.face_nodes) - expected = {expected_var.cf_name: expected_var} - self.assertDictEqual(expected, self.cf_group.connectivities) - - def test_mesh(self): - expected_var = CFUGridMeshVariable("mesh", self.mesh) - expected = {expected_var.cf_name: expected_var} - self.assertDictEqual(expected, self.cf_group.meshes) - - def test_ugrid_coords(self): - names = [f"{loc}_{ax}" for loc in ("node", "face") for ax in ("x", "y")] - expected = { - name: CFUGridAuxiliaryCoordinateVariable(name, getattr(self, name)) - for name in names - } - self.assertDictEqual(expected, self.cf_group.ugrid_coords) - - def test_is_cf_ugrid_group(self): - self.assertIsInstance(self.cf_group, CFUGridGroup) diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py b/lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py deleted file mode 100644 index 7ccdeee08b..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.load.ParseUgridOnLoad` class. - -todo: remove this module when experimental.ugrid is folded into standard behaviour. - -""" -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, ParseUGridOnLoad - - -class TestClass(tests.IrisTest): - @classmethod - def setUpClass(cls): - cls.cls = ParseUGridOnLoad() - - def test_default(self): - self.assertFalse(self.cls) - - def test_context(self): - self.assertFalse(self.cls) - with self.cls.context(): - self.assertTrue(self.cls) - self.assertFalse(self.cls) - - -class TestConstant(tests.IrisTest): - @classmethod - def setUpClass(cls): - cls.constant = PARSE_UGRID_ON_LOAD - - def test_default(self): - self.assertFalse(self.constant) - - def test_context(self): - self.assertFalse(self.constant) - with self.constant.context(): - self.assertTrue(self.constant) - self.assertFalse(self.constant) diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py b/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py deleted file mode 100644 index a8ad2bc014..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.metadata` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/test_ParseUgridOnLoad.py b/lib/iris/tests/unit/experimental/ugrid/test_ParseUgridOnLoad.py new file mode 100644 index 0000000000..62961157d8 --- /dev/null +++ b/lib/iris/tests/unit/experimental/ugrid/test_ParseUgridOnLoad.py @@ -0,0 +1,30 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :class:`iris.experimental.ugrid.ParseUgridOnLoad` class. + +TODO: remove this module when ParseUGridOnLoad itself is removed. + +""" + +import pytest + +from iris._deprecation import IrisDeprecation +from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD, ParseUGridOnLoad + + +def test_creation(): + # I.E. "does not fail". + _ = ParseUGridOnLoad() + + +def test_context(): + ugridswitch = ParseUGridOnLoad() + with pytest.warns(IrisDeprecation, match="PARSE_UGRID_ON_LOAD has been deprecated"): + with ugridswitch.context(): + pass + + +def test_constant(): + assert isinstance(PARSE_UGRID_ON_LOAD, ParseUGridOnLoad) diff --git a/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py b/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py deleted file mode 100644 index ea8202f8fb..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.utils` package.""" diff --git a/lib/iris/tests/unit/fileformats/cf/test_CFGroup.py b/lib/iris/tests/unit/fileformats/cf/test_CFGroup.py index a6c9bee6e8..d1efc5b0ba 100644 --- a/lib/iris/tests/unit/fileformats/cf/test_CFGroup.py +++ b/lib/iris/tests/unit/fileformats/cf/test_CFGroup.py @@ -12,6 +12,9 @@ CFCoordinateVariable, CFDataVariable, CFGroup, + CFUGridAuxiliaryCoordinateVariable, + CFUGridConnectivityVariable, + CFUGridMeshVariable, ) @@ -40,3 +43,68 @@ def test_non_data_names(self): expected_names = [var.cf_name for var in (aux_var, coord_var, coord_var2)] expected = set(expected_names) assert self.cf_group.non_data_variable_names == expected + + +class TestUgrid: + """Separate class to test UGRID functionality.""" + + @pytest.fixture(autouse=True) + def _setup(self): + self.cf_group = CFGroup() + + def test_inherited(self): + coord_var = MagicMock(spec=CFCoordinateVariable, cf_name="coord_var") + self.cf_group[coord_var.cf_name] = coord_var + assert self.cf_group.coordinates[coord_var.cf_name] == coord_var + + def test_connectivities(self): + conn_var = MagicMock(spec=CFUGridConnectivityVariable, cf_name="conn_var") + self.cf_group[conn_var.cf_name] = conn_var + assert self.cf_group.connectivities[conn_var.cf_name] == conn_var + + def test_ugrid_coords(self): + coord_var = MagicMock( + spec=CFUGridAuxiliaryCoordinateVariable, cf_name="coord_var" + ) + self.cf_group[coord_var.cf_name] = coord_var + assert self.cf_group.ugrid_coords[coord_var.cf_name] == coord_var + + def test_meshes(self): + mesh_var = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var") + self.cf_group[mesh_var.cf_name] = mesh_var + assert self.cf_group.meshes[mesh_var.cf_name] == mesh_var + + def test_non_data_names(self): + data_var = MagicMock(spec=CFDataVariable, cf_name="data_var") + coord_var = MagicMock(spec=CFCoordinateVariable, cf_name="coord_var") + conn_var = MagicMock(spec=CFUGridConnectivityVariable, cf_name="conn_var") + ugrid_coord_var = MagicMock( + spec=CFUGridAuxiliaryCoordinateVariable, cf_name="ugrid_coord_var" + ) + mesh_var = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var") + mesh_var2 = MagicMock(spec=CFUGridMeshVariable, cf_name="mesh_var2") + duplicate_name_var = MagicMock(spec=CFUGridMeshVariable, cf_name="coord_var") + + for var in ( + data_var, + coord_var, + conn_var, + ugrid_coord_var, + mesh_var, + mesh_var2, + duplicate_name_var, + ): + self.cf_group[var.cf_name] = var + + expected_names = [ + var.cf_name + for var in ( + coord_var, + conn_var, + ugrid_coord_var, + mesh_var, + mesh_var2, + ) + ] + expected = set(expected_names) + assert self.cf_group.non_data_variable_names == expected diff --git a/lib/iris/tests/unit/fileformats/cf/test_CFReader.py b/lib/iris/tests/unit/fileformats/cf/test_CFReader.py index c17a0df6f6..8a9aad48a0 100644 --- a/lib/iris/tests/unit/fileformats/cf/test_CFReader.py +++ b/lib/iris/tests/unit/fileformats/cf/test_CFReader.py @@ -8,7 +8,15 @@ import numpy as np import pytest -from iris.fileformats.cf import CFReader +from iris.fileformats.cf import ( + CFCoordinateVariable, + CFDataVariable, + CFGroup, + CFReader, + CFUGridAuxiliaryCoordinateVariable, + CFUGridConnectivityVariable, + CFUGridMeshVariable, +) def netcdf_variable( @@ -31,6 +39,12 @@ def netcdf_variable( ndim = len(dimensions) else: dimensions = [] + + ugrid_identities = ( + CFUGridAuxiliaryCoordinateVariable.cf_identities + + CFUGridConnectivityVariable.cf_identities + + [CFUGridMeshVariable.cf_identity] + ) ncvar = mock.Mock( name=name, dimensions=dimensions, @@ -45,6 +59,7 @@ def netcdf_variable( grid_mapping=grid_mapping, cell_measures=cell_measures, standard_name=standard_name, + **{name: None for name in ugrid_identities}, ) return ncvar @@ -279,7 +294,7 @@ def test_promote_reference(self): coordinates = ("lat", "lon") assert set(group.keys()) == set(coordinates) for name in coordinates: - assert group[name].cf_data is getattr(self, name) + assert group[name].cf_data == getattr(self, name) def test_formula_terms_ignore(self): self.orography.dimensions = ["lat", "wibble"] @@ -287,7 +302,7 @@ def test_formula_terms_ignore(self): cf_group = CFReader("dummy").cf_group group = cf_group.promoted assert list(group.keys()) == ["orography"] - assert group["orography"].cf_data is self.orography + assert group["orography"].cf_data == self.orography def test_auxiliary_ignore(self): self.x.dimensions = ["lat", "wibble"] @@ -297,7 +312,7 @@ def test_auxiliary_ignore(self): group = cf_group.promoted assert set(group.keys()) == set(promoted) for name in promoted: - assert group[name].cf_data is getattr(self, name) + assert group[name].cf_data == getattr(self, name) def test_promoted_auxiliary_ignore(self): self.wibble = netcdf_variable("wibble", "lat wibble", np.float64) @@ -308,6 +323,87 @@ def test_promoted_auxiliary_ignore(self): promoted = ["wibble", "orography"] assert set(cf_group.keys()) == set(promoted) for name in promoted: - assert cf_group[name].cf_data is getattr(self, name) - # we should have got 2 warnings - assert len(warns.list) == 2 + assert cf_group[name].cf_data == getattr(self, name) + # we should have got 2 warnings + assert len(warns.list) == 2 + + +class Test_build_cf_groups__ugrid: + @pytest.fixture(autouse=True) + def _setup_class(self, mocker): + # Replicating syntax from test_CFReader.Test_build_cf_groups__formula_terms. + self.mesh = netcdf_variable("mesh", "", int) + self.node_x = netcdf_variable("node_x", "node", float) + self.node_y = netcdf_variable("node_y", "node", float) + self.face_x = netcdf_variable("face_x", "face", float) + self.face_y = netcdf_variable("face_y", "face", float) + self.face_nodes = netcdf_variable("face_nodes", "face vertex", int) + self.levels = netcdf_variable("levels", "levels", int) + self.data = netcdf_variable( + "data", "levels face", float, coordinates="face_x face_y" + ) + + # Add necessary attributes for mesh recognition. + self.mesh.cf_role = "mesh_topology" + self.mesh.node_coordinates = "node_x node_y" + self.mesh.face_coordinates = "face_x face_y" + self.mesh.face_node_connectivity = "face_nodes" + self.face_nodes.cf_role = "face_node_connectivity" + self.data.mesh = "mesh" + + self.variables = dict( + mesh=self.mesh, + node_x=self.node_x, + node_y=self.node_y, + face_x=self.face_x, + face_y=self.face_y, + face_nodes=self.face_nodes, + levels=self.levels, + data=self.data, + ) + ncattrs = mock.Mock(return_value=[]) + self.dataset = mock.Mock( + file_format="NetCDF4", variables=self.variables, ncattrs=ncattrs + ) + + # @pytest.fixture(autouse=True) + # def _setup(self, mocker): + # Restrict the CFReader functionality to only performing + # translations and building first level cf-groups for variables. + mocker.patch("iris.fileformats.cf.CFReader._reset") + mocker.patch( + "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper", + return_value=self.dataset, + ) + cf_reader = CFReader("dummy") + self.cf_group = cf_reader.cf_group + + def test_inherited(self): + for expected_var, collection in ( + [CFCoordinateVariable("levels", self.levels), "coordinates"], + [CFDataVariable("data", self.data), "data_variables"], + ): + expected = {expected_var.cf_name: expected_var} + assert getattr(self.cf_group, collection) == expected + + def test_connectivities(self): + expected_var = CFUGridConnectivityVariable("face_nodes", self.face_nodes) + expected = {expected_var.cf_name: expected_var} + assert self.cf_group.connectivities == expected + + def test_mesh(self): + expected_var = CFUGridMeshVariable("mesh", self.mesh) + expected = {expected_var.cf_name: expected_var} + assert self.cf_group.meshes == expected + + def test_ugrid_coords(self): + names = [f"{loc}_{ax}" for loc in ("node", "face") for ax in ("x", "y")] + expected = { + name: CFUGridAuxiliaryCoordinateVariable(name, getattr(self, name)) + for name in names + } + assert self.cf_group.ugrid_coords == expected + + def test_is_cf_ugrid_group(self): + assert isinstance(self.cf_group, CFGroup) + diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py b/lib/iris/tests/unit/fileformats/cf/test_CFUGridAuxiliaryCoordinateVariable.py similarity index 93% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py rename to lib/iris/tests/unit/fileformats/cf/test_CFUGridAuxiliaryCoordinateVariable.py index 4a45e9a4df..d056de4aff 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py +++ b/lib/iris/tests/unit/fileformats/cf/test_CFUGridAuxiliaryCoordinateVariable.py @@ -2,12 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridAuxiliaryCoordinateVariable` class. +"""Unit tests for :class:`iris.fileformats.cf.CFUGridAuxiliaryCoordinateVariable`.""" -todo: fold these tests into cf tests when experimental.ugrid is folded into - standard behaviour. - -""" # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -18,16 +14,14 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridAuxiliaryCoordinateVariable -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( - netcdf_ugrid_variable, -) +from iris.fileformats.cf import CFUGridAuxiliaryCoordinateVariable +from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable import iris.warnings def named_variable(name): # Don't need to worry about dimensions or dtype for these tests. - return netcdf_ugrid_variable(name, "", int) + return netcdf_variable(name, "", int) class TestIdentify(tests.IrisTest): @@ -128,7 +122,7 @@ def test_string_type_ignored(self): ref_source = named_variable("ref_source") setattr(ref_source, self.cf_identities[0], subject_name) vars_all = { - subject_name: netcdf_ugrid_variable(subject_name, "", np.bytes_), + subject_name: netcdf_variable(subject_name, "", np.bytes_), "ref_not_subject": named_variable("ref_not_subject"), "ref_source": ref_source, } @@ -219,7 +213,7 @@ def operation(warn: bool): # String variable warning. warn_regex = r".*is a CF-netCDF label variable.*" - vars_all[subject_name] = netcdf_ugrid_variable(subject_name, "", np.bytes_) + vars_all[subject_name] = netcdf_variable(subject_name, "", np.bytes_) with pytest.warns(iris.warnings.IrisCfLabelVarWarning, match=warn_regex): operation(warn=True) with pytest.warns() as record: diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py b/lib/iris/tests/unit/fileformats/cf/test_CFUGridConnectivityVariable.py similarity index 92% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py rename to lib/iris/tests/unit/fileformats/cf/test_CFUGridConnectivityVariable.py index 5144729c7f..573e6f799f 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py +++ b/lib/iris/tests/unit/fileformats/cf/test_CFUGridConnectivityVariable.py @@ -2,12 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridConnectivityVariable` class. +"""Unit tests for :class:`iris.fileformats.cf.CFUGridConnectivityVariable`.""" -todo: fold these tests into cf tests when experimental.ugrid is folded into - standard behaviour. - -""" # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -18,17 +14,15 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridConnectivityVariable -from iris.experimental.ugrid.mesh import Connectivity -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( - netcdf_ugrid_variable, -) +from iris.fileformats.cf import CFUGridConnectivityVariable +from iris.mesh import Connectivity +from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable import iris.warnings def named_variable(name): # Don't need to worry about dimensions or dtype for these tests. - return netcdf_ugrid_variable(name, "", int) + return netcdf_variable(name, "", int) class TestIdentify(tests.IrisTest): @@ -117,7 +111,7 @@ def test_string_type_ignored(self): ref_source = named_variable("ref_source") setattr(ref_source, Connectivity.UGRID_CF_ROLES[0], subject_name) vars_all = { - subject_name: netcdf_ugrid_variable(subject_name, "", np.bytes_), + subject_name: netcdf_variable(subject_name, "", np.bytes_), "ref_not_subject": named_variable("ref_not_subject"), "ref_source": ref_source, } @@ -202,7 +196,7 @@ def operation(warn: bool): # String variable warning. warn_regex = r".*is a CF-netCDF label variable.*" - vars_all[subject_name] = netcdf_ugrid_variable(subject_name, "", np.bytes_) + vars_all[subject_name] = netcdf_variable(subject_name, "", np.bytes_) with pytest.warns(iris.warnings.IrisCfLabelVarWarning, match=warn_regex): operation(warn=True) with pytest.warns() as record: diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py b/lib/iris/tests/unit/fileformats/cf/test_CFUGridMeshVariable.py similarity index 94% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py rename to lib/iris/tests/unit/fileformats/cf/test_CFUGridMeshVariable.py index ef5447382a..5205c6a018 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py +++ b/lib/iris/tests/unit/fileformats/cf/test_CFUGridMeshVariable.py @@ -2,12 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridMeshVariable` class. +"""Unit tests for :class:`iris.fileformats.cf.CFUGridMeshVariable`.""" -todo: fold these tests into cf tests when experimental.ugrid is folded into - standard behaviour. - -""" # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -18,16 +14,14 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridMeshVariable -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( - netcdf_ugrid_variable, -) +from iris.fileformats.cf import CFUGridMeshVariable +from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable import iris.warnings def named_variable(name): # Don't need to worry about dimensions or dtype for these tests. - return netcdf_ugrid_variable(name, "", int) + return netcdf_variable(name, "", int) class TestIdentify(tests.IrisTest): @@ -164,7 +158,7 @@ def test_string_type_ignored(self): ref_source = named_variable("ref_source") setattr(ref_source, self.cf_identity, subject_name) vars_all = { - subject_name: netcdf_ugrid_variable(subject_name, "", np.bytes_), + subject_name: netcdf_variable(subject_name, "", np.bytes_), "ref_not_subject": named_variable("ref_not_subject"), "ref_source": ref_source, } @@ -249,7 +243,7 @@ def operation(warn: bool): # String variable warning. warn_regex = r".*is a CF-netCDF label variable.*" - vars_all[subject_name] = netcdf_ugrid_variable(subject_name, "", np.bytes_) + vars_all[subject_name] = netcdf_variable(subject_name, "", np.bytes_) with pytest.warns(iris.warnings.IrisCfLabelVarWarning, match=warn_regex): operation(warn=True) with pytest.warns() as record: diff --git a/lib/iris/tests/unit/fileformats/ff/test_FF2PP.py b/lib/iris/tests/unit/fileformats/ff/test_FF2PP.py index 4d031ac4a6..c21fc39821 100644 --- a/lib/iris/tests/unit/fileformats/ff/test_FF2PP.py +++ b/lib/iris/tests/unit/fileformats/ff/test_FF2PP.py @@ -85,13 +85,13 @@ def mock_for_extract_field(self, fields, x=None, y=None): ff2pp._ff_header.grid = mock.Mock(return_value=grid) open_func = "builtins.open" - with mock.patch( - "iris.fileformats._ff._parse_binary_stream", return_value=[0] - ), mock.patch(open_func), mock.patch( - "struct.unpack_from", return_value=[4] - ), mock.patch( - "iris.fileformats.pp.make_pp_field", side_effect=fields - ), mock.patch("iris.fileformats._ff.FF2PP._payload", return_value=(0, 0)): + with ( + mock.patch("iris.fileformats._ff._parse_binary_stream", return_value=[0]), + mock.patch(open_func), + mock.patch("struct.unpack_from", return_value=[4]), + mock.patch("iris.fileformats.pp.make_pp_field", side_effect=fields), + mock.patch("iris.fileformats._ff.FF2PP._payload", return_value=(0, 0)), + ): yield ff2pp def _mock_lbc(self, **kwargs): diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py index 845b88536a..7c79740023 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for the module :mod:`iris.fileformats._nc_load_rules.actions`.""" + from pathlib import Path import shutil import tempfile @@ -52,7 +53,7 @@ class Mixin__nc_load_actions: """ # "global" test setting : whether to output various debug info - debug = False + debug_info = False @classmethod def setUpClass(cls): @@ -84,7 +85,7 @@ def load_cube_from_cdl(self, cdl_string, cdl_path, nc_path): # If debug enabled, switch on the activation summary debug output. # Use 'patch' so it is restored after the test. - self.patch("iris.fileformats.netcdf.loader.DEBUG", self.debug) + self.patch("iris.fileformats.netcdf.loader.DEBUG", self.debug_info) with warnings.catch_warnings(): warnings.filterwarnings( @@ -124,7 +125,7 @@ def run_testcase(self, warning_regex=None, **testcase_kwargs): nc_path = cdl_path.replace(".cdl", ".nc") cdl_string = self._make_testcase_cdl(**testcase_kwargs) - if self.debug: + if self.debug_info: print("CDL file content:") print(cdl_string) print("------\n") @@ -136,10 +137,10 @@ def run_testcase(self, warning_regex=None, **testcase_kwargs): with context: cube = self.load_cube_from_cdl(cdl_string, cdl_path, nc_path) - if self.debug: + if self.debug_info: print("\nCube:") print(cube) - print("") + print() return cube def _make_testcase_cdl(self, **kwargs): diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__grid_mappings.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__grid_mappings.py index 72e9448255..8c2e30a902 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__grid_mappings.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__grid_mappings.py @@ -8,6 +8,7 @@ Here, *specifically* testcases relating to grid-mappings and dim-coords. """ + import iris.tests as tests # isort: skip import iris.coord_systems as ics diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__hybrid_formulae.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__hybrid_formulae.py index 5af6d6fa1d..65b0ecd94e 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__hybrid_formulae.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__hybrid_formulae.py @@ -8,6 +8,7 @@ Test rules activation relating to hybrid vertical coordinates. """ + import iris.tests as tests # isort: skip import iris.fileformats._nc_load_rules.helpers as hh diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py index e6a2c203b7..15401a2ca1 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py @@ -9,6 +9,9 @@ rotated and non-rotated. """ + +from typing import Literal + import iris.tests as tests # isort: skip from iris.coord_systems import GeogCS, RotatedGeogCS @@ -20,7 +23,7 @@ class Mixin_latlon_dimcoords(Mixin__nc_load_actions): # Control to test either longitude or latitude coords. # Set by inheritor classes, which are actual TestCases. - lat_1_or_lon_0 = None + lat_1_or_lon_0: Literal[0, 1] def setUp(self): super().setUp() @@ -129,10 +132,10 @@ def check_result( # It should also be a dim-coord self.assertEqual(1, len(cube.coords(dim_coords=True))) (coord,) = coords - if self.debug: - print("") + if self.debug_info: + print() print("DEBUG : result coord =", coord) - print("") + print() coord_stdname, coord_longname, coord_units, coord_crs = [ getattr(coord, name) diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__miscellaneous.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__miscellaneous.py index a7d5a10e73..15d8afe880 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__miscellaneous.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__miscellaneous.py @@ -12,6 +12,7 @@ * ancillary variables """ + import iris.tests as tests # isort: skip from iris.coords import AncillaryVariable, AuxCoord, CellMeasure diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__time_coords.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__time_coords.py index b3c2fe9b0b..4e58c3b1d3 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__time_coords.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__time_coords.py @@ -8,6 +8,9 @@ Tests for rules activation relating to 'time' and 'time_period' coords. """ + +from typing import ClassVar + import iris.tests as tests # isort: skip from iris.coords import AuxCoord, DimCoord @@ -215,7 +218,7 @@ def check_result(self, cube, time_is="dim", period_is="missing"): class Mixin__singlecoord__tests(Mixin__timecoords__common): # Coordinate tests to be run for both 'time' and 'period' coordinate vars. # Set (in inheritors) to select time/period testing. - which = None + which: ClassVar[str] def run_testcase(self, coord_dim_name=None, **opts): """Specialise 'run_testcase' for single-coord 'time' or 'period' testing.""" diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/engine/test_engine.py b/lib/iris/tests/unit/fileformats/nc_load_rules/engine/test_engine.py index 7aaca67326..71280e5f60 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/engine/test_engine.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/engine/test_engine.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris.fileformats._nc_load_rules.engine` module.""" + from unittest import mock from iris.fileformats._nc_load_rules.engine import Engine, FactEntity diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py index 73533a9c33..b43317901f 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py @@ -6,6 +6,7 @@ build_auxilliary_coordinate`. """ + # import iris tests first so that some things can be initialised before # importing anything else import iris.tests as tests # isort:skip diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_oblique_mercator_coordinate_system.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_oblique_mercator_coordinate_system.py index 3e12e33762..50b171655e 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_oblique_mercator_coordinate_system.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_oblique_mercator_coordinate_system.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Test function :func:`iris.fileformats._nc_load_rules.helpers.build_oblique_mercator_coordinate_system`.""" + from typing import List, NamedTuple, Type from unittest import mock diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py index 0f8fd0152f..528e9d7579 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py @@ -19,6 +19,7 @@ class Test(tests.IrisTest): def test_simple(self): cell_method_strings = [ "time: mean", + "time:mean", "time : mean", ] expected = (CellMethod(method="mean", coords="time"),) @@ -125,6 +126,7 @@ def test_badly_formatted_warning(self): cell_method_strings = [ # "time: maximum (interval: 1 hr comment: first bit " # "time: mean (interval: 1 day comment: second bit)", + "time", "time: (interval: 1 hr comment: first bit) " "time: mean (interval: 1 day comment: second bit)", "time: maximum (interval: 1 hr comment: first bit) " diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test__chunk_control.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test__chunk_control.py index bc7911578a..3051754423 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test__chunk_control.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test__chunk_control.py @@ -76,6 +76,15 @@ def test_default(tmp_filepath, save_cubelist_with_sigma): assert sigma.lazy_bounds().chunksize == (4, 2) +def test_netcdf_v3(): + # Just check that it does not fail when loading NetCDF v3 data + path = iris.tests.get_data_path( + ["NetCDF", "global", "xyt", "SMALL_total_column_co2.nc.k2"] + ) + with CHUNK_CONTROL.set(time=-1): + iris.load(path) + + def test_control_global(tmp_filepath, save_cubelist_with_sigma): cube_varname, _ = save_cubelist_with_sigma with CHUNK_CONTROL.set(model_level_number=2): @@ -133,8 +142,9 @@ def test_invalid_var_name(tmp_filepath, save_cubelist_with_sigma): def test_control_multiple(tmp_filepath, save_cubelist_with_sigma): cube_varname, sigma_varname = save_cubelist_with_sigma - with CHUNK_CONTROL.set(cube_varname, model_level_number=2), CHUNK_CONTROL.set( - sigma_varname, model_level_number=3 + with ( + CHUNK_CONTROL.set(cube_varname, model_level_number=2), + CHUNK_CONTROL.set(sigma_varname, model_level_number=3), ): cubes = CubeList(loader.load_cubes(tmp_filepath)) cube = cubes.extract_cube(cube_varname) @@ -193,7 +203,7 @@ def test_as_dask(tmp_filepath, save_cubelist_with_sigma): except RuntimeError as e: if str(e) != message: raise e - as_lazy_data.assert_called_with(ANY, chunks=None, dask_chunking=True) + as_lazy_data.assert_called_with(ANY, meta=ANY, chunks="auto") def test_pinned_optimisation(tmp_filepath, save_cubelist_with_sigma): diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py index 9aa696bccd..efa291a0b4 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py @@ -3,13 +3,14 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris.fileformats.netcdf._get_cf_var_data` function.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip from unittest import mock -from dask.array import Array as dask_array +import dask.array as da import numpy as np from iris._lazy_data import _optimum_chunksize @@ -49,7 +50,8 @@ def test_cf_data_type(self): chunks = [1, 12, 100] cf_var = self._make(chunks) lazy_data = _get_cf_var_data(cf_var, self.filename) - self.assertIsInstance(lazy_data, dask_array) + self.assertIsInstance(lazy_data, da.Array) + self.assertIsInstance(da.utils.meta_from_array(lazy_data), np.ma.MaskedArray) def test_cf_data_chunks(self): chunks = [2500, 240, 200] @@ -89,7 +91,7 @@ def test_cf_data_contiguous(self): def test_type__1kf8_is_lazy(self): cf_var = self._make(shape=(1000,), dtype="f8") var_data = _get_cf_var_data(cf_var, self.filename) - self.assertIsInstance(var_data, dask_array) + self.assertIsInstance(var_data, da.Array) def test_arraytype__1ki2_is_real(self): cf_var = self._make(shape=(1000,), dtype="i2") diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py index dfb1379d5a..09ee679adf 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py @@ -21,10 +21,9 @@ import numpy as np from iris.coords import AncillaryVariable, CellMeasure -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid.mesh import MeshCoord from iris.fileformats.netcdf import logger from iris.fileformats.netcdf.loader import load_cubes +from iris.mesh import MeshCoord from iris.tests.stock.netcdf import ncgen_from_cdl @@ -262,13 +261,7 @@ def setUpClass(cls): } """ cls.nc_path = cdl_to_nc(cls.ref_cdl) - with PARSE_UGRID_ON_LOAD.context(): - cls.mesh_cubes = list(load_cubes(cls.nc_path)) - - def test_mesh_handled(self): - cubes_no_ugrid = list(load_cubes(self.nc_path)) - self.assertEqual(4, len(cubes_no_ugrid)) - self.assertEqual(2, len(self.mesh_cubes)) + cls.mesh_cubes = list(load_cubes(cls.nc_path)) def test_standard_dims(self): for cube in self.mesh_cubes: @@ -303,7 +296,6 @@ def test_missing_mesh(self): # No error when mesh handling not activated. _ = list(load_cubes(nc_path)) - with PARSE_UGRID_ON_LOAD.context(): - log_regex = r"File does not contain mesh.*" - with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): - _ = list(load_cubes(nc_path)) + log_regex = r"File does not contain mesh.*" + with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): + _ = list(load_cubes(nc_path)) diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/__init__.py b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/__init__.py new file mode 100644 index 0000000000..993d106ba3 --- /dev/null +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/__init__.py @@ -0,0 +1,5 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.fileformats.netcdf.ugrid_load` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_mesh.py similarity index 69% rename from lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py rename to lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_mesh.py index 382a36fa71..0e618c7d55 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_mesh.py @@ -2,32 +2,33 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :func:`iris.experimental.ugrid.load.load_mesh` function.""" +"""Unit tests for the :func:`iris.mesh.load_mesh` function.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, load_mesh +from iris.fileformats.netcdf.ugrid_load import load_mesh class Tests(tests.IrisTest): # All 'real' tests have been done for load_meshes(). Here we just check # that load_mesh() works with load_meshes() correctly, using mocking. def setUp(self): - self.load_meshes_mock = self.patch("iris.experimental.ugrid.load.load_meshes") + tgt = "iris.fileformats.netcdf.ugrid_load.load_meshes" + self.load_meshes_mock = self.patch(tgt) # The expected return from load_meshes - a dict of files, each with # a list of meshes. self.load_meshes_mock.return_value = {"file": ["mesh"]} def test_calls_load_meshes(self): args = [("file_1", "file_2"), "my_var_name"] - with PARSE_UGRID_ON_LOAD.context(): - _ = load_mesh(args) - self.assertTrue(self.load_meshes_mock.called_with(args)) + _ = load_mesh(args) + assert self.load_meshes_mock.call_count == 1 + assert self.load_meshes_mock.call_args == ((args, None),) def test_returns_mesh(self): - with PARSE_UGRID_ON_LOAD.context(): - mesh = load_mesh([]) + mesh = load_mesh([]) self.assertEqual(mesh, "mesh") def test_single_mesh(self): @@ -35,8 +36,7 @@ def test_single_mesh(self): def common(ret_val): self.load_meshes_mock.return_value = ret_val with self.assertRaisesRegex(ValueError, "Expecting 1 mesh.*"): - with PARSE_UGRID_ON_LOAD.context(): - _ = load_mesh([]) + _ = load_mesh([]) # Too many. common({"file": ["mesh1", "mesh2"]}) diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_meshes.py similarity index 62% rename from lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py rename to lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_meshes.py index 8932989252..424c321098 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_load_meshes.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :func:`iris.experimental.ugrid.load.load_meshes` function.""" +"""Unit tests for the :func:`iris.mesh.load_meshes` function.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -12,7 +13,7 @@ import tempfile from uuid import uuid4 -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, load_meshes, logger +from iris.fileformats.netcdf.ugrid_load import load_meshes, logger from iris.tests.stock.netcdf import ncgen_from_cdl @@ -26,50 +27,58 @@ def tearDownModule(): rmtree(TMP_DIR) -def cdl_to_nc(cdl): - cdl_path = str(TMP_DIR / "tst.cdl") - nc_path = str(TMP_DIR / f"{uuid4()}.nc") +def cdl_to_nc(cdl, tmpdir=None): + if tmpdir is None: + tmpdir = TMP_DIR + cdl_path = str(tmpdir / "tst.cdl") + nc_path = str(tmpdir / f"{uuid4()}.nc") # Use ncgen to convert this into an actual (temporary) netCDF file. ncgen_from_cdl(cdl_str=cdl, cdl_path=cdl_path, nc_path=nc_path) return nc_path -class TestsBasic(tests.IrisTest): +_TEST_CDL_HEAD = """ +netcdf mesh_test { + dimensions: + node = 3 ; + face = 1 ; + vertex = 3 ; + levels = 2 ; + variables: + int mesh ; + mesh:cf_role = "mesh_topology" ; + mesh:topology_dimension = 2 ; + mesh:node_coordinates = "node_x node_y" ; + mesh:face_node_connectivity = "face_nodes" ; + float node_x(node) ; + node_x:standard_name = "longitude" ; + float node_y(node) ; + node_y:standard_name = "latitude" ; + int face_nodes(face, vertex) ; + face_nodes:cf_role = "face_node_connectivity" ; + face_nodes:start_index = 0 ; + int levels(levels) ; + float node_data(levels, node) ; + node_data:coordinates = "node_x node_y" ; + node_data:location = "node" ; + node_data:mesh = "mesh" ; +""" + +_TEST_CDL_TAIL = """ +data: + mesh = 0; + node_x = 0., 2., 1.; + node_y = 0., 0., 1.; + face_nodes = 0, 1, 2; + levels = 1, 2; + node_data = 0., 0., 0.; + } +""" + + +class TestLoadErrors(tests.IrisTest): def setUp(self): - self.ref_cdl = """ - netcdf mesh_test { - dimensions: - node = 3 ; - face = 1 ; - vertex = 3 ; - levels = 2 ; - variables: - int mesh ; - mesh:cf_role = "mesh_topology" ; - mesh:topology_dimension = 2 ; - mesh:node_coordinates = "node_x node_y" ; - mesh:face_node_connectivity = "face_nodes" ; - float node_x(node) ; - node_x:standard_name = "longitude" ; - float node_y(node) ; - node_y:standard_name = "latitude" ; - int face_nodes(face, vertex) ; - face_nodes:cf_role = "face_node_connectivity" ; - face_nodes:start_index = 0 ; - int levels(levels) ; - float node_data(levels, node) ; - node_data:coordinates = "node_x node_y" ; - node_data:location = "node" ; - node_data:mesh = "mesh" ; - data: - mesh = 0; - node_x = 0., 2., 1.; - node_y = 0., 0., 1.; - face_nodes = 0, 1, 2; - levels = 1, 2; - node_data = 0., 0., 0.; - } - """ + self.ref_cdl = _TEST_CDL_HEAD + _TEST_CDL_TAIL self.nc_path = cdl_to_nc(self.ref_cdl) def add_second_mesh(self): @@ -89,8 +98,7 @@ def add_second_mesh(self): def test_with_data(self): nc_path = cdl_to_nc(self.ref_cdl) - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_path) + meshes = load_meshes(nc_path) files = list(meshes.keys()) self.assertEqual(1, len(files)) @@ -105,8 +113,7 @@ def test_no_data(self): ref_cdl = "\n".join(cdl_lines) nc_path = cdl_to_nc(ref_cdl) - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_path) + meshes = load_meshes(nc_path) files = list(meshes.keys()) self.assertEqual(1, len(files)) @@ -126,23 +133,20 @@ def test_no_mesh(self): ref_cdl = "\n".join(cdl_lines) nc_path = cdl_to_nc(ref_cdl) - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_path) + meshes = load_meshes(nc_path) self.assertDictEqual({}, meshes) def test_multi_files(self): files_count = 3 nc_paths = [cdl_to_nc(self.ref_cdl) for _ in range(files_count)] - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_paths) + meshes = load_meshes(nc_paths) self.assertEqual(files_count, len(meshes)) def test_multi_meshes(self): ref_cdl, second_name = self.add_second_mesh() nc_path = cdl_to_nc(ref_cdl) - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_path) + meshes = load_meshes(nc_path) files = list(meshes.keys()) self.assertEqual(1, len(files)) @@ -156,8 +160,7 @@ def test_var_name(self): second_cdl, second_name = self.add_second_mesh() cdls = [self.ref_cdl, second_cdl] nc_paths = [cdl_to_nc(cdl) for cdl in cdls] - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes(nc_paths, second_name) + meshes = load_meshes(nc_paths, second_name) files = list(meshes.keys()) self.assertEqual(1, len(files)) @@ -165,26 +168,15 @@ def test_var_name(self): self.assertEqual(1, len(file_meshes)) self.assertEqual(second_name, file_meshes[0].var_name) - def test_no_parsing(self): - nc_path = cdl_to_nc(self.ref_cdl) - with self.assertRaisesRegex( - ValueError, ".*Must be True to enable mesh loading." - ): - _ = load_meshes(nc_path) - def test_invalid_scheme(self): with self.assertRaisesRegex(ValueError, "Iris cannot handle the URI scheme:.*"): - with PARSE_UGRID_ON_LOAD.context(): - _ = load_meshes("foo://bar") + _ = load_meshes("foo://bar") @tests.skip_data def test_non_nc(self): log_regex = r"Ignoring non-NetCDF file:.*" with self.assertLogs(logger, level="INFO", msg_regex=log_regex): - with PARSE_UGRID_ON_LOAD.context(): - meshes = load_meshes( - tests.get_data_path(["PP", "simple_pp", "global.pp"]) - ) + meshes = load_meshes(tests.get_data_path(["PP", "simple_pp", "global.pp"])) self.assertDictEqual({}, meshes) @@ -196,8 +188,7 @@ def setUp(self): def test_http(self): url = "https://foo" - with PARSE_UGRID_ON_LOAD.context(): - _ = load_meshes(url) + _ = load_meshes(url) self.format_agent_mock.assert_called_with(url, None) def test_mixed_sources(self): @@ -206,8 +197,7 @@ def test_mixed_sources(self): file.touch() glob = f"{TMP_DIR}/*.nc" - with PARSE_UGRID_ON_LOAD.context(): - _ = load_meshes([url, glob]) + _ = load_meshes([url, glob]) file_uris = [call[0][0] for call in self.format_agent_mock.call_args_list] for source in (url, Path(file).name): self.assertIn(source, file_uris) diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_meshload_checks.py b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_meshload_checks.py new file mode 100644 index 0000000000..ed98c8c3d4 --- /dev/null +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/ugrid_load/test_meshload_checks.py @@ -0,0 +1,80 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for mesh handling within iris netcdf loads.""" + +import pytest + +import iris + +from .test_load_meshes import ( + _TEST_CDL_HEAD, + _TEST_CDL_TAIL, + cdl_to_nc, +) + + +class TestMeshLoad: + def _create_testnc(self, location="node", meshdim="node"): + # Add an extra (possibly mal-formed) mesh data to the testfile. + if location is None: + location_cdl = "" + else: + location_cdl = f'extra_data:location = "{location}" ;' + + extra_cdl = f""" + float extra_data(levels, {meshdim}) ; + extra_data:coordinates = "node_x node_y" ; + {location_cdl} + extra_data:mesh = "mesh" ; + """ + # Insert this into the definitions part of the 'standard' testfile CDL + extended_cdl = _TEST_CDL_HEAD + extra_cdl + _TEST_CDL_TAIL + testfile_path = cdl_to_nc(extended_cdl, tmpdir=self.tmpdir) + return testfile_path + + @pytest.fixture(params=["nolocation", "badlocation", "baddim"]) + def failnc(self, request, tmp_path_factory): + self.param = request.param + kwargs = {} + if self.param == "nolocation": + kwargs["location"] = None + elif self.param == "badlocation": + kwargs["location"] = "invalid_location" + elif self.param == "baddim": + kwargs["meshdim"] = "vertex" + else: + raise ValueError(f"unexpected param: {self.param}") + + self.tmpdir = tmp_path_factory.mktemp("meshload") + return self._create_testnc(**kwargs) + + def test_extrameshvar__ok(self, tmp_path_factory): + # Check that the default cdl construction loads OK + self.tmpdir = tmp_path_factory.mktemp("meshload") + testnc = self._create_testnc() + iris.load(testnc) + + def test_extrameshvar__fail(self, failnc): + # Check that the expected errors are raised in various cases. + param = self.param + if param == "nolocation": + match_msg = ( + "mesh data variable 'extra_data' has an " "invalid location=''." + ) + elif param == "badlocation": + match_msg = ( + "mesh data variable 'extra_data' has an " + "invalid location='invalid_location'." + ) + elif param == "baddim": + match_msg = ( + "mesh data variable 'extra_data' does not have the node mesh " + "dimension 'node', in its dimensions." + ) + else: + raise ValueError(f"unexpected param: {param}") + + with pytest.raises(ValueError, match=match_msg): + iris.load(failnc) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py index 744051f02d..1c57323301 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py @@ -6,6 +6,8 @@ # Import iris.tests first so that some things can be initialised before # importing anything else. +from types import ModuleType + import iris.tests as tests # isort:skip import collections @@ -34,7 +36,6 @@ from iris.cube import Cube from iris.fileformats.netcdf import Saver, _thread_safe_nc import iris.tests.stock as stock -from iris.warnings import IrisMaskValueMatchWarning class Test_write(tests.IrisTest): @@ -44,7 +45,7 @@ class Test_write(tests.IrisTest): # ------------------------------------------------------------------------- # Attribute is substituted in test_Saver__lazy. - array_lib = np + array_lib: ModuleType = np def _transverse_mercator_cube(self, ellipsoid=None): data = self.array_lib.arange(12).reshape(3, 4) @@ -398,7 +399,7 @@ class Test_write__valid_x_cube_attributes(tests.IrisTest): """Testing valid_range, valid_min and valid_max attributes.""" # Attribute is substituted in test_Saver__lazy. - array_lib = np + array_lib: ModuleType = np def test_valid_range_saved(self): cube = tests.stock.lat_lon_cube() @@ -442,7 +443,7 @@ class Test_write__valid_x_coord_attributes(tests.IrisTest): """Testing valid_range, valid_min and valid_max attributes.""" # Attribute is substituted in test_Saver__lazy. - array_lib = np + array_lib: ModuleType = np def test_valid_range_saved(self): cube = tests.stock.lat_lon_cube() @@ -484,7 +485,7 @@ def test_valid_max_saved(self): class Test_write_fill_value(tests.IrisTest): # Attribute is substituted in test_Saver__lazy. - array_lib = np + array_lib: ModuleType = np def _make_cube(self, dtype, masked_value=None, masked_index=None): data = self.array_lib.arange(12, dtype=dtype).reshape(3, 4) @@ -548,76 +549,6 @@ def test_mask_default_fill_value(self): self.assertNotIn("_FillValue", var.ncattrs()) self.assertTrue(var[index].mask) - def test_contains_fill_value_passed(self): - # Test that a warning is raised if the data contains the fill value. - cube = self._make_cube(">f4") - fill_value = 1 - with self.assertWarnsRegex( - IrisMaskValueMatchWarning, - "contains unmasked data points equal to the fill-value", - ): - with self._netCDF_var(cube, fill_value=fill_value): - pass - - def test_contains_fill_value_byte(self): - # Test that a warning is raised if the data contains the fill value - # when it is of a byte type. - cube = self._make_cube(">i1") - fill_value = 1 - with self.assertWarnsRegex( - IrisMaskValueMatchWarning, - "contains unmasked data points equal to the fill-value", - ): - with self._netCDF_var(cube, fill_value=fill_value): - pass - - def test_contains_default_fill_value(self): - # Test that a warning is raised if the data contains the default fill - # value if no fill_value argument is supplied. - cube = self._make_cube(">f4") - cube.data[0, 0] = _thread_safe_nc.default_fillvals["f4"] - with self.assertWarnsRegex( - IrisMaskValueMatchWarning, - "contains unmasked data points equal to the fill-value", - ): - with self._netCDF_var(cube): - pass - - def test_contains_default_fill_value_byte(self): - # Test that no warning is raised if the data contains the default fill - # value if no fill_value argument is supplied when the data is of a - # byte type. - cube = self._make_cube(">i1") - with self.assertNoWarningsRegexp(r"\(fill\|mask\)"): - with self._netCDF_var(cube): - pass - - def test_contains_masked_fill_value(self): - # Test that no warning is raised if the data contains the fill_value at - # a masked point. - fill_value = 1 - cube = self._make_cube(">f4", masked_value=fill_value) - with self.assertNoWarningsRegexp(r"\(fill\|mask\)"): - with self._netCDF_var(cube, fill_value=fill_value): - pass - - def test_masked_byte_default_fill_value(self): - # Test that a warning is raised when saving masked byte data with no - # fill value supplied. - cube = self._make_cube(">i1", masked_value=1) - with self.assertNoWarningsRegexp(r"\(fill\|mask\)"): - with self._netCDF_var(cube): - pass - - def test_masked_byte_fill_value_passed(self): - # Test that no warning is raised when saving masked byte data with a - # fill value supplied if the the data does not contain the fill_value. - fill_value = 100 - cube = self._make_cube(">i1", masked_value=2) - with self.assertNoWarningsRegexp(r"\(fill\|mask\)"): - with self._netCDF_var(cube, fill_value=fill_value): - pass - class Test_cf_valid_var_name(tests.IrisTest): def test_no_replacement(self): @@ -642,7 +573,7 @@ def test_no_hyphen(self): class _Common__check_attribute_compliance: # Attribute is substituted in test_Saver__lazy. - array_lib = np + array_lib: ModuleType = np def setUp(self): self.container = mock.Mock(name="container", attributes={}) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py index c22b24eedc..5b04b3b042 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py @@ -6,6 +6,8 @@ # Import iris.tests first so that some things can be initialised before # importing anything else. +from types import ModuleType + import iris.tests as tests # isort:skip from dask import array as da @@ -17,7 +19,7 @@ class LazyMixin(tests.IrisTest): - array_lib = da + array_lib: ModuleType = da def result_path(self, basename=None, ext=""): # Precisely mirroring the tests in test_Saver, so use those CDL's. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py index c1bc411564..7c884e4c22 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py @@ -9,16 +9,16 @@ integration tests. """ + +from collections.abc import Iterator from unittest import mock -import warnings import dask.array as da import numpy as np import pytest import iris.fileformats.netcdf._thread_safe_nc as threadsafe_nc -from iris.fileformats.netcdf.saver import Saver, _FillvalueCheckInfo -from iris.warnings import IrisMaskValueMatchWarning +from iris.fileformats.netcdf.saver import Saver class Test__lazy_stream_data: @@ -43,13 +43,13 @@ def saver_patch(): # should make ***no difference to any of these tests***. @staticmethod @pytest.fixture(params=[False, True], ids=["nocompute", "compute"]) - def compute(request) -> bool: + def compute(request) -> Iterator[bool]: yield request.param # A fixture to parametrise tests over real and lazy-type data. @staticmethod @pytest.fixture(params=["realdata", "lazydata", "emulateddata"]) - def data_form(request) -> bool: + def data_form(request) -> Iterator[bool]: yield request.param @staticmethod @@ -88,10 +88,7 @@ def test_data_save(self, compute, data_form): cf_var = self.mock_var( data.shape, with_data_array=(data_form == "emulateddata") ) - fill_value = -1.0 # not occurring in data - saver._lazy_stream_data( - data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var - ) + saver._lazy_stream_data(data=data, cf_var=cf_var) if data_form == "lazydata": expect_n_setitem = 0 expect_n_delayed = 1 @@ -107,73 +104,11 @@ def test_data_save(self, compute, data_form): assert len(saver._delayed_writes) == expect_n_delayed if data_form == "lazydata": - result_data, result_writer, fill_info = saver._delayed_writes[0] + result_data, result_writer = saver._delayed_writes[0] assert result_data is data assert isinstance(result_writer, threadsafe_nc.NetCDFWriteProxy) - assert isinstance(fill_info, _FillvalueCheckInfo) elif data_form == "realdata": cf_var.__setitem__.assert_called_once_with(slice(None), data) else: assert data_form == "emulateddata" cf_var._data_array == mock.sentinel.exact_data_array - - def test_warnings(self, compute, data_form): - """For real data, fill-value warnings are issued immediately. - For lazy data, warnings are returned from computing a delayed completion. - For 'emulated' data (direct array transfer), no checks + no warnings ever. - - N.B. The 'compute' keyword has **no effect** on this : It only causes delayed - writes to be automatically actioned on exiting a Saver context. - Streaming *always* creates delayed writes for lazy data, since this is required - to make dask distributed operation work. - """ - saver = self.saver(compute=compute) - - data = np.arange(5.0) - if data_form == "lazydata": - data = da.from_array(data) - - fill_value = 2.0 # IS occurring in data - cf_var = self.mock_var( - data.shape, with_data_array=(data_form == "emulateddata") - ) - - # Do initial save. When compute=True, this issues warnings - with warnings.catch_warnings(record=True) as logged_warnings: - saver._lazy_stream_data( - data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var - ) - - # Check warnings issued by initial call. - issued_warnings = [log.message for log in logged_warnings] - if data_form == "lazydata": - n_expected_warnings = 0 - elif data_form == "realdata": - n_expected_warnings = 1 - else: - # No checks in the emulated case - assert data_form == "emulateddata" - n_expected_warnings = 0 - assert len(issued_warnings) == n_expected_warnings - - # Complete the write : any delayed warnings should be *returned*. - # NOTE: - # (1) this still works when there are no delayed writes. - # (2) the Saver 'compute' keyword makes no difference to this usage, as it - # *only* affects what happens when the saver context exits. - result2 = saver.delayed_completion().compute() - issued_warnings += list(result2) - - # Check warnings issued during 'completion'. - if data_form == "emulateddata": - # No checks in this case, ever. - n_expected_warnings = 0 - else: - # Otherwise, either way, a suitable warning should now have been produced. - n_expected_warnings = 1 - assert len(issued_warnings) == n_expected_warnings - if n_expected_warnings > 0: - warning = issued_warnings[0] - msg = "contains unmasked data points equal to the fill-value, 2.0" - assert isinstance(warning, IrisMaskValueMatchWarning) - assert msg in warning.args[0] diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py index 241ff5a5cc..7508376840 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py @@ -8,6 +8,7 @@ :mod:`iris.tests.unit.fileformats.netcdf.test_Saver__lazy.` """ + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -21,9 +22,8 @@ from iris import save from iris.coords import AuxCoord from iris.cube import Cube, CubeList -from iris.experimental.ugrid.mesh import Connectivity, Mesh -from iris.experimental.ugrid.save import save_mesh from iris.fileformats.netcdf import _thread_safe_nc +from iris.mesh import Connectivity, MeshXY, save_mesh from iris.tests.stock import realistic_4d XY_LOCS = ("x", "y") @@ -114,7 +114,7 @@ def apply_xyargs(coords, xyargs): connectivities[role] = conn applyargs(conn, kwargs) - mesh = Mesh( + mesh = MeshXY( topology_dimension=topology_dimension, node_coords_and_axes=zip(node_coords, XY_LOCS), edge_coords_and_axes=zip(edge_coords, XY_LOCS), @@ -195,7 +195,7 @@ def make_cube(mesh=None, location="face", **kwargs): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` or None, optional + mesh : :class:`iris.mesh.MeshXY` or None, optional If None, use 'default_mesh()' location : str, optional, default="face" Which mesh element to map the cube to. @@ -507,9 +507,9 @@ def test_multi_cubes_equal_meshes(self): self.assertEqual(props["location"], "face") self.assertEqual(props["coordinates"], "face_x face_y") - # the data variables map the appropriate node dimensions + # the data variables map the appropriate node dimension self.assertEqual(a_props[_VAR_DIMS], ["Mesh2d_faces"]) - self.assertEqual(b_props[_VAR_DIMS], ["Mesh2d_faces_0"]) + self.assertEqual(b_props[_VAR_DIMS], ["Mesh2d_faces"]) def test_multi_cubes_different_mesh(self): # Check that we can correctly distinguish 2 different meshes. @@ -718,7 +718,7 @@ def test_connectivity_dim_order(self): nodesfirst_faces_conn = face_nodes_conn.transpose() nodesfirst_edges_conn = edge_nodes_conn.transpose() # Make a new mesh with both face and edge connectivities 'transposed'. - mesh2 = Mesh( + mesh2 = MeshXY( topology_dimension=mesh.topology_dimension, node_coords_and_axes=zip(mesh.node_coords, XY_LOCS), face_coords_and_axes=zip(mesh.face_coords, XY_LOCS), @@ -767,7 +767,7 @@ def test_connectivity_start_index(self): start_index=1, ) # Make a new mesh with altered connectivities. - mesh2 = Mesh( + mesh2 = MeshXY( topology_dimension=mesh.topology_dimension, node_coords_and_axes=zip(mesh.node_coords, XY_LOCS), face_coords_and_axes=zip(mesh.face_coords, XY_LOCS), @@ -869,7 +869,7 @@ def test_one_dimensional(self): def test_location_coord_units(self): # Check that units on mesh locations are handled correctly. - # NOTE: at present, the Mesh class cannot handle coordinates that are + # NOTE: at present, the MeshXY class cannot handle coordinates that are # not recognised by 'guess_coord_axis' == suitable standard names mesh = make_mesh( nodecoord_xyargs=( @@ -953,7 +953,7 @@ def test_mesh_names(self): (None, None, "meshvar_x"), (None, None, "meshvar_x"), ), - # standard_name only : does not apply to Mesh + # standard_name only : does not apply to MeshXY ( ("air_temperature", None, None), ("air_temperature", None, "Mesh_2d"), @@ -1016,7 +1016,7 @@ def test_location_coord_names(self): # N.B. this is basically centralised in Saver._get_mesh_variable_name, # but we test in an implementation-neutral way (as it's fairly easy). - # Options here are limited because the Mesh relies on guess_axis so, + # Options here are limited because the MeshXY relies on guess_axis so, # for now anyway, coords *must* have a known X/Y-type standard-name coord_names_tests = [ # standard_name only @@ -1040,7 +1040,7 @@ def test_location_coord_names(self): ("projection_x_coordinate", "long name", "x_var_name"), ), # # no standard name ? - # # not possible at present, as Mesh requires a recognisable + # # not possible at present, as MeshXY requires a recognisable # # standard_name to identify the axis of a location-coord. # # TODO: test this if+when Mesh usage is relaxed # ( @@ -1171,7 +1171,50 @@ def test_connectivity_names(self): ) self.assertEqual(expected_names, result_names, fail_msg) - def _check_two_different_meshes(self, vars): + def test_multiple_equal_mesh(self): + mesh1 = make_mesh() + mesh2 = make_mesh() + + # Save and snapshot the result + tempfile_path = self.check_save_mesh([mesh1, mesh2]) + dims, vars = scan_dataset(tempfile_path) + + # In this case there should be only *one* mesh. + mesh_names = vars_meshnames(vars) + self.assertEqual(1, len(mesh_names)) + + # Check it has the correct number of coords + conns (no duplicates) + # Should have 2 each X and Y coords (face+node): _no_ edge coords. + coord_vars_x = vars_w_props(vars, standard_name="longitude") + coord_vars_y = vars_w_props(vars, standard_name="latitude") + self.assertEqual(2, len(coord_vars_x)) + self.assertEqual(2, len(coord_vars_y)) + + # Check the connectivities are all present: _only_ 1 var of each type. + for conn in mesh1.all_connectivities: + if conn is not None: + conn_vars = vars_w_props(vars, cf_role=conn.cf_role) + self.assertEqual(1, len(conn_vars)) + + def test_multiple_different_meshes(self): + # Create 2 meshes with different faces, but same edges. + # N.B. they should then share an edge dimension. + mesh1 = make_mesh(n_faces=3, n_edges=2) + mesh2 = make_mesh(n_faces=4, n_edges=2) + + # Save and snapshot the result + tempfile_path = self.check_save_mesh([mesh1, mesh2]) + dims, vars = scan_dataset(tempfile_path) + + # Check the dims are as expected + self.assertEqual(dims["Mesh2d_faces"], 3) + self.assertEqual(dims["Mesh2d_faces_0"], 4) + # There are no 'second' edge and node dims + self.assertEqual(dims["Mesh2d_nodes"], 5) + self.assertEqual(dims["Mesh2d_edge"], 2) + + # Check there are two independent meshes in the file... + # there are exactly 2 meshes in the file mesh_names = vars_meshnames(vars) self.assertEqual(sorted(mesh_names), ["Mesh2d", "Mesh2d_0"]) @@ -1187,7 +1230,7 @@ def _check_two_different_meshes(self, vars): # mesh2 self.assertEqual( - vars_meshdim(vars, "node", mesh_name="Mesh2d_0"), "Mesh2d_nodes_0" + vars_meshdim(vars, "node", mesh_name="Mesh2d_0"), "Mesh2d_nodes" ) self.assertEqual( vars_meshdim(vars, "face", mesh_name="Mesh2d_0"), "Mesh2d_faces_0" @@ -1195,7 +1238,7 @@ def _check_two_different_meshes(self, vars): if "edge_coordinates" in vars["Mesh2d_0"]: self.assertEqual( vars_meshdim(vars, "edge", mesh_name="Mesh2d_0"), - "Mesh2d_edge_0", + "Mesh2d_edge", ) # the relevant coords + connectivities are also distinct @@ -1214,63 +1257,19 @@ def _check_two_different_meshes(self, vars): ) # mesh2 - self.assertEqual(vars["node_x_0"][_VAR_DIMS], ["Mesh2d_nodes_0"]) + self.assertEqual(vars["node_x_0"][_VAR_DIMS], ["Mesh2d_nodes"]) self.assertEqual(vars["face_x_0"][_VAR_DIMS], ["Mesh2d_faces_0"]) self.assertEqual( vars["mesh2d_faces_0"][_VAR_DIMS], ["Mesh2d_faces_0", "Mesh2d_0_face_N_nodes"], ) if "edge_coordinates" in vars["Mesh2d_0"]: - self.assertEqual(vars["longitude_0"][_VAR_DIMS], ["Mesh2d_edge_0"]) + self.assertEqual(vars["longitude_0"][_VAR_DIMS], ["Mesh2d_edge"]) self.assertEqual( vars["mesh2d_edge_0"][_VAR_DIMS], - ["Mesh2d_edge_0", "Mesh2d_0_edge_N_nodes"], + ["Mesh2d_edge", "Mesh2d_0_edge_N_nodes"], ) - def test_multiple_equal_mesh(self): - mesh1 = make_mesh() - mesh2 = make_mesh() - - # Save and snapshot the result - tempfile_path = self.check_save_mesh([mesh1, mesh2]) - dims, vars = scan_dataset(tempfile_path) - - # In this case there should be only *one* mesh. - mesh_names = vars_meshnames(vars) - self.assertEqual(1, len(mesh_names)) - - # Check it has the correct number of coords + conns (no duplicates) - # Should have 2 each X and Y coords (face+node): _no_ edge coords. - coord_vars_x = vars_w_props(vars, standard_name="longitude") - coord_vars_y = vars_w_props(vars, standard_name="latitude") - self.assertEqual(2, len(coord_vars_x)) - self.assertEqual(2, len(coord_vars_y)) - - # Check the connectivities are all present: _only_ 1 var of each type. - for conn in mesh1.all_connectivities: - if conn is not None: - conn_vars = vars_w_props(vars, cf_role=conn.cf_role) - self.assertEqual(1, len(conn_vars)) - - def test_multiple_different_meshes(self): - # Create 2 meshes with different faces, but same edges. - # N.B. they should *not* then share an edge dimension ! - mesh1 = make_mesh(n_faces=3, n_edges=2) - mesh2 = make_mesh(n_faces=4, n_edges=2) - - # Save and snapshot the result - tempfile_path = self.check_save_mesh([mesh1, mesh2]) - dims, vars = scan_dataset(tempfile_path) - - # Check there are two independent meshes - self._check_two_different_meshes(vars) - - # Check the dims are as expected - self.assertEqual(dims["Mesh2d_faces"], 3) - self.assertEqual(dims["Mesh2d_faces_0"], 4) - self.assertEqual(dims["Mesh2d_edge"], 2) - self.assertEqual(dims["Mesh2d_edge_0"], 2) - # WHEN MODIFYING THIS MODULE, CHECK IF ANY CORRESPONDING CHANGES ARE NEEDED IN # :mod:`iris.tests.unit.fileformats.netcdf.test_Saver__lazy.` diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py deleted file mode 100644 index 9fb7485734..0000000000 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for :func:`iris.fileformats.netcdf.saver._data_fillvalue_check`. - -Note: now runs all testcases on both real + lazy data. - -""" - -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip -import collections - -import dask.array as da -import numpy as np - -from iris.fileformats.netcdf.saver import _data_fillvalue_check - - -class Check__fillvalueandmasking: - def _call_target(self, fill_value, keys, vals): - data = np.zeros(20, dtype=np.float32) - if any(np.ma.isMaskedArray(val) for val in vals): - # N.B. array is masked if "vals" is, but has no masked points initially. - data = np.ma.masked_array(data, mask=np.zeros_like(data)) - - for key, val in zip(keys, vals): - data[key] = val - - if hasattr(self.arraylib, "compute"): - data = da.from_array(data, chunks=-1) - - results = _data_fillvalue_check( - arraylib=self.arraylib, data=data, check_value=fill_value - ) - - if hasattr(results, "compute"): - results = results.compute() - - # Return a named tuple, for named-property access to the 2 result values. - result = collections.namedtuple("_", ["is_masked", "contains_value"])(*results) - return result - - def test_no_fill_value_not_masked(self): - # Test when the fill value is not present and the data is not masked - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.arange(5)] - fill_value = 16 - target = self._call_target(fill_value, keys, vals) - self.assertFalse(target.contains_value) - self.assertFalse(target.is_masked) - - def test_contains_fill_value_not_masked(self): - # Test when the fill value is present and the data is not masked - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.arange(5)] - fill_value = 5 - target = self._call_target(fill_value, keys, vals) - self.assertTrue(target.contains_value) - self.assertFalse(target.is_masked) - - def test_no_fill_value_masked(self): - # Test when the fill value is not present and the data is masked - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.ma.masked_equal(np.arange(5), 3)] - fill_value = 16 - target = self._call_target(fill_value, keys, vals) - self.assertFalse(target.contains_value) - self.assertTrue(target.is_masked) - - def test_contains_fill_value_masked(self): - # Test when the fill value is present and the data is masked - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.ma.masked_equal(np.arange(5), 3)] - fill_value = 5 - target = self._call_target(fill_value, keys, vals) - self.assertTrue(target.contains_value) - self.assertTrue(target.is_masked) - - def test_fill_value_None(self): - # Test when the fill value is None - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.arange(5)] - fill_value = None - target = self._call_target(fill_value, keys, vals) - self.assertFalse(target.contains_value) - - def test_contains_masked_fill_value(self): - # Test when the fill value is present but masked the data is masked - keys = [slice(0, 10), slice(10, 15)] - vals = [np.arange(10), np.ma.masked_equal(np.arange(10, 15), 13)] - fill_value = 13 - target = self._call_target(fill_value, keys, vals) - self.assertFalse(target.contains_value) - self.assertTrue(target.is_masked) - - -class Test__real(Check__fillvalueandmasking, tests.IrisTest): - arraylib = np - - -class Test__lazy(Check__fillvalueandmasking, tests.IrisTest): - arraylib = da diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py deleted file mode 100644 index 0b37070241..0000000000 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for :func:`iris.fileformats.netcdf.saver._fillvalue_report`.""" -import warnings - -import numpy as np -import pytest - -from iris.fileformats.netcdf._thread_safe_nc import default_fillvals -from iris.fileformats.netcdf.saver import _fillvalue_report, _FillvalueCheckInfo -from iris.warnings import IrisSaverFillValueWarning - - -class Test__fillvaluereport: - @pytest.mark.parametrize("is_bytes", [True, False], ids=["ByteData", "NonbyteData"]) - @pytest.mark.parametrize( - "is_masked", [True, False], ids=["MaskedData", "NonmaskedData"] - ) - @pytest.mark.parametrize( - "contains_fv", [True, False], ids=["FillInData", "NofillInData"] - ) - @pytest.mark.parametrize( - "given_user_fv", [True, False], ids=["WithUserfill", "NoUserfill"] - ) - def test_fillvalue_checking(self, is_bytes, is_masked, contains_fv, given_user_fv): - dtype_code = "u1" if is_bytes else "f4" - dtype = np.dtype(dtype_code) - if given_user_fv: - user_fill = 123 if is_bytes else 1.234 - check_value = user_fill - else: - user_fill = None - check_value = default_fillvals[dtype_code] - - fill_info = _FillvalueCheckInfo( - user_value=user_fill, - check_value=check_value, - dtype=dtype, - varname="", - ) - - # Work out expected action, according to intended logic. - if is_bytes and is_masked and not given_user_fv: - msg_fragment = "'' contains byte data with masked points" - elif contains_fv: - msg_fragment = ( - "'' contains unmasked data points equal to the fill-value" - ) - else: - msg_fragment = None - - # Trial the action - result = _fillvalue_report( - fill_info, - is_masked=is_masked, - contains_fill_value=contains_fv, - warn=False, - ) - - # Check the result - if msg_fragment is None: - assert result is None - else: - assert isinstance(result, Warning) - assert msg_fragment in result.args[0] - - @pytest.mark.parametrize( - "has_collision", - [True, False], - ids=["WithFvCollision", "NoFvCollision"], - ) - def test_warn(self, has_collision): - fill_info = _FillvalueCheckInfo( - user_value=1.23, - check_value=1.23, - dtype=np.float32, - varname="", - ) - - # Check results - if has_collision: - # Check that we get the expected warning - expected_msg = ( - "'' contains unmasked data points equal to the fill-value" - ) - # Enter a warnings context that checks for the error. - warning_context = pytest.warns( - IrisSaverFillValueWarning, match=expected_msg - ) - warning_context.__enter__() - else: - # Check that we get NO warning of the expected type. - warnings.filterwarnings("error", category=IrisSaverFillValueWarning) - - # Do call: it should raise AND return a warning, ONLY IF there was a collision. - result = _fillvalue_report( - fill_info, - is_masked=True, - contains_fill_value=has_collision, - warn=True, - ) - - # Check result - if has_collision: - # Fail if no warning was raised .. - warning_context.__exit__(None, None, None) - # .. or result does not have the expected message content - assert expected_msg in result.args[0] - else: - # Fail if any warning result was produced. - assert result is None diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py index 1f0a39f050..860da84e6b 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for the :func:`iris.fileformats.netcdf.save` function.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -18,7 +19,6 @@ import iris from iris.coords import AuxCoord, DimCoord from iris.cube import Cube, CubeList -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD from iris.fileformats.netcdf import CF_CONVENTIONS_VERSION, Saver, _thread_safe_nc, save from iris.tests.stock import lat_lon_cube from iris.tests.stock.mesh import sample_mesh_cube @@ -245,8 +245,7 @@ def _check_save_and_reload(self, cubes): save(cubes, filepath) # Load them back for roundtrip testing. - with PARSE_UGRID_ON_LOAD.context(): - new_cubes = iris.load(str(filepath)) + new_cubes = iris.load(str(filepath)) # There should definitely still be the same number of cubes. self.assertEqual(len(new_cubes), len(cubes)) diff --git a/lib/iris/tests/unit/fileformats/pp/test_PPField.py b/lib/iris/tests/unit/fileformats/pp/test_PPField.py index f3aed0bea2..e3d782b156 100644 --- a/lib/iris/tests/unit/fileformats/pp/test_PPField.py +++ b/lib/iris/tests/unit/fileformats/pp/test_PPField.py @@ -98,8 +98,8 @@ def field_checksum(data): def test_masked_mdi_value_warning(self): # Check that an unmasked MDI value raises a warning. field = DummyPPField()._ready_for_save() - field.bmdi = -123.4 # Make float32 data, as float64 default produces an extra warning. + field.bmdi = np.float32(-123.4) field.data = np.ma.masked_array([1.0, field.bmdi, 3.0], dtype=np.float32) msg = "PPField data contains unmasked points" with self.assertWarnsRegex(IrisMaskValueMatchWarning, msg): diff --git a/lib/iris/tests/unit/fileformats/pp/test__create_field_data.py b/lib/iris/tests/unit/fileformats/pp/test__create_field_data.py index ab80332186..266502253a 100644 --- a/lib/iris/tests/unit/fileformats/pp/test__create_field_data.py +++ b/lib/iris/tests/unit/fileformats/pp/test__create_field_data.py @@ -55,6 +55,7 @@ def test_deferred_bytes(self): data_shape = (100, 120) proxy = mock.Mock( dtype=np.dtype("f4"), + dask_meta=np.empty((0,) * len(data_shape), dtype=np.dtype("f4")), shape=data_shape, spec=pp.PPDataProxy, ndim=len(data_shape), diff --git a/lib/iris/tests/unit/fileformats/pp/test__field_gen.py b/lib/iris/tests/unit/fileformats/pp/test__field_gen.py index 80b90fc8d2..f1018d8df4 100644 --- a/lib/iris/tests/unit/fileformats/pp/test__field_gen.py +++ b/lib/iris/tests/unit/fileformats/pp/test__field_gen.py @@ -34,11 +34,14 @@ def make_pp_field_override(*args): return result open_func = "builtins.open" - with mock.patch("numpy.fromfile", return_value=[0]), mock.patch( - open_func - ), mock.patch("struct.unpack_from", return_value=[4]), mock.patch( - "iris.fileformats.pp.make_pp_field", - side_effect=make_pp_field_override, + with ( + mock.patch("numpy.fromfile", return_value=[0]), + mock.patch(open_func), + mock.patch("struct.unpack_from", return_value=[4]), + mock.patch( + "iris.fileformats.pp.make_pp_field", + side_effect=make_pp_field_override, + ), ): yield diff --git a/lib/iris/tests/unit/fileformats/pp_load_rules/test__all_other_rules.py b/lib/iris/tests/unit/fileformats/pp_load_rules/test__all_other_rules.py index 9fdc96abf1..2220929395 100644 --- a/lib/iris/tests/unit/fileformats/pp_load_rules/test__all_other_rules.py +++ b/lib/iris/tests/unit/fileformats/pp_load_rules/test__all_other_rules.py @@ -108,6 +108,9 @@ def test_multiple_unordered_lbprocs(self, mocker): x_bounds=None, _x_coord_name=lambda: "longitude", _y_coord_name=lambda: "latitude", + # Not under test but needed for the Mock to play nicely. + bzy=1, + bdy=1, ) res = _all_other_rules(field)[CELL_METHODS_INDEX] expected = [ @@ -128,6 +131,9 @@ def test_multiple_unordered_rotated_lbprocs(self, mocker): x_bounds=None, _x_coord_name=lambda: "grid_longitude", _y_coord_name=lambda: "grid_latitude", + # Not under test but needed for the Mock to play nicely. + bzy=1, + bdy=1, ) res = _all_other_rules(field)[CELL_METHODS_INDEX] expected = [ diff --git a/lib/iris/tests/unit/fileformats/test_load_functions.py b/lib/iris/tests/unit/fileformats/test_load_functions.py new file mode 100644 index 0000000000..3c3d361080 --- /dev/null +++ b/lib/iris/tests/unit/fileformats/test_load_functions.py @@ -0,0 +1,231 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for iris load functions. + +* :func:`iris.load` +* :func:`iris.load_cube` +* :func:`iris.load_cubes` +* :func:`iris.load_raw` +""" + +import re +from typing import Iterable +from unittest import mock + +import numpy as np +import pytest + +import iris +from iris.coords import AuxCoord, DimCoord +from iris.cube import Cube + +_time_unit = "days since 2001-01-01" + + +def cu(n="a", t=0, z=0): + """Create a single test cube. + + All cubes have, potentially, 4 dimensions (z, t, y, x). + The (y, x) dims are always the same, but (z, t) can be scalar, or various lengths. + t/z values which are scalar/vector produce likewise scalar/vector coordinates. + """ + yco = DimCoord(np.arange(3), long_name="latitude", units="degrees") + xco = DimCoord(np.arange(4), long_name="longitude", units="degrees") + dim_coords = [yco, xco] + shape = [3, 4] # the xy shape + scalar_coords = [] + tco = DimCoord( + np.array(t, dtype=np.float32), standard_name="time", units=_time_unit + ) + zco = DimCoord(np.array(z, dtype=np.float32), standard_name="height", units="m") + for tz, tzco in [(t, tco), (z, zco)]: + if isinstance(tz, Iterable): + # N.B. insert an extra dim at the front + dim_coords[:0] = [tzco] + shape[:0] = tzco.shape[:1] + else: + scalar_coords.append(tzco) + + cube = Cube( + data=np.zeros(shape), + long_name=n, + dim_coords_and_dims=[(dim, i_dim) for i_dim, dim in enumerate(dim_coords)], + aux_coords_and_dims=[(dim, ()) for dim in scalar_coords], + ) + return cube + + +@pytest.fixture(params=["load", "load_cube", "load_cubes", "load_raw"]) +def loadfunc_name(request): + # N.B. "request" is a standard PyTest fixture + return request.param # Return the name of the attribute to test. + + +def run_testcase(input_cubes, loadfunc_name, constraints=None): + loadfunc = getattr(iris, loadfunc_name) + + def mock_generate_cubes(uris, callback, constraints): + for cube in input_cubes: + yield cube + + try: + with mock.patch("iris._generate_cubes", mock_generate_cubes): + result = loadfunc(input_cubes, constraints) + except Exception as e: + result = e + + return result + + +def debug_result(cubes): + print() + print(cubes) + if isinstance(cubes, iris.cube.CubeList): + print(len(cubes), " cubes..") + for i_cube, cube in enumerate(cubes): + vh = cube.coord("height").points + vt = cube.coord("time").points + print(i_cube, cube.name(), ": h=", vh, " :: t=", vt) + + +def check_result(input_cubes, loadfunc_name, result, expected_results): + if "load_raw" not in expected_results and loadfunc_name == "load_raw": + expected = input_cubes + else: + expected = expected_results[loadfunc_name] + + if isinstance(expected, str): + # We expect an error result : stored 'expected' is a regexp to match its repr + assert re.search(expected, repr(result)) + else: + assert result == expected + + +class TestLoadFunctions: + def test_mergeable(self, loadfunc_name): + _cube = cu(t=(0, 1), z=(0, 1)) + input_cubes = [cu(t=i_t, z=i_z) for i_t in (0, 1) for i_z in (0, 1)] + expected_results = { + "load": [_cube], + "load_cube": _cube, + "load_cubes": [_cube], + } + result = run_testcase(input_cubes, loadfunc_name) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_multiple(self, loadfunc_name): + input_cubes = [cu(), cu(n="b")] + expected_results = { + "load": [cu(), cu(n="b")], + "load_cube": "ConstraintMismatchError.*failed to merge into a single cube", + "load_cubes": r"ConstraintMismatchError.*-> \d+ cubes", + } + result = run_testcase(input_cubes, loadfunc_name) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_multiple_constrained(self, loadfunc_name): + cube, cube_b = cu(), cu(n="b") + input_cubes = [cube, cube_b] + constraint = "a" + expected_results = { + "load": [cube], + "load_cube": cube, + "load_cubes": [cube], + "load_raw": [cube], + } + result = run_testcase(input_cubes, loadfunc_name, constraints=constraint) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_multiple_multi_constraints(self, loadfunc_name): + ca, cb, cc = cu(), cu(n="b"), cu(n="c") + input_cubes = [ca, cb, cc] + constraints = ["c", "a"] + expected_results = { + "load": [cc, ca], + "load_cube": "ValueError.*only a single constraint is allowed", + "load_cubes": [cc, ca], + "load_raw": [cc, ca], + } + result = run_testcase(input_cubes, loadfunc_name, constraints=constraints) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_nonmergeable_part_missing(self, loadfunc_name): + c1, c2, c3, c4 = [cu(t=i_t, z=i_z) for i_t in (0, 1) for i_z in (0, 1)] + input_cubes = [c1, c2, c4] + + c124 = cu(t=(0, 1, 2)) + c124.remove_coord("time") # we now have an unnamed dimension + c124.remove_coord("height") # we now have an unnamed dimension + c124.add_aux_coord(AuxCoord([0.0, 1, 1], standard_name="height", units="m"), 0) + c124.add_aux_coord( + AuxCoord([0.0, 0, 1], standard_name="time", units=_time_unit), 0 + ) + expected_results = { + "load": [c124], + "load_cube": c124, + "load_cubes": [c124], + } + result = run_testcase(input_cubes, loadfunc_name) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_nonmergeable_part_extra(self, loadfunc_name): + c1, c2, c3, c4 = [cu(t=i_t, z=i_z) for i_t in (0, 1) for i_z in (0, 1)] + c5 = cu(t=5) + input_cubes = [c1, c2, c5, c4, c3] # scramble order, just to test + + cx = cu(t=range(5)) + cx.remove_coord("time") # we now have an unnamed dimension + cx.remove_coord("height") # we now have an unnamed dimension + cx.add_aux_coord( + AuxCoord([0.0, 1, 0, 1, 0], standard_name="height", units="m"), 0 + ) + cx.add_aux_coord( + AuxCoord([0.0, 0, 5, 1, 1], standard_name="time", units=_time_unit), 0 + ) + expected_results = { + "load": [cx], + "load_cube": cx, + "load_cubes": [cx], + } + result = run_testcase(input_cubes, loadfunc_name) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_constraint_overlap(self, loadfunc_name): + c1, c2, c3, c4, c5, c6 = (cu(z=ind) for ind in (1, 2, 3, 4, 5, 6)) + input_cubes = [c1, c2, c3, c4, c5, c6] + constraints = [ + iris.Constraint(height=[1, 2]), + iris.Constraint(height=[1, 4, 5]), + ] + c12 = cu(z=[1, 2]) + c145 = cu(z=[1, 4, 5]) + expected_results = { + "load": [c12, c145], + "load_cube": "ValueError.*only a single constraint is allowed", + "load_cubes": [c12, c145], # selected parts merge, as for load + "load_raw": [c1, c2, c1, c4, c5], # THIS VERY STRANGE BEHAVIOUR!! + } + result = run_testcase(input_cubes, loadfunc_name, constraints=constraints) + check_result(input_cubes, loadfunc_name, result, expected_results) + + def test_multiple_match(self, loadfunc_name): + c1 = cu(z=1) + c2 = cu(z=2) + c3 = cu(n="b", z=1) + c4 = cu(n="b", z=2) + input_cubes = [c1, c2, c3, c4] + constraints = [ + iris.Constraint("a") & iris.Constraint(height=1), + iris.Constraint(height=2), + ] + expected_results = { + "load": [c1, c2, c4], + "load_cube": "ValueError.*only a single constraint is allowed", + "load_cubes": r"ConstraintMismatchError.*-> \d+ cubes", + "load_raw": [c1, c2, c4], + } + result = run_testcase(input_cubes, loadfunc_name, constraints=constraints) + debug_result(result) + check_result(input_cubes, loadfunc_name, result, expected_results) diff --git a/lib/iris/tests/unit/io/format_picker/test_FormatAgent.py b/lib/iris/tests/unit/io/format_picker/test_FormatAgent.py new file mode 100644 index 0000000000..3f5d3a87e3 --- /dev/null +++ b/lib/iris/tests/unit/io/format_picker/test_FormatAgent.py @@ -0,0 +1,23 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the `iris.io.format_picker.FormatAgent` class.""" + +from iris.fileformats import FORMAT_AGENT +import iris.tests as tests + + +class TestFormatAgent(tests.IrisTest): + def test_copy_is_equal(self): + format_agent_copy = FORMAT_AGENT.copy() + self.assertEqual(format_agent_copy, FORMAT_AGENT) + + def test_modified_copy_not_equal(self): + format_agent_copy = FORMAT_AGENT.copy() + format_agent_copy._format_specs.pop() + self.assertNotEqual(format_agent_copy, FORMAT_AGENT) + + +if __name__ == "__main__": + tests.main() diff --git a/lib/iris/tests/unit/lazy_data/test_as_concrete_data.py b/lib/iris/tests/unit/lazy_data/test_as_concrete_data.py index 8a12e7f5ea..1562a28e82 100644 --- a/lib/iris/tests/unit/lazy_data/test_as_concrete_data.py +++ b/lib/iris/tests/unit/lazy_data/test_as_concrete_data.py @@ -57,7 +57,8 @@ def test_lazy_mask_data(self): def test_lazy_scalar_proxy(self): a = np.array(5) proxy = MyProxy(a) - lazy_array = as_lazy_data(proxy) + meta = np.empty((0,) * proxy.ndim, dtype=proxy.dtype) + lazy_array = as_lazy_data(proxy, meta=meta) assert is_lazy_data(lazy_array) result = as_concrete_data(lazy_array) assert not is_lazy_data(result) @@ -66,7 +67,8 @@ def test_lazy_scalar_proxy(self): def test_lazy_scalar_proxy_masked(self): a = np.ma.masked_array(5, True) proxy = MyProxy(a) - lazy_array = as_lazy_data(proxy) + meta = np.ma.array(np.empty((0,) * proxy.ndim, dtype=proxy.dtype), mask=True) + lazy_array = as_lazy_data(proxy, meta=meta) assert is_lazy_data(lazy_array) result = as_concrete_data(lazy_array) assert not is_lazy_data(result) diff --git a/lib/iris/tests/unit/lazy_data/test_as_lazy_data.py b/lib/iris/tests/unit/lazy_data/test_as_lazy_data.py index 730bf914db..821370ce6c 100644 --- a/lib/iris/tests/unit/lazy_data/test_as_lazy_data.py +++ b/lib/iris/tests/unit/lazy_data/test_as_lazy_data.py @@ -43,26 +43,28 @@ def test_dask_chunking(self, mocker): chunks = (12,) optimum = mocker.patch("iris._lazy_data._optimum_chunksize") optimum.return_value = chunks - _ = as_lazy_data(data, chunks=None, dask_chunking=True) + _ = as_lazy_data(data, chunks="auto") assert not optimum.called - def test_dask_chunking_error(self, mocker): - data = np.arange(24) - chunks = (12,) - optimum = mocker.patch("iris._lazy_data._optimum_chunksize") - optimum.return_value = chunks - with pytest.raises( - ValueError, - match=r"Dask chunking chosen, but chunks already assigned value", - ): - as_lazy_data(data, chunks=chunks, dask_chunking=True) - def test_with_masked_constant(self): masked_data = ma.masked_array([8], mask=True) masked_constant = masked_data[0] result = as_lazy_data(masked_constant) assert isinstance(result, da.core.Array) + def test_missing_meta(self): + class MyProxy: + pass + + data = MyProxy() + + with pytest.raises( + ValueError, + match=r"For performance reasons, `meta` cannot be `None` if `data` is anything other than a Numpy " + r"or Dask array.", + ): + as_lazy_data(data) + class Test__optimised_chunks: # Stable, known chunksize for testing. diff --git a/lib/iris/tests/unit/lazy_data/test_co_realise_cubes.py b/lib/iris/tests/unit/lazy_data/test_co_realise_cubes.py index 85bfaa85e2..ecc969cc2c 100644 --- a/lib/iris/tests/unit/lazy_data/test_co_realise_cubes.py +++ b/lib/iris/tests/unit/lazy_data/test_co_realise_cubes.py @@ -18,6 +18,7 @@ def __init__(self, array): self.ndim = array.ndim self._array = array self.access_count = 0 + self.meta = np.empty((0,) * array.ndim, dtype=array.dtype) def __getitem__(self, keys): self.access_count += 1 @@ -52,7 +53,7 @@ def test_multi(self): def test_combined_access(self): wrapped_array = ArrayAccessCounter(np.arange(3.0)) - lazy_array = as_lazy_data(wrapped_array) + lazy_array = as_lazy_data(wrapped_array, meta=wrapped_array.meta) derived_a = lazy_array + 1 derived_b = lazy_array + 2 derived_c = lazy_array + 3 diff --git a/lib/iris/tests/unit/lazy_data/test_map_complete_blocks.py b/lib/iris/tests/unit/lazy_data/test_map_complete_blocks.py index 82e5928c40..c63f626fd9 100644 --- a/lib/iris/tests/unit/lazy_data/test_map_complete_blocks.py +++ b/lib/iris/tests/unit/lazy_data/test_map_complete_blocks.py @@ -29,13 +29,25 @@ def create_mock_cube(array): class Test_map_complete_blocks: def setup_method(self): self.array = np.arange(8).reshape(2, 4) - self.func = lambda chunk: chunk + 1 + + def func(chunk): + """Use a function that cannot be 'sampled'. + + To make sure the call to map_blocks is correct for any function, + we define this function that cannot be called with size 0 arrays + to infer the output meta. + """ + if chunk.size == 0: + raise ValueError + return chunk + 1 + + self.func = func self.func_result = self.array + 1 def test_non_lazy_input(self): # Check that a non-lazy input doesn't trip up the functionality. cube, cube_data = create_mock_cube(self.array) - result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,)) + result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,), dtype=self.array.dtype) assert not is_lazy_data(result) assert_array_equal(result, self.func_result) # check correct data was accessed @@ -45,7 +57,7 @@ def test_non_lazy_input(self): def test_lazy_input(self): lazy_array = da.asarray(self.array, chunks=((1, 1), (4,))) cube, cube_data = create_mock_cube(lazy_array) - result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,)) + result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,), dtype=lazy_array.dtype) assert is_lazy_data(result) assert_array_equal(result.compute(), self.func_result) # check correct data was accessed @@ -54,14 +66,41 @@ def test_lazy_input(self): def test_dask_array_input(self): lazy_array = da.asarray(self.array, chunks=((1, 1), (4,))) - result = map_complete_blocks(lazy_array, self.func, dims=(1,), out_sizes=(4,)) + result = map_complete_blocks( + lazy_array, self.func, dims=(1,), out_sizes=(4,), dtype=lazy_array.dtype) assert is_lazy_data(result) assert_array_equal(result.compute(), self.func_result) + def test_dask_masked_array_input(self): + array = da.ma.masked_array(np.arange(2), mask=np.arange(2)) + result = map_complete_blocks( + array, self.func, dims=tuple(), out_sizes=tuple(), dtype=array.dtype + ) + assert is_lazy_data(result) + assert isinstance(da.utils.meta_from_array(result), np.ma.MaskedArray) + assert_array_equal(result.compute(), np.ma.masked_array([1, 2], mask=[0, 1])) + + def test_dask_array_input_with_different_output_dtype(self): + lazy_array = da.ma.masked_array(self.array, chunks=((1, 1), (4,))) + dtype = np.float32 + + def func(chunk): + if chunk.size == 0: + raise ValueError + return (chunk + 1).astype(np.float32) + + result = map_complete_blocks( + lazy_array, func, dims=(1,), out_sizes=(4,), dtype=dtype + ) + assert isinstance(da.utils.meta_from_array(result), np.ma.MaskedArray) + assert result.dtype == dtype + assert result.compute().dtype == dtype + assert_array_equal(result.compute(), self.func_result) + def test_rechunk(self): lazy_array = da.asarray(self.array, chunks=((1, 1), (2, 2))) cube, _ = create_mock_cube(lazy_array) - result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,)) + result = map_complete_blocks(cube, self.func, dims=(1,), out_sizes=(4,), dtype=lazy_array.dtype) assert is_lazy_data(result) assert_array_equal(result.compute(), self.func_result) @@ -73,7 +112,7 @@ def func(_): return np.arange(2).reshape(1, 2) func_result = [[0, 1], [0, 1]] - result = map_complete_blocks(cube, func, dims=(1,), out_sizes=(2,)) + result = map_complete_blocks(cube, func, dims=(1,), out_sizes=(2,), dtype=lazy_array.dtype) assert is_lazy_data(result) assert_array_equal(result.compute(), func_result) @@ -81,6 +120,6 @@ def test_multidimensional_input(self): array = np.arange(2 * 3 * 4).reshape(2, 3, 4) lazy_array = da.asarray(array, chunks=((1, 1), (1, 2), (4,))) cube, _ = create_mock_cube(lazy_array) - result = map_complete_blocks(cube, self.func, dims=(1, 2), out_sizes=(3, 4)) + result = map_complete_blocks(cube, self.func, dims=(1, 2), out_sizes=(3, 4), dtype=lazy_array.dtype) assert is_lazy_data(result) assert_array_equal(result.compute(), array + 1) diff --git a/lib/iris/tests/unit/lazy_data/test_stack.py b/lib/iris/tests/unit/lazy_data/test_stack.py new file mode 100644 index 0000000000..880bad7df1 --- /dev/null +++ b/lib/iris/tests/unit/lazy_data/test_stack.py @@ -0,0 +1,22 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Test function :func:`iris._lazy data.stack`.""" + +import dask.array as da +import numpy as np + +from iris._lazy_data import stack + + +def test_stack(): + seq = [ + da.arange(2), + da.ma.masked_array(da.arange(2)), + ] + result = stack(seq) + + assert isinstance(result[0].compute(), np.ma.MaskedArray) + assert isinstance(result[1].compute(), np.ma.MaskedArray) + np.testing.assert_array_equal(stack(seq).compute(), da.stack(seq).compute()) diff --git a/lib/iris/tests/unit/merge/test_ProtoCube.py b/lib/iris/tests/unit/merge/test_ProtoCube.py index 6174e6a9d8..60726f99e9 100644 --- a/lib/iris/tests/unit/merge/test_ProtoCube.py +++ b/lib/iris/tests/unit/merge/test_ProtoCube.py @@ -6,6 +6,8 @@ # Import iris.tests first so that some things can be initialised before # importing anything else. +from typing import ClassVar + import iris.tests as tests # isort:skip from abc import ABCMeta, abstractmethod @@ -239,7 +241,7 @@ class _MergeTest: # A mixin test class for common test methods implementation. # used by check routine: inheritors must implement it - _mergetest_type = NotImplementedError + _mergetest_type: ClassVar[str] def check_merge_fails_with_message(self): proto_cube = iris._merge.ProtoCube(self.cube1) @@ -382,7 +384,7 @@ class _MergeTest_coordprops(_MergeTest): # A mixin test class for common coordinate properties tests. # This must be implemented by inheritors. - _mergetest_type = NotImplementedError + _mergetest_type: ClassVar[str] def test_nochange(self): # This should simply succeed. @@ -444,8 +446,8 @@ def setUp(self): class _MergeTest_coordprops_vect(_MergeTest_coordprops): # A derived mixin test class. # Adds extra props test for aux+dim coords (test points, bounds + dims) - _mergetest_type = NotImplementedError - _coord_typename = NotImplementedError + _mergetest_type: ClassVar[str] + _coord_typename: ClassVar[str] def test_points(self): self.coord_to_change.points = self.coord_to_change.points + 1.0 diff --git a/lib/iris/tests/unit/mesh/__init__.py b/lib/iris/tests/unit/mesh/__init__.py new file mode 100644 index 0000000000..1305bda078 --- /dev/null +++ b/lib/iris/tests/unit/mesh/__init__.py @@ -0,0 +1,7 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.mesh` package.""" + +from __future__ import annotations diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py b/lib/iris/tests/unit/mesh/components/__init__.py similarity index 70% rename from lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py rename to lib/iris/tests/unit/mesh/components/__init__.py index d485782c11..cc0effb1f6 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py +++ b/lib/iris/tests/unit/mesh/components/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.mesh` package.""" +"""Unit tests for the :mod:`iris.mesh.components` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py b/lib/iris/tests/unit/mesh/components/test_Connectivity.py similarity index 98% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py rename to lib/iris/tests/unit/mesh/components/test_Connectivity.py index b84b32cf41..de8d7de3d7 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py +++ b/lib/iris/tests/unit/mesh/components/test_Connectivity.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.mesh.Connectivity` class.""" +"""Unit tests for the :class:`iris.mesh.Connectivity` class.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -16,7 +16,7 @@ from packaging import version from iris._lazy_data import as_lazy_data, is_lazy_data -from iris.experimental.ugrid.mesh import Connectivity +from iris.mesh import Connectivity class TestStandard(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py b/lib/iris/tests/unit/mesh/components/test_MeshCoord.py similarity index 91% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py rename to lib/iris/tests/unit/mesh/components/test_MeshCoord.py index 2282bc07b9..0acec1985d 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py +++ b/lib/iris/tests/unit/mesh/components/test_MeshCoord.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.mesh.MeshCoord`.""" +"""Unit tests for the :class:`iris.mesh.MeshCoord`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -20,9 +21,16 @@ from iris.common.metadata import BaseMetadata, CoordMetadata from iris.coords import AuxCoord, Coord from iris.cube import Cube -from iris.experimental.ugrid.mesh import Connectivity, Mesh, MeshCoord +from iris.mesh import Connectivity, MeshCoord, MeshXY import iris.tests.stock.mesh from iris.tests.stock.mesh import sample_mesh, sample_meshcoord +from iris.warnings import IrisVagueMetadataWarning + + +@pytest.fixture(params=["face", "edge"]) +def location_face_or_edge(request): + # Fixture to parametrise over location = face/edge + return request.param class Test___init__(tests.IrisTest): @@ -42,9 +50,9 @@ def test_basic(self): def test_derived_properties(self): # Check the derived properties of the meshcoord against the correct # underlying mesh coordinate. - for axis in Mesh.AXES: + for axis in MeshXY.AXES: meshcoord = sample_meshcoord(axis=axis) - face_x_coord = meshcoord.mesh.coord(include_faces=True, axis=axis) + face_x_coord = meshcoord.mesh.coord(location="face", axis=axis) for key in face_x_coord.metadata._fields: meshval = getattr(meshcoord, key) # All relevant attributes are derived from the face coord. @@ -55,16 +63,16 @@ def test_fail_bad_mesh(self): sample_meshcoord(mesh=mock.sentinel.odd) def test_valid_locations(self): - for loc in Mesh.ELEMENTS: + for loc in MeshXY.ELEMENTS: meshcoord = sample_meshcoord(location=loc) self.assertEqual(meshcoord.location, loc) def test_fail_bad_location(self): - with self.assertRaisesRegex(ValueError, "not a valid Mesh location"): + with self.assertRaisesRegex(ValueError, "not a valid MeshXY location"): sample_meshcoord(location="bad") def test_fail_bad_axis(self): - with self.assertRaisesRegex(ValueError, "not a valid Mesh axis"): + with self.assertRaisesRegex(ValueError, "not a valid MeshXY axis"): sample_meshcoord(axis="q") @@ -272,7 +280,7 @@ def _expected_elements_regexp( # Construct regexp in 'sections' # NB each consumes up to first non-space in the next line regexp = f"MeshCoord : {coord_name} / [^\n]+\n *" - regexp += r"mesh: \\n *" + regexp += r"mesh: \\n *" regexp += f"location: '{location}'\n *" # Now some optional sections : whichever comes first will match @@ -341,7 +349,7 @@ def test_repr__nameless_mesh(self): result = repr(self.meshcoord) re_expected = ( r".MeshCoord: longitude / \(unknown\) " - r"mesh\(.Mesh object at 0x[^>]+.\) location\(face\) " + r"mesh\(.MeshXY object at 0x[^>]+.\) location\(face\) " ) self.assertRegex(result, re_expected) @@ -382,7 +390,7 @@ def test_alternative_location_and_axis(self): def test_str_no_long_name(self): mesh = self.mesh # Remove the long_name of the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.long_name = None # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -393,7 +401,7 @@ def test_str_no_long_name(self): def test_str_no_attributes(self): mesh = self.mesh # No attributes on the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.attributes = None # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -404,7 +412,7 @@ def test_str_no_attributes(self): def test_str_empty_attributes(self): mesh = self.mesh # Empty attributes dict on the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.attributes.clear() # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -599,7 +607,7 @@ def lazify(arr): co_edgex = AuxCoord( edge_xs, standard_name="longitude", long_name="edge_x", units=1 ) - # N.B. the Mesh requires 'Y's as well. + # N.B. the MeshXY requires 'Y's as well. co_nodey = co_nodex.copy() co_nodey.rename("latitude") co_nodey.long_name = "node_y" @@ -636,7 +644,7 @@ def lazify(arr): location_axis=inds_location_axis, ) - self.mesh = Mesh( + self.mesh = MeshXY( topology_dimension=2, node_coords_and_axes=[(co_nodex, "x"), (co_nodey, "y")], connectivities=[face_node_conn, edge_node_conn], @@ -735,8 +743,8 @@ def test_meshcoord_leaves_originals_lazy(self): # Fetch the relevant source objects from the mesh. def fetch_sources_from_mesh(): return ( - mesh.coord(include_nodes=True, axis="x"), - mesh.coord(include_faces=True, axis="x"), + mesh.coord(location="node", axis="x"), + mesh.coord(location="face", axis="x"), mesh.face_node_connectivity, ) @@ -787,12 +795,8 @@ def setup_mesh(self, location, axis): mesh = sample_mesh() # Modify the metadata of specific coordinates used in this test. - def select_coord(location, axis): - kwargs = {f"include_{location}s": True, "axis": axis} - return mesh.coord(**kwargs) - - node_coord = select_coord("node", axis) - location_coord = select_coord(location, axis) + node_coord = mesh.coord(axis=axis, location="node") + location_coord = mesh.coord(axis=axis, location=location) for i_place, coord in enumerate((node_coord, location_coord)): coord.standard_name = "longitude" if axis == "x" else "latitude" coord.units = "degrees" @@ -813,11 +817,6 @@ def coord_metadata_matches(self, test_coord, ref_coord): for key in CoordMetadata._fields: assert getattr(test_coord, key) == getattr(ref_coord, key) - @pytest.fixture(params=["face", "edge"]) - def location_face_or_edge(self, request): - # Fixture to parametrise over location = face/edge - return request.param - @pytest.fixture(params=["x", "y"]) def axis_x_or_y(self, request): # Fixture to parametrise over axis = X/Y @@ -876,7 +875,7 @@ def test_faceedge_fail_missing_stdnames(self, location_face_or_edge, axis_x_or_y self.setup_mesh(location_face_or_edge, axis_x_or_y) self.node_coord.standard_name = None # N.B. in the absence of a standard-name, we **must** provide an extra ".axis" - # property, or the coordinate cannot be correctly identified in the Mesh. + # property, or the coordinate cannot be correctly identified in the MeshXY. # This is a bit of a kludge, but works with current code. self.node_coord.axis = axis_x_or_y @@ -913,5 +912,74 @@ def test_faceedge_missing_units(self, location_face_or_edge, axis_x_or_y): self.coord_metadata_matches(meshcoord, self.location_coord) +class Test_collapsed: + """Very simple operation that in theory is fully tested elsewhere + (Test_auxcoord_conversion, and existing tests of AuxCoord.collapsed()), + but there is still need to check that the operation is valid for any + expected MeshCoord variety. + """ + + @pytest.fixture(params=[False, True], ids=["real", "lazy"]) + def lazy(self, request): + return request.param + + @pytest.fixture(params=[4, 5], ids=["quads", "pentagons"]) + def nodes_per_face(self, request): + return request.param + + @pytest.fixture(params=[False, True], ids=["conn_no_masks", "conn_has_masks"]) + def masked_connecteds(self, request): + return request.param + + @staticmethod + @pytest.fixture + def mesh_coord(location_face_or_edge, lazy, nodes_per_face, masked_connecteds): + mesh = sample_mesh( + lazy_values=lazy, + nodes_per_face=nodes_per_face, + masked_connecteds=masked_connecteds, + ) + coord = sample_meshcoord( + mesh=mesh, + location=location_face_or_edge, + ) + return coord + + @staticmethod + @pytest.fixture + def mesh_coord_basic(): + return sample_meshcoord() + + def test_works(self, mesh_coord): + """Just check that the operation succeeds. + + The points/bounds produced by collapsing a MeshCoord are suspect + (hence a warning is raised), so we will not assert for 'correct' + values. + """ + collapsed = mesh_coord.collapsed() + assert collapsed.points.shape == (1,) + assert collapsed.bounds.shape == (1, 2) + + def test_warns(self, mesh_coord_basic): + """Confirm that the correct warning has been raised. + + Also confirm that the original AuxCoord warning has NOT been raised - + successfully suppressed. + """ + with pytest.warns(IrisVagueMetadataWarning) as record: + _ = mesh_coord_basic.collapsed() + + # Len 1 means that no other warnings were raised. + assert len(record) == 1 + message = record[0].message.args[0] + assert message.startswith("Collapsing a mesh coordinate") + + def test_aux_collapsed_called(self, mesh_coord_basic): + with mock.patch.object(AuxCoord, "collapsed") as mocked: + _ = mesh_coord_basic.collapsed() + mocked.assert_called_once() + + if __name__ == "__main__": tests.main() diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py b/lib/iris/tests/unit/mesh/components/test_MeshXY.py similarity index 88% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py rename to lib/iris/tests/unit/mesh/components/test_MeshXY.py index 48f9910099..c1977633e2 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py +++ b/lib/iris/tests/unit/mesh/components/test_MeshXY.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`mesh` class.""" +"""Unit tests for the :class:`iris.mesh.MeshXY` class.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -10,10 +10,11 @@ import numpy as np +from iris.common.metadata import MeshMetadata from iris.coords import AuxCoord from iris.exceptions import ConnectivityNotFoundError, CoordinateNotFoundError -from iris.experimental.ugrid import mesh, metadata -from iris.experimental.ugrid.mesh import logger +from iris.mesh import components +from iris.mesh.components import logger class TestMeshCommon(tests.IrisTest): @@ -40,22 +41,28 @@ def setUpClass(cls): cls.FACE_LON = AuxCoord([0.5], standard_name="longitude", var_name="face_lon") cls.FACE_LAT = AuxCoord([0.5], standard_name="latitude", var_name="face_lat") - cls.EDGE_NODE = mesh.Connectivity( + cls.EDGE_NODE = components.Connectivity( [[0, 1], [1, 2], [2, 0]], cf_role="edge_node_connectivity", long_name="long_name", var_name="var_name", attributes={"test": 1}, ) - cls.FACE_NODE = mesh.Connectivity([[0, 1, 2]], cf_role="face_node_connectivity") - cls.FACE_EDGE = mesh.Connectivity([[0, 1, 2]], cf_role="face_edge_connectivity") + cls.FACE_NODE = components.Connectivity( + [[0, 1, 2]], cf_role="face_node_connectivity" + ) + cls.FACE_EDGE = components.Connectivity( + [[0, 1, 2]], cf_role="face_edge_connectivity" + ) # (Actually meaningless:) - cls.FACE_FACE = mesh.Connectivity([[0, 0, 0]], cf_role="face_face_connectivity") + cls.FACE_FACE = components.Connectivity( + [[0, 0, 0]], cf_role="face_face_connectivity" + ) # (Actually meaningless:) - cls.EDGE_FACE = mesh.Connectivity( + cls.EDGE_FACE = components.Connectivity( [[0, 0], [0, 0], [0, 0]], cf_role="edge_face_connectivity" ) - cls.BOUNDARY_NODE = mesh.Connectivity( + cls.BOUNDARY_NODE = components.Connectivity( [[0, 1], [1, 2], [2, 0]], cf_role="boundary_node_connectivity" ) @@ -65,7 +72,7 @@ class TestProperties1D(TestMeshCommon): @classmethod def setUpClass(cls): super().setUpClass() - # Mesh kwargs with topology_dimension=1 and all applicable + # MeshXY kwargs with topology_dimension=1 and all applicable # arguments populated - this tests correct property setting. cls.kwargs = { "topology_dimension": 1, @@ -78,12 +85,12 @@ def setUpClass(cls): "edge_dimension": "EdgeDim", "edge_coords_and_axes": ((cls.EDGE_LON, "x"), (cls.EDGE_LAT, "y")), } - cls.mesh = mesh.Mesh(**cls.kwargs) + cls.mesh = components.MeshXY(**cls.kwargs) def test__metadata_manager(self): self.assertEqual( self.mesh._metadata_manager.cls.__name__, - metadata.MeshMetadata.__name__, + MeshMetadata.__name__, ) def test___getstate__(self): @@ -95,12 +102,12 @@ def test___getstate__(self): self.assertEqual(expected, self.mesh.__getstate__()) def test___repr__(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___str__(self): expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 1", " node", " node_dimension: 'NodeDim'", @@ -127,13 +134,13 @@ def test___eq__(self): # The dimension names do not participate in equality. equivalent_kwargs = self.kwargs.copy() equivalent_kwargs["node_dimension"] = "something_else" - equivalent = mesh.Mesh(**equivalent_kwargs) + equivalent = components.MeshXY(**equivalent_kwargs) self.assertEqual(equivalent, self.mesh) def test_different(self): different_kwargs = self.kwargs.copy() different_kwargs["long_name"] = "new_name" - different = mesh.Mesh(**different_kwargs) + different = components.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) different_kwargs = self.kwargs.copy() @@ -141,22 +148,22 @@ def test_different(self): new_lat = ncaa[1][0].copy(points=ncaa[1][0].points + 1) new_ncaa = (ncaa[0], (new_lat, "y")) different_kwargs["node_coords_and_axes"] = new_ncaa - different = mesh.Mesh(**different_kwargs) + different = components.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) different_kwargs = self.kwargs.copy() conns = self.kwargs["connectivities"] new_conn = conns[0].copy(conns[0].indices + 1) different_kwargs["connectivities"] = new_conn - different = mesh.Mesh(**different_kwargs) + different = components.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) def test_all_connectivities(self): - expected = mesh.Mesh1DConnectivities(self.EDGE_NODE) + expected = components.Mesh1DConnectivities(self.EDGE_NODE) self.assertEqual(expected, self.mesh.all_connectivities) def test_all_coords(self): - expected = mesh.Mesh1DCoords( + expected = components.Mesh1DCoords( self.NODE_LON, self.NODE_LAT, self.EDGE_LON, self.EDGE_LAT ) self.assertEqual(expected, self.mesh.all_coords) @@ -181,7 +188,9 @@ def test_connectivities(self): {"cf_role": "edge_node_connectivity"}, ) - fake_connectivity = tests.mock.Mock(__class__=mesh.Connectivity, cf_role="fake") + fake_connectivity = tests.mock.Mock( + __class__=components.Connectivity, cf_role="fake" + ) negative_kwargs = ( {"item": fake_connectivity}, {"item": "foo"}, @@ -223,11 +232,14 @@ def test_connectivities_elements(self): self.assertEqual([], func(contains_face=True)) def test_coord(self): - # See Mesh.coords tests for thorough coverage of cases. + # See MeshXY.coords tests for thorough coverage of cases. func = self.mesh.coord exception = CoordinateNotFoundError - self.assertRaisesRegex(exception, ".*but found 2", func, include_nodes=True) + self.assertRaisesRegex(exception, ".*but found 2", func, location="node") self.assertRaisesRegex(exception, ".*but found none", func, axis="t") + self.assertRaisesRegex( + ValueError, "Expected location.*got `foo`", func, location="foo" + ) def test_coords(self): # General results. Method intended for inheritance. @@ -238,6 +250,7 @@ def test_coords(self): {"long_name": "long_name"}, {"var_name": "node_lon"}, {"attributes": {"test": 1}}, + {"location": "node"}, ) fake_coord = AuxCoord([0]) @@ -248,6 +261,7 @@ def test_coords(self): {"long_name": "foo"}, {"var_name": "foo"}, {"attributes": {"test": 2}}, + {"location": "edge"}, ) func = self.mesh.coords @@ -256,6 +270,10 @@ def test_coords(self): for kwargs in negative_kwargs: self.assertNotIn(self.NODE_LON, func(**kwargs)) + self.assertRaisesRegex( + ValueError, "Expected location.*got.*foo", self.mesh.coords, location="foo" + ) + def test_coords_elements(self): # topology_dimension-specific results. Method intended to be overridden. all_expected = { @@ -268,19 +286,9 @@ def test_coords_elements(self): kwargs_expected = ( ({"axis": "x"}, ["node_x", "edge_x"]), ({"axis": "y"}, ["node_y", "edge_y"]), - ({"include_nodes": True}, ["node_x", "node_y"]), - ({"include_edges": True}, ["edge_x", "edge_y"]), - ({"include_nodes": False}, ["edge_x", "edge_y"]), - ({"include_edges": False}, ["node_x", "node_y"]), - ( - {"include_nodes": True, "include_edges": True}, - ["node_x", "node_y", "edge_x", "edge_y"], - ), - ({"include_nodes": False, "include_edges": False}, []), - ( - {"include_nodes": False, "include_edges": True}, - ["edge_x", "edge_y"], - ), + ({"location": "node"}, ["node_x", "node_y"]), + ({"location": "edge"}, ["edge_x", "edge_y"]), + ({"location": "face"}, ["face_x", "face_y"]), ) func = self.mesh.coords @@ -290,13 +298,13 @@ def test_coords_elements(self): log_regex = r".*filter non-existent.*" with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): - self.assertEqual([], func(include_faces=True)) + self.assertEqual([], func(location="face")) def test_edge_dimension(self): self.assertEqual(self.kwargs["edge_dimension"], self.mesh.edge_dimension) def test_edge_coords(self): - expected = mesh.MeshEdgeCoords(self.EDGE_LON, self.EDGE_LAT) + expected = components.MeshEdgeCoords(self.EDGE_LON, self.EDGE_LAT) self.assertEqual(expected, self.mesh.edge_coords) def test_edge_face(self): @@ -326,7 +334,7 @@ def test_face_node(self): _ = self.mesh.face_node_connectivity def test_node_coords(self): - expected = mesh.MeshNodeCoords(self.NODE_LON, self.NODE_LAT) + expected = components.MeshNodeCoords(self.NODE_LON, self.NODE_LAT) self.assertEqual(expected, self.mesh.node_coords) def test_node_dimension(self): @@ -361,15 +369,15 @@ def setUpClass(cls): (cls.FACE_LON, "x"), (cls.FACE_LAT, "y"), ) - cls.mesh = mesh.Mesh(**cls.kwargs) + cls.mesh = components.MeshXY(**cls.kwargs) def test___repr__(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___str__(self): expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 2", " node", " node_dimension: 'NodeDim'", @@ -418,9 +426,9 @@ def test___str__(self): def test___str__noedgecoords(self): mesh_kwargs = self.kwargs.copy() del mesh_kwargs["edge_coords_and_axes"] - alt_mesh = mesh.Mesh(**mesh_kwargs) + alt_mesh = components.MeshXY(**mesh_kwargs) expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 2", " node", " node_dimension: 'NodeDim'", @@ -463,7 +471,7 @@ def test___str__noedgecoords(self): self.assertEqual(expected, str(alt_mesh).split("\n")) def test_all_connectivities(self): - expected = mesh.Mesh2DConnectivities( + expected = components.Mesh2DConnectivities( self.FACE_NODE, self.EDGE_NODE, self.FACE_EDGE, @@ -474,7 +482,7 @@ def test_all_connectivities(self): self.assertEqual(expected, self.mesh.all_connectivities) def test_all_coords(self): - expected = mesh.Mesh2DCoords( + expected = components.Mesh2DCoords( self.NODE_LON, self.NODE_LAT, self.EDGE_LON, @@ -488,8 +496,8 @@ def test_boundary_node(self): self.assertEqual(self.BOUNDARY_NODE, self.mesh.boundary_node_connectivity) def test_connectivity(self): - # See Mesh.connectivities tests for thorough coverage of cases. - # Can only test Mesh.connectivity for 2D since we need >1 connectivity. + # See MeshXY.connectivities tests for thorough coverage of cases. + # Can only test MeshXY.connectivity for 2D since we need >1 connectivity. func = self.mesh.connectivity exception = ConnectivityNotFoundError self.assertRaisesRegex(exception, ".*but found 3", func, contains_node=True) @@ -571,32 +579,8 @@ def test_coords_elements(self): kwargs_expected = ( ({"axis": "x"}, ["node_x", "edge_x", "face_x"]), ({"axis": "y"}, ["node_y", "edge_y", "face_y"]), - ({"include_nodes": True}, ["node_x", "node_y"]), - ({"include_edges": True}, ["edge_x", "edge_y"]), - ( - {"include_nodes": False}, - ["edge_x", "edge_y", "face_x", "face_y"], - ), - ( - {"include_edges": False}, - ["node_x", "node_y", "face_x", "face_y"], - ), - ( - {"include_faces": False}, - ["node_x", "node_y", "edge_x", "edge_y"], - ), - ( - {"include_faces": True, "include_edges": True}, - ["edge_x", "edge_y", "face_x", "face_y"], - ), - ( - {"include_faces": False, "include_edges": False}, - ["node_x", "node_y"], - ), - ( - {"include_faces": False, "include_edges": True}, - ["edge_x", "edge_y"], - ), + ({"location": "node"}, ["node_x", "node_y"]), + ({"location": "edge"}, ["edge_x", "edge_y"]), ) func = self.mesh.coords @@ -608,7 +592,7 @@ def test_edge_face(self): self.assertEqual(self.EDGE_FACE, self.mesh.edge_face_connectivity) def test_face_coords(self): - expected = mesh.MeshFaceCoords(self.FACE_LON, self.FACE_LAT) + expected = components.MeshFaceCoords(self.FACE_LON, self.FACE_LAT) self.assertEqual(expected, self.mesh.face_coords) def test_face_dimension(self): @@ -630,7 +614,7 @@ def setUp(self): # All the tests here want modified meshes, so use standard setUp to # create afresh for each test, allowing them to modify it. super().setUp() - # Mesh kwargs with topology_dimension=1 and all applicable + # MeshXY kwargs with topology_dimension=1 and all applicable # arguments populated - this tests correct property setting. self.kwargs = { "topology_dimension": 1, @@ -649,21 +633,21 @@ def setUp(self): (self.EDGE_LAT, "y"), ), } - self.mesh = mesh.Mesh(**self.kwargs) + self.mesh = components.MeshXY(**self.kwargs) def test___repr__basic(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___repr__varname(self): self.mesh.long_name = None - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___repr__noname(self): self.mesh.long_name = None self.mesh.var_name = None - expected = "" + expected = "" self.assertRegex(repr(self.mesh), expected) def test___str__noattributes(self): @@ -692,7 +676,7 @@ def test___str__units_stdname(self): mesh_kwargs = self.kwargs.copy() mesh_kwargs["standard_name"] = "height" # Odd choice ! mesh_kwargs["units"] = "m" - alt_mesh = mesh.Mesh(**mesh_kwargs) + alt_mesh = components.MeshXY(**mesh_kwargs) result = str(alt_mesh) # We expect these to appear at the end. expected = "\n".join( @@ -712,10 +696,10 @@ def test___str__units_stdname(self): class TestOperations1D(TestMeshCommon): - # Tests that cannot reuse an existing Mesh instance, instead need a new + # Tests that cannot reuse an existing MeshXY instance, instead need a new # one each time. def setUp(self): - self.mesh = mesh.Mesh( + self.mesh = components.MeshXY( topology_dimension=1, node_coords_and_axes=((self.NODE_LON, "x"), (self.NODE_LAT, "y")), connectivities=self.EDGE_NODE, @@ -765,7 +749,7 @@ def test_add_connectivities(self): edge_node = self.new_connectivity(self.EDGE_NODE, new_len) self.mesh.add_connectivities(edge_node) self.assertEqual( - mesh.Mesh1DConnectivities(edge_node), + components.Mesh1DConnectivities(edge_node), self.mesh.all_connectivities, ) @@ -796,7 +780,7 @@ def test_add_coords(self): edge_kwargs = {"edge_x": self.EDGE_LON, "edge_y": self.EDGE_LAT} self.mesh.add_coords(**edge_kwargs) self.assertEqual( - mesh.MeshEdgeCoords(**edge_kwargs), + components.MeshEdgeCoords(**edge_kwargs), self.mesh.edge_coords, ) @@ -813,11 +797,11 @@ def test_add_coords(self): } self.mesh.add_coords(**node_kwargs, **edge_kwargs) self.assertEqual( - mesh.MeshNodeCoords(**node_kwargs), + components.MeshNodeCoords(**node_kwargs), self.mesh.node_coords, ) self.assertEqual( - mesh.MeshEdgeCoords(**edge_kwargs), + components.MeshEdgeCoords(**edge_kwargs), self.mesh.edge_coords, ) @@ -858,17 +842,17 @@ def test_add_coords_invalid(self): def test_add_coords_single(self): # ADD coord. edge_x = self.EDGE_LON - expected = mesh.MeshEdgeCoords(edge_x=edge_x, edge_y=None) + expected = components.MeshEdgeCoords(edge_x=edge_x, edge_y=None) self.mesh.add_coords(edge_x=edge_x) self.assertEqual(expected, self.mesh.edge_coords) # REPLACE coords. node_x = self.new_coord(self.NODE_LON) edge_x = self.new_coord(self.EDGE_LON) - expected_nodes = mesh.MeshNodeCoords( + expected_nodes = components.MeshNodeCoords( node_x=node_x, node_y=self.mesh.node_coords.node_y ) - expected_edges = mesh.MeshEdgeCoords(edge_x=edge_x, edge_y=None) + expected_edges = components.MeshEdgeCoords(edge_x=edge_x, edge_y=None) self.mesh.add_coords(node_x=node_x, edge_x=edge_x) self.assertEqual(expected_nodes, self.mesh.node_coords) self.assertEqual(expected_edges, self.mesh.edge_coords) @@ -892,14 +876,14 @@ def test_add_coords_single_face(self): def test_dimension_names(self): # Test defaults. - default = mesh.Mesh1DNames("Mesh1d_node", "Mesh1d_edge") + default = components.Mesh1DNames("Mesh1d_node", "Mesh1d_edge") self.assertEqual(default, self.mesh.dimension_names()) log_regex = r"Not setting face_dimension.*" with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): self.mesh.dimension_names("foo", "bar", "baz") self.assertEqual( - mesh.Mesh1DNames("foo", "bar"), + components.Mesh1DNames("foo", "bar"), self.mesh.dimension_names(), ) @@ -943,7 +927,9 @@ def test_remove_connectivities(self): {"contains_edge": True, "contains_node": True}, ) - fake_connectivity = tests.mock.Mock(__class__=mesh.Connectivity, cf_role="fake") + fake_connectivity = tests.mock.Mock( + __class__=components.Connectivity, cf_role="fake" + ) negative_kwargs = ( {"item": fake_connectivity}, {"item": "foo"}, @@ -1020,7 +1006,7 @@ def test_to_MeshCoord(self): location = "node" axis = "x" result = self.mesh.to_MeshCoord(location, axis) - self.assertIsInstance(result, mesh.MeshCoord) + self.assertIsInstance(result, components.MeshCoord) self.assertEqual(location, result.location) self.assertEqual(axis, result.axis) @@ -1037,7 +1023,7 @@ def test_to_MeshCoords(self): self.assertEqual(len(self.mesh.AXES), len(result)) for ix, axis in enumerate(self.mesh.AXES): coord = result[ix] - self.assertIsInstance(coord, mesh.MeshCoord) + self.assertIsInstance(coord, components.MeshCoord) self.assertEqual(location, coord.location) self.assertEqual(axis, coord.axis) @@ -1049,7 +1035,7 @@ def test_to_MeshCoords_face(self): class TestOperations2D(TestOperations1D): # Additional/specialised tests for topology_dimension=2. def setUp(self): - self.mesh = mesh.Mesh( + self.mesh = components.MeshXY( topology_dimension=2, node_coords_and_axes=((self.NODE_LON, "x"), (self.NODE_LAT, "y")), connectivities=(self.FACE_NODE), @@ -1064,7 +1050,7 @@ def test_add_connectivities(self): "edge_face": self.EDGE_FACE, "boundary_node": self.BOUNDARY_NODE, } - expected = mesh.Mesh2DConnectivities( + expected = components.Mesh2DConnectivities( face_node=self.mesh.face_node_connectivity, **kwargs ) self.mesh.add_connectivities(*kwargs.values()) @@ -1078,7 +1064,7 @@ def test_add_connectivities(self): kwargs = {k: self.new_connectivity(v, new_len) for k, v in kwargs.items()} self.mesh.add_connectivities(*kwargs.values()) self.assertEqual( - mesh.Mesh2DConnectivities(**kwargs), + components.Mesh2DConnectivities(**kwargs), self.mesh.all_connectivities, ) @@ -1106,7 +1092,7 @@ def test_add_connectivities_inconsistent(self): ) def test_add_connectivities_invalid(self): - fake_cf_role = tests.mock.Mock(__class__=mesh.Connectivity, cf_role="foo") + fake_cf_role = tests.mock.Mock(__class__=components.Connectivity, cf_role="foo") log_regex = r"Not adding connectivity.*" with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): self.mesh.add_connectivities(fake_cf_role) @@ -1116,7 +1102,7 @@ def test_add_coords_face(self): kwargs = {"face_x": self.FACE_LON, "face_y": self.FACE_LAT} self.mesh.add_coords(**kwargs) self.assertEqual( - mesh.MeshFaceCoords(**kwargs), + components.MeshFaceCoords(**kwargs), self.mesh.face_coords, ) @@ -1129,20 +1115,20 @@ def test_add_coords_face(self): } self.mesh.add_coords(**kwargs) self.assertEqual( - mesh.MeshFaceCoords(**kwargs), + components.MeshFaceCoords(**kwargs), self.mesh.face_coords, ) def test_add_coords_single_face(self): # ADD coord. face_x = self.FACE_LON - expected = mesh.MeshFaceCoords(face_x=face_x, face_y=None) + expected = components.MeshFaceCoords(face_x=face_x, face_y=None) self.mesh.add_coords(face_x=face_x) self.assertEqual(expected, self.mesh.face_coords) # REPLACE coord. face_x = self.new_coord(self.FACE_LON) - expected = mesh.MeshFaceCoords(face_x=face_x, face_y=None) + expected = components.MeshFaceCoords(face_x=face_x, face_y=None) self.mesh.add_coords(face_x=face_x) self.assertEqual(expected, self.mesh.face_coords) @@ -1157,12 +1143,12 @@ def test_add_coords_single_face(self): def test_dimension_names(self): # Test defaults. - default = mesh.Mesh2DNames("Mesh2d_node", "Mesh2d_edge", "Mesh2d_face") + default = components.Mesh2DNames("Mesh2d_node", "Mesh2d_edge", "Mesh2d_face") self.assertEqual(default, self.mesh.dimension_names()) self.mesh.dimension_names("foo", "bar", "baz") self.assertEqual( - mesh.Mesh2DNames("foo", "bar", "baz"), + components.Mesh2DNames("foo", "bar", "baz"), self.mesh.dimension_names(), ) @@ -1196,7 +1182,7 @@ def test_remove_coords(self): super().test_remove_coords() self.mesh.add_coords(face_x=self.FACE_LON) self.assertEqual(self.FACE_LON, self.mesh.face_coords.face_x) - self.mesh.remove_coords(include_faces=True) + self.mesh.remove_coords(location="face") self.assertEqual(None, self.mesh.face_coords.face_x) def test_to_MeshCoord_face(self): @@ -1204,7 +1190,7 @@ def test_to_MeshCoord_face(self): location = "face" axis = "x" result = self.mesh.to_MeshCoord(location, axis) - self.assertIsInstance(result, mesh.MeshCoord) + self.assertIsInstance(result, components.MeshCoord) self.assertEqual(location, result.location) self.assertEqual(axis, result.axis) @@ -1215,7 +1201,7 @@ def test_to_MeshCoords_face(self): self.assertEqual(len(self.mesh.AXES), len(result)) for ix, axis in enumerate(self.mesh.AXES): coord = result[ix] - self.assertIsInstance(coord, mesh.MeshCoord) + self.assertIsInstance(coord, components.MeshCoord) self.assertEqual(location, coord.location) self.assertEqual(axis, coord.axis) @@ -1233,7 +1219,7 @@ def test_invalid_topology(self): self.assertRaisesRegex( ValueError, "Expected 'topology_dimension'.*", - mesh.Mesh, + components.MeshXY, **kwargs, ) @@ -1245,7 +1231,7 @@ def test_invalid_axes(self): self.assertRaisesRegex( ValueError, "Invalid axis specified for node.*", - mesh.Mesh, + components.MeshXY, node_coords_and_axes=( (self.NODE_LON, "foo"), (self.NODE_LAT, "y"), @@ -1259,14 +1245,14 @@ def test_invalid_axes(self): self.assertRaisesRegex( ValueError, "Invalid axis specified for edge.*", - mesh.Mesh, + components.MeshXY, edge_coords_and_axes=((self.EDGE_LON, "foo"),), **kwargs, ) self.assertRaisesRegex( ValueError, "Invalid axis specified for face.*", - mesh.Mesh, + components.MeshXY, face_coords_and_axes=((self.FACE_LON, "foo"),), **kwargs, ) @@ -1286,7 +1272,7 @@ def test_minimum_connectivities(self): self.assertRaisesRegex( ValueError, ".*requires a edge_node_connectivity.*", - mesh.Mesh, + components.MeshXY, **kwargs, ) @@ -1300,7 +1286,7 @@ def test_minimum_coords(self): self.assertRaisesRegex( ValueError, ".*is a required coordinate.*", - mesh.Mesh, + components.MeshXY, **kwargs, ) diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py b/lib/iris/tests/unit/mesh/components/test_MeshXY__from_coords.py similarity index 95% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py rename to lib/iris/tests/unit/mesh/components/test_MeshXY__from_coords.py index 31c5dbfcc0..8114fbe92e 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py +++ b/lib/iris/tests/unit/mesh/components/test_MeshXY__from_coords.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :meth:`iris.experimental.ugrid.mesh.Mesh.from_coords`.""" +"""Unit tests for the :meth:`iris.mesh.MeshXY.from_coords`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -10,8 +11,7 @@ import numpy as np from iris.coords import AuxCoord, DimCoord -from iris.experimental.ugrid import logger -from iris.experimental.ugrid.mesh import Connectivity, Mesh +from iris.mesh import Connectivity, MeshXY, logger from iris.tests.stock import simple_2d_w_multidim_coords @@ -38,7 +38,7 @@ def setUp(self): ) def create(self): - return Mesh.from_coords(self.lon, self.lat) + return MeshXY.from_coords(self.lon, self.lat) def test_dimensionality(self): mesh = self.create() @@ -206,7 +206,7 @@ def test_no_bounds(self): lon = AuxCoord(points=[0.5, 1.5, 2.5]) lat = AuxCoord(points=[0, 1, 2]) with self.assertRaisesRegex(ValueError, "bounds missing from"): - _ = Mesh.from_coords(lon, lat) + _ = MeshXY.from_coords(lon, lat) def test_1_bound(self): lon = AuxCoord(points=[0.5, 1.5, 2.5], bounds=[[0], [1], [2]]) @@ -214,7 +214,7 @@ def test_1_bound(self): with self.assertRaisesRegex( ValueError, r"Expected coordinate bounds.shape \(n, >=2\)" ): - _ = Mesh.from_coords(lon, lat) + _ = MeshXY.from_coords(lon, lat) class TestInvalidPoints(tests.IrisTest): @@ -224,4 +224,4 @@ def test_2d_coord(self): cube = simple_2d_w_multidim_coords()[:3, :3] coord_1, coord_2 = cube.coords() with self.assertRaisesRegex(ValueError, "Expected coordinate ndim == 1"): - _ = Mesh.from_coords(coord_1, coord_2) + _ = MeshXY.from_coords(coord_1, coord_2) diff --git a/lib/iris/tests/unit/mesh/utils/__init__.py b/lib/iris/tests/unit/mesh/utils/__init__.py new file mode 100644 index 0000000000..5a252f1529 --- /dev/null +++ b/lib/iris/tests/unit/mesh/utils/__init__.py @@ -0,0 +1,5 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.mesh.utils` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py b/lib/iris/tests/unit/mesh/utils/test_recombine_submeshes.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py rename to lib/iris/tests/unit/mesh/utils/test_recombine_submeshes.py index f01dc345fa..5323dd5883 100644 --- a/lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py +++ b/lib/iris/tests/unit/mesh/utils/test_recombine_submeshes.py @@ -2,7 +2,8 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for :func:`iris.experimental.ugrid.utils.recombine_submeshes`.""" +"""Unit tests for :func:`iris.mesh.utils.recombine_submeshes`.""" + # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -12,7 +13,7 @@ from iris.coords import AuxCoord from iris.cube import CubeList -from iris.experimental.ugrid.utils import recombine_submeshes +from iris.mesh.utils import recombine_submeshes from iris.tests.stock.mesh import sample_mesh, sample_mesh_cube diff --git a/lib/iris/tests/unit/plot/test_pcolormesh.py b/lib/iris/tests/unit/plot/test_pcolormesh.py index 11c54b06cb..9a9fa19ae0 100644 --- a/lib/iris/tests/unit/plot/test_pcolormesh.py +++ b/lib/iris/tests/unit/plot/test_pcolormesh.py @@ -3,6 +3,11 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris.plot.pcolormesh` function.""" + +# Import iris.tests first so that some things can be initialised before +# importing anything else. +from typing import Any + from iris.tests import _shared_utils from iris.tests.unit.plot import TestGraphicStringCoord from iris.tests.unit.plot._blockplot_common import ( @@ -32,7 +37,7 @@ def blockplot_func(self): @_shared_utils.skip_plot class Test2dContigTol(Mixin2dCoordsContigTol): # Extra call kwargs expected -- unlike 'pcolor', there are none. - additional_kwargs = {} + additional_kwargs: dict[str, Any] = {} def blockplot_func(self): return PLOT_FUNCTION_TO_TEST diff --git a/lib/iris/tests/unit/representation/cube_printout/test_CubePrintout.py b/lib/iris/tests/unit/representation/cube_printout/test_CubePrintout.py index d7b617d848..e3ee535346 100644 --- a/lib/iris/tests/unit/representation/cube_printout/test_CubePrintout.py +++ b/lib/iris/tests/unit/representation/cube_printout/test_CubePrintout.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for :class:`iris._representation.cube_printout.CubePrintout`.""" + import iris.tests as tests # isort:skip import numpy as np @@ -124,9 +125,9 @@ def test_columns_long_coordname(self): def test_columns_long_attribute(self): cube = Cube([0], long_name="short", units=1) - cube.attributes[ - "very_very_very_very_very_long_name" - ] = "longish string extends beyond dim columns" + cube.attributes["very_very_very_very_very_long_name"] = ( + "longish string extends beyond dim columns" + ) rep = cube_replines(cube) expected = [ "short / (1) (-- : 1)", diff --git a/lib/iris/tests/unit/representation/cube_printout/test_Table.py b/lib/iris/tests/unit/representation/cube_printout/test_Table.py index 0e00da7c42..6c765516b1 100644 --- a/lib/iris/tests/unit/representation/cube_printout/test_Table.py +++ b/lib/iris/tests/unit/representation/cube_printout/test_Table.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for :class:`iris._representation.cube_printout.Table`.""" + from iris._representation.cube_printout import Table import iris.tests as tests diff --git a/lib/iris/tests/unit/representation/cube_summary/test_CubeSummary.py b/lib/iris/tests/unit/representation/cube_summary/test_CubeSummary.py index 74b24899b1..ec568ed13d 100644 --- a/lib/iris/tests/unit/representation/cube_summary/test_CubeSummary.py +++ b/lib/iris/tests/unit/representation/cube_summary/test_CubeSummary.py @@ -4,13 +4,12 @@ # See LICENSE in the root of the repository for full licensing details. """Unit tests for :class:`iris._representation.cube_summary.CubeSummary`.""" -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - +import dask.array as da import numpy as np +import pytest from iris._representation.cube_summary import CubeSummary +from iris.aux_factory import HybridHeightFactory from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, CellMethod, DimCoord from iris.cube import Cube from iris.tests.stock.mesh import sample_mesh_cube @@ -29,8 +28,9 @@ def example_cube(): return cube -class Test_CubeSummary(tests.IrisTest): - def setUp(self): +class Test_CubeSummary: + @pytest.fixture(autouse=True) + def _setup(self): self.cube = example_cube() def test_header(self): @@ -38,15 +38,15 @@ def test_header(self): header_left = rep.header.nameunit header_right = rep.header.dimension_header.contents - self.assertEqual(header_left, "air_temperature / (K)") - self.assertEqual(header_right, ["latitude: 3", "-- : 2"]) + assert header_left == "air_temperature / (K)" + assert header_right == ["latitude: 3", "-- : 2"] def test_blank_cube(self): cube = Cube([1, 2]) rep = CubeSummary(cube) - self.assertEqual(rep.header.nameunit, "unknown / (unknown)") - self.assertEqual(rep.header.dimension_header.contents, ["-- : 2"]) + assert rep.header.nameunit == "unknown / (unknown)" + assert rep.header.dimension_header.contents == ["-- : 2"] expected_vector_sections = [ "Dimension coordinates:", @@ -56,11 +56,11 @@ def test_blank_cube(self): "Cell measures:", "Ancillary variables:", ] - self.assertEqual(list(rep.vector_sections.keys()), expected_vector_sections) + assert list(rep.vector_sections.keys()) == expected_vector_sections for title in expected_vector_sections: vector_section = rep.vector_sections[title] - self.assertEqual(vector_section.contents, []) - self.assertTrue(vector_section.is_empty()) + assert vector_section.contents == [] + assert vector_section.is_empty() expected_scalar_sections = [ "Mesh:", @@ -71,18 +71,18 @@ def test_blank_cube(self): "Attributes:", ] - self.assertEqual(list(rep.scalar_sections.keys()), expected_scalar_sections) + assert list(rep.scalar_sections.keys()) == expected_scalar_sections for title in expected_scalar_sections: scalar_section = rep.scalar_sections[title] - self.assertEqual(scalar_section.contents, []) - self.assertTrue(scalar_section.is_empty()) + assert scalar_section.contents == [] + assert scalar_section.is_empty() def test_vector_coord(self): rep = CubeSummary(self.cube) dim_section = rep.vector_sections["Dimension coordinates:"] - self.assertEqual(len(dim_section.contents), 1) - self.assertFalse(dim_section.is_empty()) + assert len(dim_section.contents) == 1 + assert not dim_section.is_empty() dim_summary = dim_section.contents[0] @@ -90,9 +90,9 @@ def test_vector_coord(self): dim_chars = dim_summary.dim_chars extra = dim_summary.extra - self.assertEqual(name, "latitude") - self.assertEqual(dim_chars, ["x", "-"]) - self.assertEqual(extra, "") + assert name == "latitude" + assert dim_chars == ["x", "-"] + assert extra == "" def test_scalar_coord(self): cube = self.cube @@ -114,30 +114,83 @@ def test_scalar_coord(self): scalar_section = rep.scalar_sections["Scalar coordinates:"] - self.assertEqual(len(scalar_section.contents), 4) + assert len(scalar_section.contents) == 4 no_bounds_summary = scalar_section.contents[0] bounds_summary = scalar_section.contents[1] text_summary_simple = scalar_section.contents[2] text_summary_awkward = scalar_section.contents[3] - self.assertEqual(no_bounds_summary.name, "bar") - self.assertEqual(no_bounds_summary.content, "10 K") - self.assertEqual(no_bounds_summary.extra, "") + assert no_bounds_summary.name == "bar" + assert no_bounds_summary.content == "10 K" + assert no_bounds_summary.extra == "" + + assert bounds_summary.name == "foo" + assert bounds_summary.content == "10 K, bound=(5, 15) K" + assert bounds_summary.extra == "" + + assert text_summary_simple.name == "foo" + assert text_summary_simple.content == "this and that" + assert text_summary_simple.lines == ["this and that"] + assert text_summary_simple.extra == "key=42, key2='value-str'" + + assert text_summary_awkward.name == "foo_2" + assert text_summary_awkward.content == r"'a is\nb\n and c'" + assert text_summary_awkward.lines == ["a is", "b", " and c"] + assert text_summary_awkward.extra == "" + + @pytest.mark.parametrize("bounds", ["withbounds", "nobounds"]) + def test_lazy_scalar_coord(self, bounds): + """Check when we print 'lazy' instead of values for a lazy scalar coord.""" + coord = AuxCoord(da.ones((), dtype=float), long_name="foo") + if bounds == "withbounds": + # These might be real or lazy -- it makes no difference. + coord.bounds = np.arange(2.0) + cube = Cube([0.0], aux_coords_and_dims=[(coord, ())]) + + rep = CubeSummary(cube) - self.assertEqual(bounds_summary.name, "foo") - self.assertEqual(bounds_summary.content, "10 K, bound=(5, 15) K") - self.assertEqual(bounds_summary.extra, "") + summary = rep.scalar_sections["Scalar coordinates:"].contents[0] + assert summary.name == "foo" + expect_content = "" + if bounds == "withbounds": + expect_content += "+bound" + assert summary.content == expect_content + + @pytest.mark.parametrize("deps", ["deps_all_real", "deps_some_lazy"]) + def test_hybrid_scalar_coord(self, deps): + """Check whether we print a value or '', for a hybrid scalar coord.""" + # NOTE: hybrid coords are *always* lazy (at least for now). However, as long as + # no dependencies are lazy, then we print a value rather than "". + + # Construct a test hybrid coord, using HybridHeight as a template because that + # is both a common case and a fairly simple one (only 3 dependencies). + # Note: *not* testing with bounds, since lazy bounds always print the same way. + all_deps_real = deps == "deps_all_real" + aux_coords = [ + AuxCoord(1.0, long_name=name, units=units) + for name, units in (("delta", "m"), ("sigma", "1"), ("orography", "m")) + ] + if not all_deps_real: + # Make one dependency lazy + aux_coords[0].points = aux_coords[0].lazy_points() + + cube = Cube( + [0.0], + aux_coords_and_dims=[(co, ()) for co in aux_coords], + aux_factories=[HybridHeightFactory(*aux_coords)], + ) - self.assertEqual(text_summary_simple.name, "foo") - self.assertEqual(text_summary_simple.content, "this and that") - self.assertEqual(text_summary_simple.lines, ["this and that"]) - self.assertEqual(text_summary_simple.extra, "key=42, key2='value-str'") + rep = CubeSummary(cube) - self.assertEqual(text_summary_awkward.name, "foo_2") - self.assertEqual(text_summary_awkward.content, r"'a is\nb\n and c'") - self.assertEqual(text_summary_awkward.lines, ["a is", "b", " and c"]) - self.assertEqual(text_summary_awkward.extra, "") + summary = rep.scalar_sections["Scalar coordinates:"].contents[0] + assert summary.name == "altitude" + # Check that the result shows lazy with lazy deps, or value when all real + if all_deps_real: + expect_content = "2.0 m" + else: + expect_content = " m" + assert summary.content == expect_content def test_cell_measure(self): cube = self.cube @@ -146,11 +199,11 @@ def test_cell_measure(self): rep = CubeSummary(cube) cm_section = rep.vector_sections["Cell measures:"] - self.assertEqual(len(cm_section.contents), 1) + assert len(cm_section.contents) == 1 cm_summary = cm_section.contents[0] - self.assertEqual(cm_summary.name, "foo") - self.assertEqual(cm_summary.dim_chars, ["x", "-"]) + assert cm_summary.name == "foo" + assert cm_summary.dim_chars == ["x", "-"] def test_ancillary_variable(self): cube = self.cube @@ -159,11 +212,11 @@ def test_ancillary_variable(self): rep = CubeSummary(cube) av_section = rep.vector_sections["Ancillary variables:"] - self.assertEqual(len(av_section.contents), 1) + assert len(av_section.contents) == 1 av_summary = av_section.contents[0] - self.assertEqual(av_summary.name, "foo") - self.assertEqual(av_summary.dim_chars, ["x", "-"]) + assert av_summary.name == "foo" + assert av_summary.dim_chars == ["x", "-"] def test_attributes(self): cube = self.cube @@ -180,7 +233,7 @@ def test_attributes(self): # Note: a string with \n or \t in it gets "repr-d". # Other strings don't (though in coord 'extra' lines, they do.) - self.assertEqual(attribute_contents, expected_contents) + assert attribute_contents == expected_contents def test_cell_methods(self): cube = self.cube @@ -194,25 +247,25 @@ def test_cell_methods(self): rep = CubeSummary(cube) cell_method_section = rep.scalar_sections["Cell methods:"] expected_contents = ["0: x: y: mean", "1: x: mean"] - self.assertEqual(cell_method_section.contents, expected_contents) + assert cell_method_section.contents == expected_contents def test_scalar_cube(self): cube = self.cube while cube.ndim > 0: cube = cube[0] rep = CubeSummary(cube) - self.assertEqual(rep.header.nameunit, "air_temperature / (K)") - self.assertTrue(rep.header.dimension_header.scalar) - self.assertEqual(rep.header.dimension_header.dim_names, []) - self.assertEqual(rep.header.dimension_header.shape, []) - self.assertEqual(rep.header.dimension_header.contents, ["scalar cube"]) - self.assertEqual(len(rep.vector_sections), 6) - self.assertTrue(all(sect.is_empty() for sect in rep.vector_sections.values())) - self.assertEqual(len(rep.scalar_sections), 6) - self.assertEqual(len(rep.scalar_sections["Scalar coordinates:"].contents), 1) - self.assertTrue(rep.scalar_sections["Scalar cell measures:"].is_empty()) - self.assertTrue(rep.scalar_sections["Attributes:"].is_empty()) - self.assertTrue(rep.scalar_sections["Cell methods:"].is_empty()) + assert rep.header.nameunit == "air_temperature / (K)" + assert rep.header.dimension_header.scalar + assert rep.header.dimension_header.dim_names == [] + assert rep.header.dimension_header.shape == [] + assert rep.header.dimension_header.contents == ["scalar cube"] + assert len(rep.vector_sections) == 6 + assert all(sect.is_empty() for sect in rep.vector_sections.values()) + assert len(rep.scalar_sections) == 6 + assert len(rep.scalar_sections["Scalar coordinates:"].contents) == 1 + assert rep.scalar_sections["Scalar cell measures:"].is_empty() + assert rep.scalar_sections["Attributes:"].is_empty() + assert rep.scalar_sections["Cell methods:"].is_empty() def test_coord_attributes(self): cube = self.cube @@ -225,8 +278,8 @@ def test_coord_attributes(self): co1_summ = rep.vector_sections["Dimension coordinates:"].contents[0] co2_summ = rep.vector_sections["Auxiliary coordinates:"].contents[0] # Notes: 'b' is same so does not appear; sorted order; quoted strings. - self.assertEqual(co1_summ.extra, "a=1") - self.assertEqual(co2_summ.extra, "a=7, text='ok', text2='multi\\nline', z=77") + assert co1_summ.extra == "a=1" + assert co2_summ.extra == "a=7, text='ok', text2='multi\\nline', z=77" def test_array_attributes(self): cube = self.cube @@ -238,8 +291,8 @@ def test_array_attributes(self): rep = CubeSummary(cube) co1_summ = rep.vector_sections["Dimension coordinates:"].contents[0] co2_summ = rep.vector_sections["Auxiliary coordinates:"].contents[0] - self.assertEqual(co1_summ.extra, "array=array([1.2, 3. ])") - self.assertEqual(co2_summ.extra, "array=array([3.2, 1. ]), b=2") + assert co1_summ.extra == "array=array([1.2, 3. ])" + assert co2_summ.extra == "array=array([3.2, 1. ]), b=2" def test_attributes_subtle_differences(self): cube = Cube([0]) @@ -281,14 +334,14 @@ def test_attributes_subtle_differences(self): rep = CubeSummary(cube) co_summs = rep.scalar_sections["Scalar coordinates:"].contents co1a_summ, co1b_summ = co_summs[0:2] - self.assertEqual(co1a_summ.extra, "arr2=array([1, 2])") - self.assertEqual(co1b_summ.extra, "arr2=[1, 2]") + assert co1a_summ.extra == "arr2=array([1, 2])" + assert co1b_summ.extra == "arr2=[1, 2]" co2a_summ, co2b_summ = co_summs[2:4] - self.assertEqual(co2a_summ.extra, "arr2=array([3, 4])") - self.assertEqual(co2b_summ.extra, "arr2=array([3., 4.])") + assert co2a_summ.extra == "arr2=array([3, 4])" + assert co2b_summ.extra == "arr2=array([3., 4.])" co3a_summ, co3b_summ = co_summs[4:6] - self.assertEqual(co3a_summ.extra, "arr1=array([5, 6])") - self.assertEqual(co3b_summ.extra, "arr1=array([[5], [6]])") + assert co3a_summ.extra == "arr1=array([5, 6])" + assert co3b_summ.extra == "arr1=array([[5], [6]])" def test_unstructured_cube(self): cube = sample_mesh_cube() @@ -297,10 +350,6 @@ def test_unstructured_cube(self): dim_section = rep.vector_sections["Dimension coordinates:"] mesh_section = rep.vector_sections["Mesh coordinates:"] aux_section = rep.vector_sections["Auxiliary coordinates:"] - self.assertEqual(len(dim_section.contents), 2) - self.assertEqual(len(mesh_section.contents), 2) - self.assertEqual(len(aux_section.contents), 1) - - -if __name__ == "__main__": - tests.main() + assert len(dim_section.contents) == 2 + assert len(mesh_section.contents) == 2 + assert len(aux_section.contents) == 1 diff --git a/lib/iris/tests/unit/test_LoadPolicy.py b/lib/iris/tests/unit/test_LoadPolicy.py new file mode 100644 index 0000000000..8772b089c1 --- /dev/null +++ b/lib/iris/tests/unit/test_LoadPolicy.py @@ -0,0 +1,144 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.io.loading.LoadPolicy` package.""" + +from unittest import mock + +import pytest + +from iris import LoadPolicy + + +class TestInit: + def test_init_empty(self): + # Check how a bare init works + options = LoadPolicy() + assert options.settings() == LoadPolicy.SETTINGS["default"] + + def test_init_args_kwargs(self): + # Check that init with args, kwargs equates to a pair of set() calls. + with mock.patch("iris.LoadPolicy.set") as mock_set: + test_option = mock.sentinel.option + test_kwargs = {"junk": "invalid"} + LoadPolicy(options=test_option, **test_kwargs) + assert mock_set.call_args_list == [ + mock.call("default"), + mock.call(test_option, **test_kwargs), + ] + + +class Test_settings: + """The .settings() returns a dict full of the settings.""" + + def test_settings(self): + options = LoadPolicy() + settings = options.settings() + assert isinstance(settings, dict) + assert tuple(settings.keys()) == LoadPolicy.OPTION_KEYS + for key in LoadPolicy.OPTION_KEYS: + assert settings[key] == getattr(options, key) + + +class Test_set: + """Check the .set(arg, **kwargs) behaviour.""" + + def test_empty(self): + options = LoadPolicy() + orig_settings = options.settings() + options.set() + assert options.settings() == orig_settings + + def test_arg_dict(self): + options = LoadPolicy() + assert options.settings()["merge_concat_sequence"] == "m" + assert options.settings()["repeat_until_unchanged"] is False + options.set({"merge_concat_sequence": "c", "repeat_until_unchanged": True}) + assert options.settings()["merge_concat_sequence"] == "c" + assert options.settings()["repeat_until_unchanged"] is True + + def test_arg_string(self): + options = LoadPolicy() + assert options.settings()["merge_concat_sequence"] == "m" + assert options.settings()["repeat_until_unchanged"] is False + options.set("comprehensive") + assert options.settings()["merge_concat_sequence"] == "mc" + assert options.settings()["repeat_until_unchanged"] is True + + def test_arg_bad_dict(self): + options = LoadPolicy() + expected = "Unknown options.*'junk'.* : valid options are" + with pytest.raises(ValueError, match=expected): + options.set({"junk": "invalid"}) + + def test_arg_bad_string(self): + options = LoadPolicy() + expected = "Invalid arg options='unknown' : must be a dict, or one of" + with pytest.raises(TypeError, match=expected): + options.set("unknown") + + def test_arg_bad_type(self): + options = LoadPolicy() + expected = "must be a dict, or one of" + with pytest.raises(TypeError, match=expected): + options.set((1, 2, 3)) + + def test_kwargs(self): + options = LoadPolicy() + assert options.settings()["merge_concat_sequence"] == "m" + assert options.settings()["repeat_until_unchanged"] is False + options.set(merge_concat_sequence="c", repeat_until_unchanged=True) + assert options.settings()["merge_concat_sequence"] == "c" + assert options.settings()["repeat_until_unchanged"] is True + + def test_arg_kwargs(self): + # Show that kwargs override arg + options = LoadPolicy( + support_multiple_references=False, + merge_concat_sequence="", + repeat_until_unchanged=False, + ) + options.set( + dict(merge_concat_sequence="c", repeat_until_unchanged=True), + merge_concat_sequence="mc", + ) + assert options.merge_concat_sequence == "mc" + assert options.repeat_until_unchanged is True + + def test_bad_kwarg(self): + options = LoadPolicy() + expected = "Unknown options.*'junk'.* : valid options are" + with pytest.raises(ValueError, match=expected): + options.set({"junk": "invalid"}) + + +class Test_AttributeAccess: + """Check operation of direct property access (with ".").""" + + def test_getattr(self): + options = LoadPolicy(merge_concat_sequence="m") + assert options.merge_concat_sequence == "m" + + def test_getattr_badname(self): + options = LoadPolicy() + expected = "'LoadPolicy' object has no attribute 'unknown'" + with pytest.raises(AttributeError, match=expected): + options.unknown + + def test_setattr(self): + options = LoadPolicy(merge_concat_sequence="m") + options.merge_concat_sequence = "mc" + assert options.merge_concat_sequence == "mc" + + def test_setattr_badname(self): + options = LoadPolicy() + expected = "LoadPolicy object has no property 'anyold_property'" + with pytest.raises(KeyError, match=expected): + options.anyold_property = "x" + + def test_setattr_badvalue(self): + options = LoadPolicy() + expected = "'mcm' is not a valid.*merge_concat_sequence : must be one of" + with pytest.raises(ValueError, match=expected): + options.merge_concat_sequence = "mcm" diff --git a/lib/iris/tests/unit/test_combine_cubes.py b/lib/iris/tests/unit/test_combine_cubes.py new file mode 100644 index 0000000000..e159582497 --- /dev/null +++ b/lib/iris/tests/unit/test_combine_cubes.py @@ -0,0 +1,89 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :func:`iris.io.loading.combine_cubes` function. + +Note: These tests are fairly extensive to cover functional uses within the loading +operations. +TODO: when function is public API, extend testing to the extended API options, +i.e. different types + defaulting of the 'options' arg, and **kwargs support. +""" + +import pytest + +from iris import LoadPolicy, _combine_cubes +from iris.tests.unit.fileformats.test_load_functions import cu + + +@pytest.fixture(params=list(LoadPolicy.SETTINGS.keys())) +def options(request): + # N.B. "request" is a standard PyTest fixture + return request.param # Return the name of the attribute to test. + + +# Interface to convert settings-name / kwargs into an options dict, +# TODO: remove this wrapper when the API of "combine_cubes" is opened up. +def combine_cubes(cubes, settings_name="default", **kwargs): + options = LoadPolicy.SETTINGS[settings_name] + options.update(kwargs) + return _combine_cubes(cubes, options, merge_require_unique=False) + + +class Test: + def test_mergeable(self, options): + c1, c2 = cu(t=1), cu(t=2) + c12 = cu(t=(1, 2)) + input_cubes = [c1, c2] + result = combine_cubes(input_cubes, options) + expected = [c12] # same in all cases + assert result == expected + + def test_catable(self, options): + c1, c2 = cu(t=(1, 2)), cu(t=(3, 4)) + c12 = cu(t=(1, 2, 3, 4)) + input_cubes = [c1, c2] + result = combine_cubes(input_cubes, options) + expected = { + "legacy": [c1, c2], # standard options can't do this .. + "default": [c1, c2], + "recommended": [c12], # .. but it works if you enable concatenate + "comprehensive": [c12], + }[options] + assert result == expected + + def test_cat_enables_merge(self, options): + c1, c2 = cu(t=(1, 2), z=1), cu(t=(3, 4, 5), z=1) + c3, c4 = cu(t=(1, 2, 3), z=2), cu(t=(4, 5), z=2) + c1234 = cu(t=(1, 2, 3, 4, 5), z=(1, 2)) + c12 = cu(t=(1, 2, 3, 4, 5), z=1) + c34 = cu(t=(1, 2, 3, 4, 5), z=2) + input_cubes = [c1, c2, c3, c4] + result = combine_cubes(input_cubes, options) + expected = { + "legacy": input_cubes, + "default": input_cubes, + "recommended": [c12, c34], # standard "mc" sequence can't do this one.. + "comprehensive": [c1234], # .. but works if you repeat + }[options] + assert result == expected + + def test_cat_enables_merge__custom(self): + c1, c2 = cu(t=(1, 2), z=1), cu(t=(3, 4, 5), z=1) + c3, c4 = cu(t=(1, 2, 3), z=2), cu(t=(4, 5), z=2) + c1234 = cu(t=(1, 2, 3, 4, 5), z=(1, 2)) + input_cubes = [c1, c2, c3, c4] + result = combine_cubes(input_cubes, merge_concat_sequence="cm") + assert result == [c1234] + + def test_nocombine_overlapping(self, options): + c1, c2 = cu(t=(1, 3)), cu(t=(2, 4)) + input_cubes = [c1, c2] + result = combine_cubes(input_cubes, options) + assert result == input_cubes # same in all cases : can't do this + + def test_nocombine_dim_scalar(self, options): + c1, c2 = cu(t=(1,)), cu(t=2) + input_cubes = [c1, c2] + result = combine_cubes(input_cubes, options) + assert result == input_cubes # can't do this at present diff --git a/lib/iris/tests/unit/tests/stock/test_netcdf.py b/lib/iris/tests/unit/tests/stock/test_netcdf.py index dbdd321663..cccb93d28b 100644 --- a/lib/iris/tests/unit/tests/stock/test_netcdf.py +++ b/lib/iris/tests/unit/tests/stock/test_netcdf.py @@ -8,12 +8,11 @@ import tempfile from iris import load_cube -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid.mesh import Mesh, MeshCoord # Import iris.tests first so that some things can be initialised before # importing anything else. -import iris.tests as tests +import iris.tests as tests # isort:skip +from iris.mesh import MeshCoord, MeshXY from iris.tests.stock import netcdf @@ -38,8 +37,7 @@ def create_synthetic_file(self, **create_kwargs): def create_synthetic_test_cube(self, **create_kwargs): file_path = self.create_synthetic_file(**create_kwargs) - with PARSE_UGRID_ON_LOAD.context(): - cube = load_cube(file_path) + cube = load_cube(file_path) return cube def check_cube(self, cube, shape, location, level): @@ -50,7 +48,7 @@ def check_cube(self, cube, shape, location, level): # Also a few checks on the attached mesh-related information. last_dim = cube.ndim - 1 - self.assertIsInstance(cube.mesh, Mesh) + self.assertIsInstance(cube.mesh, MeshXY) self.assertEqual(cube.mesh_dim(), last_dim) self.assertEqual(cube.location, location) for coord_name in ("longitude", "latitude"): diff --git a/lib/iris/tests/unit/util/test_array_equal.py b/lib/iris/tests/unit/util/test_array_equal.py index 76d869f932..3e1aaf1bfb 100644 --- a/lib/iris/tests/unit/util/test_array_equal.py +++ b/lib/iris/tests/unit/util/test_array_equal.py @@ -40,11 +40,28 @@ def test_nd(self): assert array_equal(array_a, array_b) assert not array_equal(array_a, array_c) - def test_masked_is_ignored(self): + def test_masked_is_not_ignored(self): array_a = ma.masked_array([1, 2, 3], mask=[1, 0, 1]) array_b = ma.masked_array([2, 2, 2], mask=[1, 0, 1]) + assert array_equal(array_a, array_b) + + def test_masked_is_different(self): + array_a = ma.masked_array([1, 2, 3], mask=[1, 0, 1]) + array_b = ma.masked_array([1, 2, 3], mask=[0, 0, 1]) assert not array_equal(array_a, array_b) + def test_masked_isnt_unmasked(self): + array_a = np.array([1, 2, 2]) + array_b = ma.masked_array([1, 2, 2], mask=[0, 0, 1]) + assert not array_equal(array_a, array_b) + + def test_masked_unmasked_equivelance(self): + array_a = np.array([1, 2, 2]) + array_b = ma.masked_array([1, 2, 2]) + array_c = ma.masked_array([1, 2, 2], mask=[0, 0, 0]) + assert array_equal(array_a, array_b) + assert array_equal(array_a, array_c) + def test_fully_masked_arrays(self): array_a = ma.masked_array(np.arange(24).reshape(2, 3, 4), mask=True) array_b = ma.masked_array(np.arange(24).reshape(2, 3, 4), mask=True) diff --git a/lib/iris/tests/unit/util/test_broadcast_to_shape.py b/lib/iris/tests/unit/util/test_broadcast_to_shape.py index 943358fb9e..c18ba22cfb 100644 --- a/lib/iris/tests/unit/util/test_broadcast_to_shape.py +++ b/lib/iris/tests/unit/util/test_broadcast_to_shape.py @@ -18,14 +18,17 @@ class Test_broadcast_to_shape: def test_same_shape(self): # broadcast to current shape should result in no change - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) + b = broadcast_to_shape(a, a.shape, (0, 1)) _shared_utils.assert_array_equal(b, a) def test_added_dimensions(self): # adding two dimensions, on at the front and one in the middle of # the existing dimensions - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) b = broadcast_to_shape(a, (5, 2, 4, 3), (1, 3)) for i in range(5): for j in range(4): @@ -34,7 +37,8 @@ def test_added_dimensions(self): def test_added_dimensions_transpose(self): # adding dimensions and having the dimensions of the input # transposed - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) b = broadcast_to_shape(a, (5, 3, 4, 2), (3, 1)) for i in range(5): for j in range(4): @@ -44,7 +48,8 @@ def test_added_dimensions_transpose(self): def test_lazy_added_dimensions_transpose(self, mocked_compute): # adding dimensions and having the dimensions of the input # transposed - a = da.random.random([2, 3]) + rng = da.random.default_rng() + a = rng.random((2, 3)) b = broadcast_to_shape(a, (5, 3, 4, 2), (3, 1)) mocked_compute.assert_not_called() for i in range(5): @@ -53,7 +58,8 @@ def test_lazy_added_dimensions_transpose(self, mocked_compute): def test_masked(self): # masked arrays are also accepted - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) m = ma.array(a, mask=[[0, 1, 0], [0, 1, 1]]) b = broadcast_to_shape(m, (5, 3, 4, 2), (3, 1)) for i in range(5): @@ -63,7 +69,8 @@ def test_masked(self): @mock.patch.object(dask.base, "compute", wraps=dask.base.compute) def test_lazy_masked(self, mocked_compute): # masked arrays are also accepted - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) m = da.ma.masked_array(a, mask=[[0, 1, 0], [0, 1, 1]]) b = broadcast_to_shape(m, (5, 3, 4, 2), (3, 1)) mocked_compute.assert_not_called() @@ -73,9 +80,35 @@ def test_lazy_masked(self, mocked_compute): b[i, :, j, :].compute().T, m.compute() ) + @mock.patch.object(dask.base, "compute", wraps=dask.base.compute) + def test_lazy_chunks(self, mocked_compute): + # chunks can be specified along with the target shape and are only used + # along new dimensions or on dimensions that have size 1 in the source + # array. + m = da.ma.masked_array( + data=[[1, 2, 3, 4, 5]], + mask=[[0, 1, 0, 0, 0]], + ).rechunk((1, 2)) + b = broadcast_to_shape( + m, + dim_map=(1, 2), + shape=(3, 4, 5), + chunks=( + 1, # used because target is new dim + 2, # used because input size 1 + 3, # not used because broadcast does not rechunk + ), + ) + mocked_compute.assert_not_called() + for i in range(3): + for j in range(4): + self.assertMaskedArrayEqual(b[i, j, :].compute(), m[0].compute()) + assert b.chunks == ((1, 1, 1), (2, 2), (2, 2, 1)) + def test_masked_degenerate(self): # masked arrays can have degenerate masks too - a = np.random.random([2, 3]) + rng = np.random.default_rng() + a = rng.random((2, 3)) m = ma.array(a) b = broadcast_to_shape(m, (5, 3, 4, 2), (3, 1)) for i in range(5): diff --git a/lib/iris/tests/unit/util/test_rolling_window.py b/lib/iris/tests/unit/util/test_rolling_window.py index c52b2af3d9..90a6983cff 100644 --- a/lib/iris/tests/unit/util/test_rolling_window.py +++ b/lib/iris/tests/unit/util/test_rolling_window.py @@ -3,6 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Test function :func:`iris.util.rolling_window`.""" +import dask.array as da import numpy as np import numpy.ma as ma import pytest @@ -32,6 +33,12 @@ def test_2d(self): result = rolling_window(a, window=3, axis=1) _shared_utils.assert_array_equal(result, expected_result) + def test_3d_lazy(self): + a = da.arange(2 * 3 * 4).reshape((2, 3, 4)) + expected_result = np.arange(2 * 3 * 4).reshape((1, 2, 3, 4)) + result = rolling_window(a, window=2, axis=0).compute() + _shared_utils.assert_array_equal(result, expected_result) + def test_1d_masked(self): # 1-d masked array input a = ma.array([0, 1, 2, 3, 4], mask=[0, 0, 1, 0, 0], dtype=np.int32) diff --git a/lib/iris/util.py b/lib/iris/util.py index 020b67783a..a808087fd8 100644 --- a/lib/iris/util.py +++ b/lib/iris/util.py @@ -4,6 +4,8 @@ # See LICENSE in the root of the repository for full licensing details. """Miscellaneous utility functions.""" +from __future__ import annotations + from abc import ABCMeta, abstractmethod from collections.abc import Hashable, Iterable import functools @@ -12,6 +14,7 @@ import os.path import sys import tempfile +from typing import Literal import cf_units from dask import array as da @@ -26,7 +29,7 @@ import iris.exceptions -def broadcast_to_shape(array, shape, dim_map): +def broadcast_to_shape(array, shape, dim_map, chunks=None): """Broadcast an array to a given shape. Each dimension of the array must correspond to a dimension in the @@ -47,6 +50,14 @@ def broadcast_to_shape(array, shape, dim_map): the index in *shape* which the dimension of *array* corresponds to, so the first element of *dim_map* gives the index of *shape* that corresponds to the first dimension of *array* etc. + chunks : :class:`tuple`, optional + If the source array is a :class:`dask.array.Array` and a value is + provided, then the result will use these chunks instead of the same + chunks as the source array. Setting chunks explicitly as part of + broadcast_to_shape is more efficient than rechunking afterwards. See + also :func:`dask.array.broadcast_to`. Note that the values provided + here will only be used along dimensions that are new on the result or + have size 1 on the source array. Examples -------- @@ -69,13 +80,25 @@ def broadcast_to_shape(array, shape, dim_map): See more at :doc:`/userguide/real_and_lazy_data`. """ + if isinstance(array, da.Array): + if chunks is not None: + chunks = list(chunks) + for src_idx, tgt_idx in enumerate(dim_map): + # Only use the specified chunks along new dimensions or on + # dimensions that have size 1 in the source array. + if array.shape[src_idx] != 1: + chunks[tgt_idx] = array.chunks[src_idx] + broadcast = functools.partial(da.broadcast_to, shape=shape, chunks=chunks) + else: + broadcast = functools.partial(np.broadcast_to, shape=shape) + n_orig_dims = len(array.shape) n_new_dims = len(shape) - n_orig_dims array = array.reshape(array.shape + (1,) * n_new_dims) # Get dims in required order. array = np.moveaxis(array, range(n_orig_dims), dim_map) - new_array = np.broadcast_to(array, shape) + new_array = broadcast(array) if ma.isMA(array): # broadcast_to strips masks so we need to handle them explicitly. @@ -83,13 +106,13 @@ def broadcast_to_shape(array, shape, dim_map): if mask is ma.nomask: new_mask = ma.nomask else: - new_mask = np.broadcast_to(mask, shape) + new_mask = broadcast(mask) new_array = ma.array(new_array, mask=new_mask) elif is_lazy_masked_data(array): # broadcast_to strips masks so we need to handle them explicitly. mask = da.ma.getmaskarray(array) - new_mask = da.broadcast_to(mask, shape) + new_mask = broadcast(mask) new_array = da.ma.masked_array(new_array, new_mask) return new_array @@ -191,7 +214,8 @@ def describe_diff(cube_a, cube_b, output_file=None): See Also -------- - :meth:`iris.cube.Cube.is_compatible()` + iris.cube.Cube.is_compatible : + Check if a Cube is compatible with another. """ if output_file is None: @@ -229,7 +253,10 @@ def describe_diff(cube_a, cube_b, output_file=None): ) -def guess_coord_axis(coord): +Axis = Literal["X", "Y", "Z", "T"] + + +def guess_coord_axis(coord) -> Axis | None: """Return a "best guess" axis name of the coordinate. Heuristic categorisation of the coordinate into either label @@ -253,7 +280,7 @@ def guess_coord_axis(coord): :attr:`~iris.coords.Coord.ignore_axis` property on `coord` to ``False``. """ - axis = None + axis: Axis | None = None if hasattr(coord, "ignore_axis") and coord.ignore_axis is True: return axis @@ -281,19 +308,24 @@ def guess_coord_axis(coord): return axis -def rolling_window(a, window=1, step=1, axis=-1): +def rolling_window( + a: np.ndarray | da.Array, + window: int = 1, + step: int = 1, + axis: int = -1, +) -> np.ndarray | da.Array: """Make an ndarray with a rolling window of the last dimension. Parameters ---------- a : array_like - Array to add rolling window to + Array to add rolling window to. window : int, default=1 - Size of rolling window + Size of rolling window. step : int, default=1 - Size of step between rolling windows + Size of step between rolling windows. axis : int, default=-1 - Axis to take the rolling window over + Axis to take the rolling window over. Returns ------- @@ -322,8 +354,6 @@ def rolling_window(a, window=1, step=1, axis=-1): See more at :doc:`/userguide/real_and_lazy_data`. """ - # NOTE: The implementation of this function originates from - # https://github.com/numpy/numpy/pull/31#issuecomment-1304851 04/08/2011 if window < 1: raise ValueError("`window` must be at least 1.") if window > a.shape[axis]: @@ -331,25 +361,26 @@ def rolling_window(a, window=1, step=1, axis=-1): if step < 1: raise ValueError("`step` must be at least 1.") axis = axis % a.ndim - num_windows = (a.shape[axis] - window + step) // step - shape = a.shape[:axis] + (num_windows, window) + a.shape[axis + 1 :] - strides = ( - a.strides[:axis] - + (step * a.strides[axis], a.strides[axis]) - + a.strides[axis + 1 :] + array_module = da if isinstance(a, da.Array) else np + steps = tuple( + slice(None, None, step) if i == axis else slice(None) for i in range(a.ndim) ) - rw = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) - if ma.isMaskedArray(a): - mask = ma.getmaskarray(a) - strides = ( - mask.strides[:axis] - + (step * mask.strides[axis], mask.strides[axis]) - + mask.strides[axis + 1 :] - ) - rw = ma.array( - rw, - mask=np.lib.stride_tricks.as_strided(mask, shape=shape, strides=strides), + + def _rolling_window(array): + return array_module.moveaxis( + array_module.lib.stride_tricks.sliding_window_view( + array, + window_shape=window, + axis=axis, + )[steps], + -1, + axis + 1, ) + + rw = _rolling_window(a) + if isinstance(da.utils.meta_from_array(a), np.ma.MaskedArray): + mask = _rolling_window(array_module.ma.getmaskarray(a)) + rw = array_module.ma.masked_array(rw, mask) return rw @@ -359,7 +390,7 @@ def array_equal(array1, array2, withnans=False): Parameters ---------- array1, array2 : arraylike - args to be compared, normalised if necessary with :func:`np.asarray`. + Args to be compared, normalised if necessary with :func:`np.asarray`. withnans : bool, default=False When unset (default), the result is False if either input contains NaN points. This is the normal floating-point arithmetic result. @@ -368,8 +399,9 @@ def array_equal(array1, array2, withnans=False): Notes ----- - This provides much the same functionality as :func:`numpy.array_equal`, but - with additional support for arrays of strings and NaN-tolerant operation. + This provides similar functionality to :func:`numpy.array_equal`, but + will compare arrays as unequal when their masks differ and has + additional support for arrays of strings and NaN-tolerant operation. This function maintains laziness when called; it does not realise data. See more at :doc:`/userguide/real_and_lazy_data`. @@ -379,17 +411,24 @@ def array_equal(array1, array2, withnans=False): def normalise_array(array): if not is_lazy_data(array): - array = np.asarray(array) + if not ma.isMaskedArray(array): + array = np.asanyarray(array) return array array1, array2 = normalise_array(array1), normalise_array(array2) eq = array1.shape == array2.shape + if eq: + array1_masked = ma.is_masked(array1) + eq = array1_masked == ma.is_masked(array2) + if eq and array1_masked: + eq = np.array_equal(ma.getmaskarray(array1), ma.getmaskarray(array2)) if eq: eqs = array1 == array2 if withnans and (array1.dtype.kind == "f" or array2.dtype.kind == "f"): eqs = np.where(np.isnan(array1) & np.isnan(array2), True, eqs) - eq = bool(np.all(eqs)) + eq = np.all(eqs) + eq = bool(eq) or eq is ma.masked return eq @@ -400,6 +439,11 @@ def approx_equal(a, b, max_absolute_error=1e-10, max_relative_error=1e-10): Returns whether two numbers are almost equal, allowing for the finite precision of floating point numbers. + Notes + ----- + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + .. deprecated:: 3.2.0 Instead use :func:`math.isclose`. For example, rather than calling @@ -408,11 +452,6 @@ def approx_equal(a, b, max_absolute_error=1e-10, max_relative_error=1e-10): if the actual error equals the maximum, whereas :func:`util.approx_equal` will return False. - Notes - ----- - This function does maintain laziness when called; it doesn't realise data. - See more at :doc:`/userguide/real_and_lazy_data`. - """ wmsg = ( "iris.util.approx_equal has been deprecated and will be removed, " @@ -438,9 +477,9 @@ def between(lh, rh, lh_inclusive=True, rh_inclusive=True): Parameters ---------- lh : - The left hand element of the inequality + The left hand element of the inequality. rh : - The right hand element of the inequality + The right hand element of the inequality. lh_inclusive : bool, default=True Affects the left hand comparison operator to use in the inequality. True for ``<=`` false for ``<``. Defaults to True. @@ -581,7 +620,7 @@ def monotonic(array, strict=False, return_direction=False): Parameters ---------- strict : bool, default=False - Flag to enable strict monotonic checking + Flag to enable strict monotonic checking. return_direction : bool, default=False Flag to change return behaviour to return (monotonic_status, direction). Direction will be 1 for positive @@ -590,11 +629,9 @@ def monotonic(array, strict=False, return_direction=False): Returns ------- - monotonic_status : bool - Whether the array was monotonic. - - If the return_direction flag was given then the returned value - will be: ``(monotonic_status, direction)`` + bool + Whether the array was monotonic. If the return_direction flag was given + then the returned value will be: ``(monotonic_status, direction)``. Notes ----- @@ -783,9 +820,9 @@ def _slice_data_with_keys(data, keys): Parameters ---------- data : array-like - array to index. + Array to index. keys : list - list of indexes, as received from a __getitem__ call. + List of indexes, as received from a __getitem__ call. Returns ------- @@ -801,7 +838,7 @@ def _slice_data_with_keys(data, keys): both 'real' (numpy) arrays and other array-likes index in the same way, instead of numpy arrays doing 'fancy indexing'. - .. Note:: + .. note:: Avoids copying the data, where possible. @@ -1022,7 +1059,7 @@ def clip_string(the_str, clip_length=70, rider="..."): Parameters ---------- the_str : str - The string to be clipped + The string to be clipped. clip_length : int, default=70 The length in characters that the input string should be clipped to. Defaults to a preconfigured value if not specified. @@ -1101,7 +1138,7 @@ def new_axis(src_cube, scalar_coord=None, expand_extras=()): # maybe not lazy ---------- src_cube : :class:`iris.cube.Cube` Source cube on which to generate a new axis. - scalar_coord : :class:`iris.coord.Coord` or 'string', optional + scalar_coord : :class:`iris.coord.Coord` or str, optional Scalar coordinate to promote to a dimension coordinate. expand_extras : iterable, optional Auxiliary coordinates, ancillary variables and cell measures which will @@ -1378,10 +1415,16 @@ def regular_points(zeroth, step, count): This function does maintain laziness when called; it doesn't realise data. See more at :doc:`/userguide/real_and_lazy_data`. """ - points = (zeroth + step) + step * np.arange(count, dtype=np.float32) + + def make_steps(dtype: np.dtype): + start = np.add(zeroth, step, dtype=dtype) + steps = np.multiply(step, np.arange(count), dtype=dtype) + return np.add(start, steps, dtype=dtype) + + points = make_steps(np.float32) _, regular = iris.util.points_step(points) if not regular: - points = (zeroth + step) + step * np.arange(count, dtype=np.float64) + points = make_steps(np.float64) return points @@ -1531,7 +1574,7 @@ def promote_aux_coord_to_dim_coord(cube, name_or_coord): Parameters ---------- cube : - An instance of :class:`iris.cube.Cube` + An instance of :class:`iris.cube.Cube`. name_or_coord : * \(a) An instance of :class:`iris.coords.AuxCoord` * \(b) the :attr:`standard_name`, :attr:`long_name`, or @@ -1643,7 +1686,7 @@ def promote_aux_coord_to_dim_coord(cube, name_or_coord): def demote_dim_coord_to_aux_coord(cube, name_or_coord): - r"""Demotes a dimension coordinate on the cube to an auxiliary coordinate. + r"""Demote a dimension coordinate on the cube to an auxiliary coordinate. The DimCoord is demoted to an auxiliary coordinate on the cube. The dimension of the cube that was associated with the DimCoord becomes @@ -1653,7 +1696,7 @@ def demote_dim_coord_to_aux_coord(cube, name_or_coord): Parameters ---------- cube : - An instance of :class:`iris.cube.Cube` + An instance of :class:`iris.cube.Cube`. name_or_coord : * \(a) An instance of :class:`iris.coords.DimCoord` * \(b) the :attr:`standard_name`, :attr:`long_name`, or @@ -1768,8 +1811,8 @@ def find_discontiguities(cube, rel_tol=1e-5, abs_tol=1e-8): Returns ------- - result : `numpy.ndarray` of bool - true/false map of which cells in the cube XY grid have + numpy.ndarray + Boolean True/false map of which cells in the cube XY grid have discontiguities in the coordinate points array. This can be used as the input array for @@ -1895,7 +1938,7 @@ def _mask_array(array, points_to_mask, in_place=False): @_lenient_client(services=SERVICES) def mask_cube(cube, points_to_mask, in_place=False, dim=None): - """Masks any cells in the cube's data array. + """Mask any cells in the cube's data array. Masks any cells in the cube's data array which correspond to cells marked ``True`` (or non zero) in ``points_to_mask``. ``points_to_mask`` may be @@ -2098,12 +2141,12 @@ def mask_cube_from_shapefile(cube, shape, minimum_weight=0.0, in_place=False): Parameters ---------- + cube : :class:`~iris.cube.Cube` object + The `Cube` object to masked. Must be singular, rather than a `CubeList`. shape : Shapely.Geometry object A single `shape` of the area to remain unmasked on the `cube`. If it a line object of some kind then minimum_weight will be ignored, - because you cannot compare the area of a 1D line and 2D Cell - cube : :class:`~iris.cube.Cube` object - The `Cube` object to masked. Must be singular, rather than a `CubeList` + because you cannot compare the area of a 1D line and 2D Cell. minimum_weight : float , default=0.0 A number between 0-1 describing what % of a cube cell area must the shape overlap to include it. @@ -2114,12 +2157,12 @@ def mask_cube_from_shapefile(cube, shape, minimum_weight=0.0, in_place=False): Returns ------- iris.Cube - A masked version of the input cube, if in_place is False - + A masked version of the input cube, if in_place is False. See Also -------- :func:`~iris.util.mask_cube` + Mask any cells in the cube’s data array. Notes ----- @@ -2141,7 +2184,6 @@ def mask_cube_from_shapefile(cube, shape, minimum_weight=0.0, in_place=False): >>> shape = shapely.geometry.box(-100,30, -80,40) # box between 30N-40N 100W-80W >>> masked_cube = mask_cube_from_shapefile(cube, shape) - ... """ shapefile_mask = create_shapefile_mask(shape, cube, minimum_weight) masked_cube = mask_cube(cube, shapefile_mask, in_place=in_place) diff --git a/noxfile.py b/noxfile.py index a30b6ce784..d74a964e94 100644 --- a/noxfile.py +++ b/noxfile.py @@ -15,7 +15,7 @@ nox.options.reuse_existing_virtualenvs = True #: Python versions we can run sessions under -_PY_VERSIONS_ALL = ["3.9", "3.10", "3.11"] +_PY_VERSIONS_ALL = ["3.10", "3.11", "3.12"] _PY_VERSION_LATEST = _PY_VERSIONS_ALL[-1] #: One specific python version for docs builds @@ -79,7 +79,7 @@ def cache_venv(session: nox.sessions.Session) -> None: Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -96,7 +96,7 @@ def cache_cartopy(session: nox.sessions.Session) -> None: Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -117,7 +117,7 @@ def prepare_venv(session: nox.sessions.Session) -> None: Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. Notes @@ -174,7 +174,7 @@ def tests(session: nox.sessions.Session): Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -198,7 +198,7 @@ def doctest(session: nox.sessions.Session): Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -225,7 +225,7 @@ def gallery(session: nox.sessions.Session): Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -246,7 +246,7 @@ def linkcheck(session: nox.sessions.Session): Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -272,7 +272,7 @@ def wheel(session: nox.sessions.Session): Parameters ---------- - session: object + session : object A `nox.sessions.Session` object. """ @@ -291,3 +291,27 @@ def wheel(session: nox.sessions.Session): "import iris; print(f'{iris.__version__=}')", external=True, ) + + +@nox.session +def benchmarks(session: nox.sessions.Session): + """Run the Iris benchmark runner. Run session with `-- --help` for help. + + Parameters + ---------- + session : object + A `nox.sessions.Session` object. + + """ + if len(session.posargs) == 0: + message = ( + "This session MUST be run with at least one argument. The " + "arguments are passed down to the benchmark runner script. E.g:\n" + "nox -s benchmarks -- --help\n" + "nox -s benchmarks -- something --help\n" + "nox -s benchmarks -- something\n" + ) + session.error(message) + session.install("asv", "nox") + bm_runner_path = Path(__file__).parent / "benchmarks" / "bm_runner.py" + session.run("python", bm_runner_path, *session.posargs) diff --git a/pyproject.toml b/pyproject.toml index 1d30c99156..74e514ad20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,9 +22,9 @@ classifiers = [ "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Atmospheric Science", @@ -50,7 +50,7 @@ keywords = [ ] license = {text = "BSD-3-Clause"} name = "scitools-iris" -requires-python = ">=3.9" +requires-python = ">=3.10" [project.urls] Code = "https://github.com/SciTools/iris" @@ -73,7 +73,6 @@ src = [ "lib", "docs/src", ] -target-version = "py39" [tool.ruff.format] preview = false @@ -134,7 +133,7 @@ local_scheme = "dirty-tag" version_scheme = "release-branch-semver" [tool.pytest.ini_options] -addopts = "-ra" +addopts = "-ra --durations=25" required_plugins = "pytest-mock" testpaths = "lib/iris" @@ -151,15 +150,76 @@ omit = [ [tool.coverage.report] exclude_lines = [ "pragma: no cover", - "if __name__ == .__main__.:" + "if __name__ == .__main__.:", + "if TYPE_CHECKING:", ] [tool.codespell] -ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" -skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" +ignore-words-list = "alpha-numeric,assertIn,degreee,discontiguities,lazyness,meaned,nin" +skip = "./CODE_OF_CONDUCT.md,_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" [tool.check-manifest] ignore = [ "lib/iris/_version.py", "lib/iris/std_names.py", ] + +[tool.mypy] +# See https://mypy.readthedocs.io/en/stable/config_file.html +# TODO: remove when MyPy fixed (see https://github.com/python/mypy/issues/17166) +disable_error_code = ["call-arg"] +enable_error_code = ["ignore-without-code", "truthy-bool"] +exclude = [ + 'noxfile\.py', + 'docs/src/conf\.py' +] +ignore_missing_imports = true +warn_unreachable = true +warn_unused_configs = true + +[tool.numpydoc_validation] +checks = [ + "all", # Enable all numpydoc validation rules, apart from the following: + + # -> Docstring text (summary) should start in the line immediately + # after the opening quotes (not in the same line, or leaving a + # blank line in between) + "GL01", # Permit summary line on same line as docstring opening quotes. + + # -> Closing quotes should be placed in the line after the last text + # in the docstring (do not close the quotes in the same line as + # the text, or leave a blank line between the last text and the + # quotes) + "GL02", # Permit a blank line before docstring closing quotes. + + # -> Double line break found; please use only one blank line to + # separate sections or paragraphs, and do not leave blank lines + # at the end of docstrings + "GL03", # Ignoring. + + # -> See Also section not found + "SA01", # Not all docstrings require a "See Also" section. + + # -> No extended summary found + "ES01", # Not all docstrings require an "Extended Summary" section. + + # -> No examples section found + "EX01", # Not all docstrings require an "Examples" section. + + # -> No Yields section found + "YD01", # Not all docstrings require a "Yields" section. + + # Temporary checks to ignore, will be reviewed at a later date. + "GL08", # The object does not have a docstrings not have a docstring + "PR01", # Parameters ... not documented + "PR02", # Unknown parameters {....} + "PR04", # Parameter "...." has no type + "PR07", # Parameter "...." has no description + "RT01", # No Returns section found + "RT03", # Return value has no description +] +exclude = [ + '\.__eq__$', + '\.__ne__$', + '\.__repr__$', +] diff --git a/requirements/iris.yml b/requirements/iris.yml index b0c50b8bfd..331a25f10d 120000 --- a/requirements/iris.yml +++ b/requirements/iris.yml @@ -1 +1 @@ -py311.yml \ No newline at end of file +py312.yml \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 330d3a1977..a67480e8a2 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,144 +1,206 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 0ac36aad0702e3bd3f5b8f8ff61d942829f387b7296be875881f07fb9cf4a7b5 +# input_hash: 372c3b278b46d5c658024f7b6b47d7b92266bb7ca5a25b0eb4f67e055b8a02a7 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda#1ece2ccb1dc8c68639712b05e0fae070 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda#38a5cd3be5fb620b48069e27285f1a44 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda#2b780c0338fc0ffa678ac82c54af51fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda#b422943d5d772b7cc858b36ad2a92db5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-h84d6215_0.conda#1190da4988807db89b31e2173128892f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda#e1f604644fe8d78e22660e2fec6756bc +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda#540296f0ce9d3352188c15a89b30b9ac +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda#85c0dc0bcd110c998b01856975486ee7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.1-h59595ed_0.conda#ee90e7ac57321f8782f8438bf647b75b +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda#e46f7ac4917215b49df2ea09a694a3fa +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.4-hf2295e7_4.conda#33c2d37e9460579b5b9a7194e5637884 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda#80a57756c545ad11f9847835aa21e6b2 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda#9ebc9aedafaa2515ab247ff6bb509458 +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda#63872517c98aa305da58a757c443698e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda#57a9e7ee3c0840d3c8c9012473978629 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.15-h4a871b0_2_cpython.conda#98059097f62e97be9aed7ec904055825 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_0.conda#c4cb444844615e1cd4c9d989f770bcc5 +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.37-hd8ed1ab_0.conda#73ec79a77d31eb7e4a3276cd246b776c +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.conda#d8602724ac0d276c380b97e9eb0f814b +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py310hc6cd4ac_0.conda#987a8359726157c7a7cdd198f882f82d -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py310hff52083_1.tar.bz2#21b8fa2179290505e607f5ccd65b01b0 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a +https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py310h5b1441d_3.conda#f1dd2d9a5c782683c28918f44ba547a8 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py310ha75aee5_0.conda#8aac4068f272b6bdeb0aa0f29d8e516f +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_0.conda#faf232274689aa60da5a63e7cc5faeb7 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda#204892bce2e44252b5cf272712f10bdd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda#128e74a4f8f4fef4dc5130a8bbccc15d +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py310hd41b1e2_0.conda#dc5263dcaa1347e5a456ead3537be27d +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py310hff52083_2.conda#4e8b2a2851668c8ad4d5360845281be9 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_0.conda#5415555830a54d9b4a1307e3e9d942c7 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py310h3788b33_0.conda#6b586fb03d84e5bfbb1a8a3d9e2c9b60 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py310ha75aee5_2.conda#d38aa9579b7210c646e6faef1aed5bbb +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py310ha75aee5_0.conda#a42a2ed94df11c5cfa5348a317e1f197 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd +https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda#d5cd48392c67fb6849ba459c2c2b671f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -146,86 +208,133 @@ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py310h2372a71_0.conda#48f39c24349d9ae5c8e8873c42fb6170 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py310ha75aee5_1.conda#260c9ae4b2d9af7d5cce7b721cba6132 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310ha75aee5_1.conda#ee18e67b0bd283f6a75369936451d6ac +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda#bb2638cd7fbdd980b1cff9a99a6c1fa8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda#7da9007c0582712c4bad4131f89c8372 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.3-py310h2372a71_1.conda#d9c1e9a3a198a7d4454261fbc220b89b -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py310h2372a71_0.conda#21362970a6fea90ca507c253c20465f2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py310h89163eb_0.conda#5222543cdb180f0fecc0d4b9f6b4a225 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py310ha75aee5_1.conda#81bbbb02f3664a012ce65c4fa8e8ca35 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py310h89163eb_1.conda#d30cf58ede43135249a18c5926a96d3f +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_101.conda#09967792ea2191a0bdb461f9c889e510 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda#7e574c7499bc41f92537634a23fed79a +https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda#cb5c5ff12b37aded00d9aaa7b9a86a78 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda#139262125a3eac8ff6eef898598745a3 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 +https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda#1947280342c7259b82a707e38ebc212e +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda#a6ed1227ba6ec37cfc2b25e6512f729f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py310hcc13569_0.conda#cf5d315e3601a6a2931f63aa9a84dc40 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h1f7b6fc_1.conda#be6f0382440ccbf9fb01bb19ab1f1fc0 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 +https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda#2a66267ba586dadd110cc991063cfff7 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h2564987_115.conda#c5ce70b76c77a6c9a3107be8d8e8ab0b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_2.conda#ba5ac0bb9ec5aec38dec37c230b12d64 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py310h89163eb_1.conda#4e13be3228db4b8e1349483e821b6046 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.2-py310hd6e36ab_0.conda#d64ac80cd7861e079770982204d4673b +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 +https://conda.anaconda.org/conda-forge/noarch/pbr-6.1.0-pyhd8ed1ab_0.conda#5a166b998fd17cdaaaadaccdd71a363f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py310h2e9f774_0.conda#42a3ea3c283d930ae6d156b97ffe4740 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.13.0-h94b29a5_0.conda#4431bd4ace17dd09b97caf68509b016b +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_2.conda#de92ea39a4d3afe19b6ee56701ebfa05 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_2.conda#1d05a25da36ba5f98291d7237fc6b8ce +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_2.conda#838b2db868f9ab69a7bad9c065a3362d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_2.conda#00a6127960a3f41d4bfcabd35d5fbeec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_2.conda#6cfc840bc39c17d92fb25e5a35789e5b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_2.conda#9e9814b40d8fdfd8485451e3fa2f1719 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_2.conda#724719ce97feb6f310f88ae8dbb40afd +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_2.conda#8908f31eab30f65636eb61ab9cb1f3ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-h5c8f2c3_2.conda#e098caa87868e8dcc7ed5d011981207d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-h5c8f2c3_2.conda#59bb8c3502cb9d35f1fb26691730288c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_2.conda#e0b88fd64dc95f715ef52e607a9af89b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h6481b9d_2.conda#12bf831b85f17368bc71a26ac93a8493 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_2.conda#d48c774c40ea2047adbff043e9076e7a +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_ha5d1325_107.conda#5bd5042289ef82196bae48948314cdf9 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py310h5eaa309_1.conda#e67778e1cac3bca3b3300f6164f7ffb9 +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.13-py310hf462985_1.conda#4f1c137b6ea5e8c7ce95c28b053843cc +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py310hf462985_2.conda#bb603a9ffd8f7e97c93c74a5e3c3febd +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.3-h6e8976b_1.conda#f3234422a977b5d400ccf503ad55c5d1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_1.conda#d9b1b75a227dbc42f3fe0e8bc852b805 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310had3dfd6_2.conda#a4166b41e54d22e794859641b7cae2d0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.1-pyhd8ed1ab_0.conda#2d4fb4e7199019512298f728b9f6a8b0 -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py310ha75aee5_0.conda#f0734f65184577c08c9f1ba92cd9f57f +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py310h89163eb_0.conda#cdc075f4328556adf4dde97b4f4a0532 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310hf462985_6.conda#b8ad2d561f4e0db4f09d06cc0e73e0b0 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.10.0-pyhd8ed1ab_0.conda#b3b498f7bcc9a2543ad72a3501f3d87b +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h6063b07_4.conda#3108bfa76cd8a3ebc5546797106946e5 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.2-gpl_h8657690_705.conda#bba34ade586dc53222d5e0387f7733c2 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda#61534ee57ffdf26d7b1b514d33daccc4 -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py310h1f7b6fc_1.conda#857b828a13cdddf568958f7575b25b22 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310h68603db_1.conda#989ef368e7b81b6c28e608e651a2a7d8 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_100.conda#82a474392c02d35a969aaad569cbbca8 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py310hf462985_3.conda#7fd2a4e83e8ff3a760984300dad6297c +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/noarch/wslink-2.2.1-pyhd8ed1ab_0.conda#74674b93806167c26da4eca7613bc225 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-qt_py310h9617cfe_209.conda#1989896d5ae944eced08372bda5676a5 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-qt_py310hc8241c7_209.conda#063eb6107225478aa00f283b102f3ec8 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-qt_py310he5e186c_209.conda#03fd79331809ea4812c5430e47c04723 +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.1-pyhd8ed1ab_0.conda#0731b45087c0358ca8b7d9fe855dec1a +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.3-pyhd8ed1ab_0.conda#4b12a3321889056bf9a000be9a0763b3 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.15.0-pyhd8ed1ab_0.conda#1a49ca9515ef9a96edff2eea06143dc6 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 +https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda#db0f1eb28b6df3a11e89437597309009 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.18.0-pyhd8ed1ab_0.conda#dc78276cbf5ec23e4b959d1bbd9caadb +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 5e3ddd45a8..60a47736e4 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,144 +1,207 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aa7a92b2e1d6e760118baeb558b15337d9ffaae13ca62373e5919205a6a6df8a +# input_hash: 58de0176aff465b8a68544e32553b8c5648f581ece5d2c4df0d333dd456ea851 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda#1ece2ccb1dc8c68639712b05e0fae070 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda#38a5cd3be5fb620b48069e27285f1a44 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda#2b780c0338fc0ffa678ac82c54af51fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda#b422943d5d772b7cc858b36ad2a92db5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-h84d6215_0.conda#1190da4988807db89b31e2173128892f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda#e1f604644fe8d78e22660e2fec6756bc +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda#540296f0ce9d3352188c15a89b30b9ac +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda#85c0dc0bcd110c998b01856975486ee7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.1-h59595ed_0.conda#ee90e7ac57321f8782f8438bf647b75b +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda#e46f7ac4917215b49df2ea09a694a3fa +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.4-hf2295e7_4.conda#33c2d37e9460579b5b9a7194e5637884 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda#80a57756c545ad11f9847835aa21e6b2 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda#9ebc9aedafaa2515ab247ff6bb509458 +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda#63872517c98aa305da58a757c443698e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda#57a9e7ee3c0840d3c8c9012473978629 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_3_cpython.conda#9e1ad55c87368e662177661a998feed5 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_0.conda#c4cb444844615e1cd4c9d989f770bcc5 +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.37-hd8ed1ab_0.conda#73ec79a77d31eb7e4a3276cd246b776c +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.conda#d8602724ac0d276c380b97e9eb0f814b +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py311hb755f60_0.conda#c49924051b8336f6031eb3d019619cba -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a +https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py311h55d416d_3.conda#d21db006755203fe890596d3eae992ce +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py311h9ecbd09_0.conda#75424a18fb275a18b288c099b869c3bc +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_0.conda#faf232274689aa60da5a63e7cc5faeb7 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda#204892bce2e44252b5cf272712f10bdd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda#128e74a4f8f4fef4dc5130a8bbccc15d +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py311h38be061_2.conda#733b481d20ff260a34f2b0003ff4fbb3 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_0.conda#15e4dadd59e93baad7275249f10b9472 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py311hd18a35c_0.conda#682f76920687f7d9283039eb542fdacf +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_1.conda#5384f857bd8b0fc3a62ce1ece858c89f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py311h9ecbd09_2.conda#85a56dd3b692fb5435de1e901354b5b8 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py311h9ecbd09_0.conda#0ffc1f53106a38f059b151c465891ed3 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 +https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda#d5cd48392c67fb6849ba459c2c2b671f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -146,85 +209,131 @@ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda#cc7727006191b8f3630936b339a76cd0 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h9ecbd09_1.conda#616fed0b6f5c925250be779b05d1d7f7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py311h9ecbd09_1.conda#00895577e2b4c24dca76675ab1862551 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda#bb2638cd7fbdd980b1cff9a99a6c1fa8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda#7da9007c0582712c4bad4131f89c8372 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.3-py311h459d7ec_1.conda#4fb7f674bf6839da62317a7c6e725c55 -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py311h2dc5d0c_0.conda#4d74dedf541d0f87fce0b5797b66e425 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py311h9ecbd09_1.conda#765c19c0b6df9c143ac8f959d1a1a238 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py311h2dc5d0c_1.conda#7336fc1b2ead4cbdda1268dd6b7a6c38 +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_101.conda#09967792ea2191a0bdb461f9c889e510 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda#7e574c7499bc41f92537634a23fed79a +https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda#cb5c5ff12b37aded00d9aaa7b9a86a78 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda#139262125a3eac8ff6eef898598745a3 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 +https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py311h49e9ac3_0.conda#2bd3d0f839ec0d1eaca817c9d1feb7c2 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda#a6ed1227ba6ec37cfc2b25e6512f729f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py311h9ecbd09_0.conda#d9c23163e7ac5f8926372c7d792a996f +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py311h2dc5d0c_0.conda#4f0fa0019a6e7be77db3609a707a4581 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py311h320fe9a_0.conda#aac8d7137fedc2fd5f8320bf50e4204c -https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda#2a66267ba586dadd110cc991063cfff7 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h2564987_115.conda#c5ce70b76c77a6c9a3107be8d8e8ab0b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_2.conda#ba5ac0bb9ec5aec38dec37c230b12d64 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.2-py311h71ddf71_0.conda#4e72b55892331ada8fbcf5954df582f2 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 +https://conda.anaconda.org/conda-forge/noarch/pbr-6.1.0-pyhd8ed1ab_0.conda#5a166b998fd17cdaaaadaccdd71a363f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py311h0f98d5a_0.conda#22531205a97c116251713008d65dfefd +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.13.0-h94b29a5_0.conda#4431bd4ace17dd09b97caf68509b016b +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_2.conda#66266cd4f20e47dc1de458c93fb4d2a9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_2.conda#1d05a25da36ba5f98291d7237fc6b8ce +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_2.conda#838b2db868f9ab69a7bad9c065a3362d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_2.conda#00a6127960a3f41d4bfcabd35d5fbeec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_2.conda#6cfc840bc39c17d92fb25e5a35789e5b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_2.conda#9e9814b40d8fdfd8485451e3fa2f1719 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_2.conda#724719ce97feb6f310f88ae8dbb40afd +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_2.conda#8908f31eab30f65636eb61ab9cb1f3ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-h5c8f2c3_2.conda#e098caa87868e8dcc7ed5d011981207d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-h5c8f2c3_2.conda#59bb8c3502cb9d35f1fb26691730288c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_2.conda#e0b88fd64dc95f715ef52e607a9af89b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h6481b9d_2.conda#12bf831b85f17368bc71a26ac93a8493 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_2.conda#d48c774c40ea2047adbff043e9076e7a +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_ha5d1325_107.conda#5bd5042289ef82196bae48948314cdf9 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_1.conda#643f8cb35133eb1be4919fb953f0a25f +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.13-py311h9f3472d_1.conda#87b04d34d110ea5ff945f1949b7436be +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py311h9f3472d_2.conda#bd9c3ff46028eec017bc78377f9e0fb6 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.3-h6e8976b_1.conda#f3234422a977b5d400ccf503ad55c5d1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he9a78e4_1.conda#49ba89bf4d8a995efb99517d1c7aeb1e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h2fdb869_2.conda#4c78235905053663d1c9e23df3f11b65 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.1-pyhd8ed1ab_0.conda#2d4fb4e7199019512298f728b9f6a8b0 -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 +https://conda.anaconda.org/conda-forge/noarch/wslink-2.2.1-pyhd8ed1ab_0.conda#74674b93806167c26da4eca7613bc225 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.10.0-pyhd8ed1ab_0.conda#b3b498f7bcc9a2543ad72a3501f3d87b +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h6063b07_4.conda#3108bfa76cd8a3ebc5546797106946e5 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.2-gpl_h8657690_705.conda#bba34ade586dc53222d5e0387f7733c2 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda#61534ee57ffdf26d7b1b514d33daccc4 -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_100.conda#11395670c4eeda7a60c13c313a83727f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h9f3472d_3.conda#a7c4169b1c920361597ddacb461350fd +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-qt_py311h7158b74_209.conda#011801a68c022cf9692a4567d84678ca +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-qt_py311hc8241c7_209.conda#13fdaae5c7c5c76089ca76f63b287ef5 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-qt_py311he5e186c_209.conda#54a9526336ff06739344f87726cbc61e +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.1-pyhd8ed1ab_0.conda#0731b45087c0358ca8b7d9fe855dec1a +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.3-pyhd8ed1ab_0.conda#4b12a3321889056bf9a000be9a0763b3 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.15.0-pyhd8ed1ab_0.conda#1a49ca9515ef9a96edff2eea06143dc6 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 +https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda#db0f1eb28b6df3a11e89437597309009 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.18.0-pyhd8ed1ab_0.conda#dc78276cbf5ec23e4b959d1bbd9caadb +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock new file mode 100644 index 0000000000..99dc274e80 --- /dev/null +++ b/requirements/locks/py312-linux-64.lock @@ -0,0 +1,339 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: c193458a42ce9c0214cd77bd4813343270edb438eceaf46d40cf7ea29a433b56 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_1.conda#1ece2ccb1dc8c68639712b05e0fae070 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_1.conda#38a5cd3be5fb620b48069e27285f1a44 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.2-heb4867d_0.conda#2b780c0338fc0ffa678ac82c54af51fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda#b422943d5d772b7cc858b36ad2a92db5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda#19608a9656912805b2b9a2f6bd257b04 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda#77cbc488235ebbaab2b6e912d3934bae +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda#7c21106b851ec72c037b162c216d8f05 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda#6595440079bed734b113de44ffd3cd0a +https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.6-h84d6215_0.conda#1190da4988807db89b31e2173128892f +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda#e1f604644fe8d78e22660e2fec6756bc +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.4-h7f98852_1002.tar.bz2#e728e874159b042d92b90238a3cb0dc2 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda#540296f0ce9d3352188c15a89b30b9ac +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-9.0.1-h266115a_2.conda#85c0dc0bcd110c998b01856975486ee7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#346722a0be40f6edc53f12640d301338 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.123-hb9d3cd8_0.conda#ee605e794bdc14e2b7f84c4faa0d8c2c +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda#0a7f4cd238267c88e5d69f7826a407eb +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.2-h5b01275_0.conda#ab0bff36363bec94720275a681af8b83 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-he02047a_1.conda#e46f7ac4917215b49df2ea09a694a3fa +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda#df359c09c41cd186fffb93a2d87aa6f5 +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.2.1-h5888daf_0.conda#0d9c441855be3d8dfdb2e800fe755059 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda#0a732427643ae5e0486a727927791da1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-hb711507_2.conda#8637c3e5821654d0edf97e2b0404b443 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda#ad748ccca349aec3e91743e08b5e2b50 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda#0e0cbe0564d03a99afd5fd7b362feecd +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda#608e0ef8256b81d04456e8d211eee3e8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda#05a8ea5f446de33006171a7afe6ae857 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda#0b666058a179b744a622d0a4a0c56353 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda#13e8e54035ddd2b91875ba399f0f7c04 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_1.conda#80a57756c545ad11f9847835aa21e6b2 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_0.conda#9ebc9aedafaa2515ab247ff6bb509458 +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda#63872517c98aa305da58a757c443698e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_2.conda#57a9e7ee3c0840d3c8c9012473978629 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda#0515111a9cdf69f83278f7c197db9807 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.0-h9eae976_0.conda#c4cb444844615e1cd4c9d989f770bcc5 +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.37-hd8ed1ab_0.conda#73ec79a77d31eb7e4a3276cd246b776c +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda#a0901183f08b6c7107aab109733a3c91 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda#f725c7425d6d7c15e31f3b99a88ea02f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda#a7a49a8b85122b49214798321e2e96b4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hb9d3cd8_2.conda#d8602724ac0d276c380b97e9eb0f814b +https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.3-pyhd8ed1ab_0.conda#ec763b0a58960558ca0ad7255a51a237 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_0.conda#7d78a232029458d0077ede6cda30ed0c +https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda#fceaedf1cdbcb02df9699a0d9b005292 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_0.conda#a374efa97290b8799046df7c5ca17164 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda#c88ca2bb7099167912e3b26463fff079 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.27-h54b06d7_7.conda#dce22f70b4e5a407ce88f2be046f4ceb +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.11-py312h8fd2918_3.conda#21e433caf1bb1e4c95832f8bb731d64c +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda#fe521c1608280cc2803ebd26dc252212 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda#f98e36c96b2c66d9043187179ddb04f4 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.10.0-pyhff2d567_0.conda#816dbc4679a64e4417cd1385d661bb31 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_0.conda#faf232274689aa60da5a63e7cc5faeb7 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda#8ea26d42ca88ec5258802715fe1ee10b +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda#30ee3a29c84cf7b842a8c5828c4b7c13 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_1.conda#204892bce2e44252b5cf272712f10bdd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm19-19.1.2-ha7bfdaf_0.conda#128e74a4f8f4fef4dc5130a8bbccc15d +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h2c5496b_1.conda#e2eaefa4de2b7237af7c907b8bbc760a +https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py312h7900ff3_2.conda#fddd3092f921be8e01b18f2a0266d98f +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda#a755704ea0e2503f8c227d84829a8e81 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda#5c9b020a3f86799cdc6115e55df06146 +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_1.conda#e397d9b841c37fc3180b73275ce7e990 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf +https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.0-py312h66e93f0_2.conda#2c6c0c68f310bc33972e7c83264d7786 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda#0524eb91d3d78d76d671c6e3cd7cee82 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda#035c17fbf099f50ff60bf2eb303b0a83 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda#986287f89929b2d629bd6ef6497dc307 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 +https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda#d5cd48392c67fb6849ba459c2c2b671f +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d +https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda#e977934e00b355ff55ed154904044727 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda#34feccdd4177f2d3d53c73fc44fd9a37 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda#af648b62462794649066366af4ecd5b0 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.5-hb9d3cd8_0.conda#eb44b3b6deb1cab08d72cb61686fe64c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda#d3c295b50f092ab525ffe3c2aa4b7413 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.2-hb9d3cd8_0.conda#bb2638cd7fbdd980b1cff9a99a6c1fa8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda#2de7f99d6581a4a7adbff607b5c278ca +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.5-hb9d3cd8_4.conda#7da9007c0582712c4bad4131f89c8372 +https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.4-py312h178313f_0.conda#a32fbd2322865ac80c7db74c553f5306 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.0.0-py312h66e93f0_1.conda#a921e2fe122e7f38417b9b17c7a13343 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda#bbbf5fa5cab622c33907bc8d7eeea9f7 +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda#76b32dcf243444aea9c6b804bcfa40b8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_101.conda#09967792ea2191a0bdb461f9c889e510 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda#5dbd1b0fc0d01ec5e0e1fbe667281a11 +https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp19.1-19.1.2-default_hb5137d0_1.conda#7e574c7499bc41f92537634a23fed79a +https://conda.anaconda.org/conda-forge/linux-64/libclang13-19.1.2-default_h9c6a7e4_1.conda#cb5c5ff12b37aded00d9aaa7b9a86a78 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda#4dc03a53fc69371a6158d0ed37214cd3 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-h8a09558_1.conda#139262125a3eac8ff6eef898598745a3 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 +https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.8-hedd0468_0.conda#dcd0ed5147d8876b0848a552b416ce76 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda#ee6f7fd1e76061ef1fa307d41fa86a96 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda#a6ed1227ba6ec37cfc2b25e6512f729f +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda#7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.16.0-py312h66e93f0_0.conda#c3f4a6b56026c22319bf31514662b283 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.10.10-py312h178313f_0.conda#d2f9e490ab2eae3e661b281346618a82 +https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d +https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_1.conda#4809b9f4c6ce106d443c3f90b8e10db2 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.3-h1dc1e6a_0.conda#2a66267ba586dadd110cc991063cfff7 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h2564987_115.conda#c5ce70b76c77a6c9a3107be8d8e8ab0b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.4.0-hac27bb2_2.conda#ba5ac0bb9ec5aec38dec37c230b12d64 +https://conda.anaconda.org/conda-forge/linux-64/libpq-17.0-h04577a9_4.conda#392cae2a58fbcb9db8c2147c6d6d1620 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.1.2-py312h58c1407_0.conda#b7e9a46277a1ee0afc6311e7760df0c3 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 +https://conda.anaconda.org/conda-forge/noarch/pbr-6.1.0-pyhd8ed1ab_0.conda#5a166b998fd17cdaaaadaccdd71a363f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py312he630544_0.conda#427799f15b36751761941f4cbd7d780f +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.13.0-h94b29a5_0.conda#4431bd4ace17dd09b97caf68509b016b +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_2.conda#ff28f374b31937c048107521c814791e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.10.0-pyhd8ed1ab_0.conda#7823092a3cf14e98a52d2a2875c47c80 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_1.conda#ec6f70b8a5242936567d4f886726a372 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.4.0-h4d9b6c2_2.conda#1d05a25da36ba5f98291d7237fc6b8ce +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.4.0-h4d9b6c2_2.conda#838b2db868f9ab69a7bad9c065a3362d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.4.0-h3f63f65_2.conda#00a6127960a3f41d4bfcabd35d5fbeec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.4.0-hac27bb2_2.conda#6cfc840bc39c17d92fb25e5a35789e5b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.4.0-hac27bb2_2.conda#9e9814b40d8fdfd8485451e3fa2f1719 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.4.0-hac27bb2_2.conda#724719ce97feb6f310f88ae8dbb40afd +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.4.0-h3f63f65_2.conda#8908f31eab30f65636eb61ab9cb1f3ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.4.0-h5c8f2c3_2.conda#e098caa87868e8dcc7ed5d011981207d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.4.0-h5c8f2c3_2.conda#59bb8c3502cb9d35f1fb26691730288c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.4.0-h5888daf_2.conda#e0b88fd64dc95f715ef52e607a9af89b +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.4.0-h6481b9d_2.conda#12bf831b85f17368bc71a26ac93a8493 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.4.0-h5888daf_2.conda#d48c774c40ea2047adbff043e9076e7a +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda#83f045969988f5c7a65f3950b95a8b35 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_ha5d1325_107.conda#5bd5042289ef82196bae48948314cdf9 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda#8bce4f6caaf8c5448c7ac86d87e26b4b +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.13-py312hc0a28a1_1.conda#b4fa8eafe923ac2733001fef8531026f +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.7.0-py312hc0a28a1_2.conda#8300d634adec4a6aed35a87e90e9cb07 +https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.3-h6e8976b_1.conda#f3234422a977b5d400ccf503ad55c5d1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda#b43233a9e2f62fb94affe5607ea79473 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h391bc85_2.conda#eb476b4975ea28ac12ff469063a71f5d +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 +https://conda.anaconda.org/conda-forge/noarch/wslink-2.2.1-pyhd8ed1ab_0.conda#74674b93806167c26da4eca7613bc225 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.10.0-pyhd8ed1ab_0.conda#b3b498f7bcc9a2543ad72a3501f3d87b +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h6063b07_4.conda#3108bfa76cd8a3ebc5546797106946e5 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.2-gpl_h8657690_705.conda#bba34ade586dc53222d5e0387f7733c2 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda#953e31ea00d46beb7e64a79fc291ec44 +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_100.conda#8e932f27c4339835563f42d73b158d53 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_0.conda#5971cc64048943605f352f7f8612de6c +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312hc0a28a1_3.conda#81bbcb20ea4a53b05a8cf51f31496038 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-qt_py312hc73667e_209.conda#e2967eddf4ea06a8b645da9967f370be +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b +https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-qt_py312hc8241c7_209.conda#1354402d09a8614821d6d3c13d826863 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-qt_py312he5e186c_209.conda#c6aba64b606a07b20b345b1e4146494b +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.1-pyhd8ed1ab_0.conda#0731b45087c0358ca8b7d9fe855dec1a +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.3-pyhd8ed1ab_0.conda#4b12a3321889056bf9a000be9a0763b3 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.0-pyhd8ed1ab_0.conda#344261b0e77f5d2faaffb4eac225eeb7 +https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 +https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.1-pyhd8ed1ab_1.conda#db0f1eb28b6df3a11e89437597309009 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.18.0-pyhd8ed1ab_0.conda#dc78276cbf5ec23e4b959d1bbd9caadb +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_0.conda#05706dd5a145a9c91861495cd435409a +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock deleted file mode 100644 index 8a9254140b..0000000000 --- a/requirements/locks/py39-linux-64.lock +++ /dev/null @@ -1,230 +0,0 @@ -# Generated by conda-lock. -# platform: linux-64 -# input_hash: 7dc84017e41dc324a4cb4b8aa9073922202e2fc0aab84005ddf213ca9fa84edd -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb -https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c -https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e -https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.1-h59595ed_0.conda#ee90e7ac57321f8782f8438bf647b75b -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.4-hf2295e7_4.conda#33c2d37e9460579b5b9a7194e5637884 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py39h3d6467e_0.conda#82f4e576cbe74921703f91d3b43c8a73 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py39hf3d152e_1.tar.bz2#adb733ec2ee669f6d010758d054da60f -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a -https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 -https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 -https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py39h7633fee_0.conda#f668e146a2ed03a4e62ffbb98b3115fb -https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d -https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda#1e865e9188204cdfb1fd2531780add88 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py39hd1e30aa_0.conda#dc0fb8e157c7caba4c98f1e1f9d2e5f4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda#b865eadcceebf641fa833ee086756e8b -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 -https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.3-pyhd8ed1ab_0.conda#26161ce50840a8b0ca8985e358fb7ba8 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f -https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39h7633fee_4.conda#b66595fbda99771266f042f42c7457be -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda#85293a042c24a08e71b7608ee66b6134 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h44dd56e_1.conda#d037c20e3da2e85f03ebd20ad480c359 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.1-pyhd8ed1ab_0.conda#2d4fb4e7199019512298f728b9f6a8b0 -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c -https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.2-pyha770c72_0.conda#61534ee57ffdf26d7b1b514d33daccc4 -https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py39h44dd56e_1.conda#90c5165691fdcb5a9f43907e32ea48b4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 -https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 -https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.15.0-pyhd8ed1ab_0.conda#1a49ca9515ef9a96edff2eea06143dc6 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/py310.yml b/requirements/py310.yml index a60bbbbccd..d81d4c0d42 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -14,11 +14,11 @@ dependencies: - cartopy >=0.21 - cf-units >=3.1 - cftime >=1.5 - - dask-core >=2022.9.0 + - dask-core >=2022.9.0,!=2024.8.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - - numpy >=1.23, !=1.24.3 + - numpy >=1.24, !=1.24.3 - python-xxhash - pyproj - scipy @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack @@ -48,7 +49,7 @@ dependencies: - requests # Documentation dependencies. - - sphinx <=5.3 + - sphinx - sphinxcontrib-apidoc - sphinx-copybutton - sphinx-gallery >=0.11.0 diff --git a/requirements/py311.yml b/requirements/py311.yml index 5e396c032e..b12c46c87f 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -14,11 +14,11 @@ dependencies: - cartopy >=0.21 - cf-units >=3.1 - cftime >=1.5 - - dask-core >=2022.9.0 + - dask-core >=2022.9.0,!=2024.8.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - - numpy >=1.23, !=1.24.3 + - numpy >=1.24, !=1.24.3 - python-xxhash - pyproj - scipy @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack @@ -48,7 +49,7 @@ dependencies: - requests # Documentation dependencies. - - sphinx <=5.3 + - sphinx - sphinxcontrib-apidoc - sphinx-copybutton - sphinx-gallery >=0.11.0 diff --git a/requirements/py39.yml b/requirements/py312.yml similarity index 85% rename from requirements/py39.yml rename to requirements/py312.yml index d4a7ee704c..74277e417f 100644 --- a/requirements/py39.yml +++ b/requirements/py312.yml @@ -4,7 +4,7 @@ channels: - conda-forge dependencies: - - python =3.9 + - python =3.12 # Setup dependencies. - setuptools >=64 @@ -14,11 +14,11 @@ dependencies: - cartopy >=0.21 - cf-units >=3.1 - cftime >=1.5 - - dask-core >=2022.9.0 + - dask-core >=2022.9.0,!=2024.8.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - - numpy >=1.23, !=1.24.3 + - numpy >=1.24, !=1.24.3 - python-xxhash - pyproj - scipy @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack @@ -42,12 +43,13 @@ dependencies: - pre-commit - psutil - pytest + - pytest-cov - pytest-mock - pytest-xdist - requests # Documentation dependencies. - - sphinx <=5.3 + - sphinx - sphinxcontrib-apidoc - sphinx-copybutton - sphinx-gallery >=0.11.0 diff --git a/requirements/pypi-core.txt b/requirements/pypi-core.txt index e6dc005883..208ef7f413 100644 --- a/requirements/pypi-core.txt +++ b/requirements/pypi-core.txt @@ -1,11 +1,11 @@ cartopy>=0.21 cf-units>=3.1 cftime>=1.5.0 -dask[array]>=2022.9.0 +dask[array]>=2022.9.0,!=2024.8.0 # libnetcdf!=4.9.1 (not available on PyPI) matplotlib>=3.5 netcdf4 -numpy>=1.23,!=1.24.3 +numpy>=1.24,!=1.24.3 pyproj scipy shapely!=1.8.3 diff --git a/setup.py b/setup.py index 28e7a003a9..c59931c775 100644 --- a/setup.py +++ b/setup.py @@ -41,7 +41,7 @@ def _build_std_names(self, directory): script_path = os.path.join("tools", "generate_std_names.py") xml_path = os.path.join("etc", "cf-standard-name-table.xml") module_path = os.path.join(directory, "iris", "std_names.py") - args = (sys.executable, script_path, xml_path, module_path) + args = [sys.executable, script_path, xml_path, module_path] self.spawn(args) def finalize_options(self): diff --git a/tools/release_do_nothing.py b/tools/release_do_nothing.py index 634e6a65a2..79f26f3409 100755 --- a/tools/release_do_nothing.py +++ b/tools/release_do_nothing.py @@ -327,7 +327,7 @@ def finalise_whats_new( message = ( "Commit and push all the What's New changes.\n" - f'git commit -am "Whats new updates for {release_strings.tag} .";\n' + f"git commit -am \"What's new updates for {release_strings.tag} .\";\n" f"git push -u origin {working_branch};" ) _wait_for_done(message) @@ -759,7 +759,7 @@ def merge_back( message = ( "Commit and push all the What's New changes.\n" - 'git commit -am "Restore latest Whats New files.";\n' + "git commit -am \"Restore latest What's New files.\";\n" f"git push -u origin {working_branch};" ) _wait_for_done(message)